amp@java

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  99 随笔 :: 0 文章 :: 228 评论 :: 0 Trackbacks

#

from http://forum.java.sun.com/thread.jspa?threadID=628910&messageID=3618808
hello,

first time i want to excuse my english language ( i love spanish :P );

i pass a whole morning to found the solution: How to go to page 1 in a DataScroller ( tomahawk component ) when we execute a filter ?¿

we need to binding the component instance in the backing bean ( manage bean )

JSP PAGE :
<t:dataScroller .... .... binding="MB.scroll" />

MANAGE BEAN:
private HTMLDataScroller scroll = null;

....
....
getScroll....
setScroll...

ok, now we have the same instance of an object in "front" and "back".
in my case, when a execute a filter i call the method executeFilter()

public void executeFilter(){
...
...
// this is the function for returning to page 1 in a dataScroller
scroll.getUIDate.setFirst(0)
...
...
}

I Hope that can help every JSF crazy programmer :P

bye...
posted @ 2006-06-14 09:37 amp@java 阅读(2300) | 评论 (0)编辑 收藏

在网页中使用树是一件很费资源的事情,但由于它使用起来很直观,所以在很多应用中还是要使用到树。建立树有三种方法:
1、一开始就把整棵树,包括最底层的叶子(即使没有展开)都读到客户端。那样点击时的速度会很快,但建立这棵树的时间会很长,甚至会把浏览器弄死,而且会造成很多不必要的流量;
2、树的当前状态保存在服务器端,点击一层更新整棵树,但没有展开的部分不显示,这样每点一次都要把整棵树的当前状态下载下来,速度比较慢,服务器的负担也比较重,但不用把整棵树的所有层次一次下载下来,对层次比较多的树来说能节约很大的流量;
3、开始时只下载顶层,点击一层更新一层,把树的状态保存在客户端。这种树综合了上述两种方法的好处,既保证了速度,又节约了流量。xloadtree就是这种。

xloadtree主页:http://webfx.eae.net/dhtml/xloadtree/xloadtree.html

用法:
很简单,只要记住树的每一层都可以用xml文件来表示,只要在服务器端生成每层的xml文件即可,那些xml文件并不是一开始就生成的,而是在请求的时候再生成。由于xml文件十分简单,只有一个元素<tree>,所以用servlet来生成也很方便。仅仅使用一个servlet就可以生成所有层次的xml文件,只要给它传递不同的参数即可。
详细的用法可以查看主页上的文档:http://webfx.eae.net/dhtml/xloadtree/usage.html
还可以把文件下载下来之后查看里面的文档和demo:http://webfx.eae.net/download/xloadtree111.zip

相关网页:
xloadtree的大bug        http://blog.csdn.net/sino_reason/archive/2004/08/13/73648.aspx
分析xloadtree, 用ajax实现的动态目录树 http://www.blogjava.net/nickey/archive/2005/11/13/19606.html

posted @ 2006-06-07 10:30 amp@java 阅读(5230) | 评论 (1)编辑 收藏

以NOKIA8250为例。通过8250的红外与PC连接之后,会产生一个虚拟串口,这个串口的序号可能在每台电脑上都不一样。利用这个串口,就可以对手机进行一系列操作,包括发送、接收短信。通过程序操作串口,就可以把这部手机做成短信平台。
在Windows中,打开超级终端,在手机未连接之前,查看连接可使用的串口列表,然后连接手机,再查看列表,多出来的那个串口就是与手机通信的串口。通过该串口连接手机,就可以用AT指令来操作它。
输入AT回车,出现OK,就说明这个串口是支持AT指令的,有可能是手机,也有可能是普通的MODEM。
输入AT+CGMI回车,出现手机厂商信息,例如NOKIA,就说明这是手机,下面就可以进行一系列的操作了。
AT指令有几个实用的规则:
1.输入AT指令然后加“?”,就能列出该指令的当前状态,例如输入AT+CSCS?,就能列出当前手机使用的字符集,例如:+CSCS: "PCCP437"。
2.输入AT指令然后加“=?”,就能列出该指令的可选值,也就是手机所能支持的所有值,例如输入AT+CSCS=?,就能列出手机能支持的所有字符集,例如:+CSCS: ("GSM","HEX","IRA","PCCP437","PCDN","8859-1"),可以通过AT+CSCS="HEX"来设置手机的字符集为HEX。


短信内容的格式有两种,一种是text,一种是PDU,text格式比较简单,但不能发送特殊的短信,例如免提短信,发送中文短信也会乱码。PDU格式则可以发送各种形式(免提,闪烁)和字符集的短信,不过PDU不够直观,需要通过程序来编码解码,例如发送到8613000000000的短信“中文信息”的PDU编码为:0011000D91683100000000F00008A70C4E2D65874FE1606F000D000A,其长度为27。在PDU格式下,短信内容还包含了目标号码,而在text格式下,目标号码和短信内容是分开的。锐方超级SMS控件是一个很好的PDU编解码控件。

与短信相关的AT指令:

AT 指令 功 能
AT+CMGC Send an SMS command(发出一条短消息命令)
AT+CMGD Delete SMS message(删除SIM卡内存的短消息)
AT+CMGF Select SMS message formate(选择短消息信息格式:0-PDU;1-文本)
AT+CMGL List SMS message from preferred store(列出SIM卡中的短消息,在PDU模式下,该值为数字,在text模式下,该值为字符串。PDU/text:0/"REC UNREAD"-未读,1/"REC READ"-已读,2/"STO UNSENT"-待发,3/"STO SENT"-已发,4/"ALL"-全部的)
AT+CMGR Read SMS message(读短消息)
AT+CMGS Send SMS message(发送短消息。在PDU格式下,该值设置为PDU长度,例如30;在Text格式下,该值设置为目标手机号码字符串,例如"8613888888888"。注意,在PDU模式下,手机号码需要加上86开头,否则不能发送。)
AT+CMGW Write SMS message to memory(向SIM内存中写入待发的短消息)
AT+CMSS Send SMS message from storage(从SIN|M内存中发送短消息)
AT+CNMI New SMS message indications(设置是否显示新收到的短信,一般设成2,1,0,0,0,手机收到新的短信后会给PC发一条消息,包含了该短信在内存中的索引号,通过该索引号就可以读出该短信)
AT+CPMS Preferred SMS message storage(选择短消息内存)
AT+CSCA SMS service center address(短消息中心地址)
AT+CSCB Select cell broadcast messages(选择蜂窝广播消息)
AT+CSMP Set SMS text mode parameters(设置短消息文本模式参数)
AT+CSMS Select Message Service(选择短消息服务)

知道这些之后,就可以通过编程来操作手机。在java中,利用Java Communication包可以操作串口,但官方的包在3.0之后就支持Linux和Solaris平台了,Windows平台的只支持到2.0,98年出的,不过在XP下还能使用,google一下就可以下载到,例如:http://mdubuc.freeshell.org/Jolt/javacomm20-win32.zip。也可以用开源的Rxtx实现串口通信。
如果不想直接操作AT指令,还可以使用开源的SMSLib包,该包封装了与短信相关的所有AT指令,也实现了PDU编解码功能,使用起来十分方便。
posted @ 2006-05-19 09:28 amp@java 阅读(3469) | 评论 (2)编辑 收藏

当初看上JSF,是因为看中了几个好处:
1、获取或显示表单数据时用相同的EL即可,JSF之前的EL只能get不能set;
2、MyFaces实现里面有很多很“炫”的组件,例如下拉菜单,树型控件,日期选择控件等等,使用极其方便。
于是就在一个小项目中使用JSF开发,用着就发现其实这个东西也带来了很多比以前更麻烦的地方,就拿很常见的数据库操作——查询、修改、插入、删除来说明使用JSF来实现有什么麻烦:
1、查询。对于小数据量,用一个dataTable就什么都搞定了。可是大数据量分页就比较麻烦了,因为dataTable的分页是把所有数据都取出来然后再一页页显示,而大数据量下一般是要看哪一页就取哪一页。网上有个通用的分页存储过程,只要把一系列参数(页码,排序依据,每页大小等)传给它,就能获得某一页的数据。如果直接通过URL来传递那些参数,服务器根据参数来调用存储过程,是很方便的事情。可是JSF却不通过URL来传递参数了,整个页面处理的过程也比较复杂,没有以前那样直观。有人改了一下dataModel的实现方式,使它每次只取一页的数据,效果是达到了,但要跳到某一页,却只能点链接,不能通过输入URL来到达了(也就是不能把某一页添加到收藏夹里了)。
这两天做了一些试验,在jsf里还是可以通过URL传递参数的,在Backing Bean里可以通过ValueBinding的getValue取得URL参数,然后根据参数来从数据库中取得相应的内容,生成某个对象的bean,再在页面上显示出来。不过这样一来,似乎就跟servlet差不多了。
如果可以通过配置来设定表单提交是get方式还是post方式就好了。可是目前一律只能post,这样造成的后果除了不能收藏,不能刷新(会提示是否重新提交数据)之外,还会使浏览器的后退功能失效。

2、修改。在datatable中把数据显示出来后,可以每一行加一个commanButton,在它的action method中调用dataModel的getRowData()方法来得到该行的数据,把数据保存在一个request范围的bean里面,再转向到另一个页面通过可编辑表单来显示该bean的内容,在那里就可以修改、提交了。由于是使用了forward方式转向,所以url显示的页面还是数据显示的那个页面,只要一刷新,就又回到数据显示那一页而不是修改那一页了;如果不想修改,按一下浏览器的后退按钮,虽然回到了数据显示的那一页,但上面的commandButton已经失效,例如点击修改按钮,没有任何反应,必须把那一页刷新一下再点才有效。
为了解决这个问题,我采用了URL传递参数的方法。通过在URL中指定ID来说明要修改的是哪个对象,在修改页面的backing bean的构造函数中,读取URL参数来获得ID,然后通过查询数据库得到该对象的其他内容,再显示在页面上。这样就可以刷新,可以后退。

3、新增。新增跟修改可以用同一个页面来显示,只是commandButton对应不同的action method,例如“修改”按钮对应的是update,“新增”按钮对应的是create,在两个method里分别使用数据库的update语句和insert语句即可。新增的时候是没有ID的,修改的时候则已经有了ID。

4、删除。在显示数据的dataTable里,每行可以添加一个commandButton,在它的action method里,读取该行数据,得到ID后执行SQL的DELETE语句即可,比较简单。

无论是做什么,都离不开三个东西:页面,配置文件,Backing Bean。页面是表现层的东西,负责把页面上的东西与Backing Bean联系起来。配置文件则指定在页面上使用的Backing Bean的名字、类、使用范围,还有导航规则(Navigation Rules)。Backing Bean就是程序的逻辑部分了。即使实现最简单的功能,例如显示某个变量的值,这三个东西都是必不可少的。
修改页面的时候,虽然不用重启服务器,但必须在新的session里才能看出效果来,最简单的办法就是把浏览器关掉,打开一个新的,查看结果。修改了配置文件和backing bean 就必须重启服务器了。所以调试JSF是很麻烦的。
posted @ 2006-04-08 01:08 amp@java 阅读(863) | 评论 (1)编辑 收藏

否则会带来很多莫名其妙的问题。
如果在开发过程中发现有奇怪的问题,首先要检查在页面中引用的Backing Bean是否已经在配置文件中定义!
posted @ 2006-04-08 00:43 amp@java 阅读(941) | 评论 (2)编辑 收藏

在SWT中,通常需要开多个线程来执行任务,因为主线程为UI线程,不能用太长的时间来执行某个任务,否则会造成失去响应的假象。
SWT的线程通信有几个要注意的地方:
1、工作线程访问UI线程。不能在非UI线程中直接访问UI控件的值,要获得或设置控件的值必须通过Display对象的asyncExec()或syncExec()函数,一般的使用方法是:

//代码A:
 
Display disp  
=   Display.getDefault();
 
if  (disp  !=   null  )  {
   disp.asyncExec(
    
new   Runnable()  {
    
public    void   run()  {
       
//  在这里设置或获得控件的值 
 } 

); 

2、内部类与外部类的交流。内部类调用外部类局部变量时,该变量必须是final的,这样在取得控件的值后返回给外部类处理时就比较麻烦。例如,在上面的代码段中,有个匿名内部类实现了Runnable接口,在里面的run()函数里可以访问到UI对象,但是,得到了对象的值怎么告诉外面的代码呢?假如用普通的局部变量传递进去,由于是final的,是不能赋值的,所以需要有一个封装类来把需要返回的变量封装起来,这个封装类是final的,但里面的成员变量是可变的,这样就把内部类里得到的东西传递到了外部,不过似乎比较麻烦,不知道有没有更好的办法。
//代码B:

class
 StringWrapper {
   public String uiValue;
}
StringWrapper sw 
= new StringWrapper(); 
Display disp  
=  Display.getDefault();
 
if (disp != null )  {
   disp.asyncExec(
    
new  Runnable()  {
    
public  void  run()  {
        sw.uiValue 
= text.getText();//假设text是一个文本框对象
       
// 在这里设置或获得控件的值 
    } 
   } 
   ); 

//这里就可以对sw.uiValue的值进行访问
3、线程间的同步。在上面的代码B中,通过asyncExec()函数来取得控件的值所需要的时间比较长,如果在后面马上访问那些值是得不到的,于是就需要有个同步的问题,即在控件值取得之前先不进行下一步操作。可以通过synchronized块及wait(),notify()机制来实现同步。

//代码C:

class StringWrapper {
   
public String uiValue;
}
StringWrapper sw 
= new StringWrapper(); 
Display disp  
=  Display.getDefault();
 
if (disp != null )  {
   disp.asyncExec(
    
new  Runnable()  {
    
public  void  run()  {
        
synchronized(sw){
          sw.uiValue 
= text.getText();//假设text是一个文本框对象
            sw.notify();
         }
       
// 在这里设置或获得控件的值
 
    } 
   } 
   ); 
}
synchronized(sw){
  sw.wait();

//这里就可以对sw.uiValue的值进行访问

但是这里会带来一个问题,假如很快就能取得控件的值,但后面还有很长一段时间才会用到该值,如果把sw.wait()语句放在比较后的地方,就有可能造成死锁,因为sw已经被notify之后才开始wait的,再没有其他线程来notify它了,它就只能一直wait下去……。为了解决这个问题,可以(1)把sw.wait()紧跟在disp.asyncExec()后面;(2)给wait()设置一个timeout参数,到了一定的时间还没有东西notify它,它就自己超时。但这两种办法似乎都比较牵强,没有十足的保证,JDK文档里面有个例子,是用while来判断是否已经达到了要求,如果已经达到了就不再wait。
//代码D:

class StringWrapper {
   
public String uiValue;
   
public boolean isValueSet;//是否已经取得了控件的值
}
StringWrapper sw 
= new StringWrapper(); 
sw.isValueSet 
= false;
Display disp  
=  Display.getDefault();
 
if (disp != null )  {
   disp.asyncExec(
    
new  Runnable()  {
    
public  void  run()  {
        
synchronized(sw){
          sw.uiValue 
= text.getText();//假设text是一个文本框对象
            sw.isValueSet = true;
            sw.notify();
         }
       // 在这里设置或获得控件的值

 
    } 
   } 
   ); 
}
synchronized(sw){
  
while(!sw.isValueSet){
    
try{
      sw.wait();
    }
catch (InterruptedException e){
    }
  }

//这里就可以对sw.uiValue的值进行访问


posted @ 2006-03-27 17:29 amp@java 阅读(996) | 评论 (0)编辑 收藏

本来想在手机上开发一个短信加密发送/接收程序的,看了几天J2ME,发现限制很多,几乎无法实现。
短信发送是可以的,只要手机能提供WMA的API;但接收的话要注册监听端口,短信必须发到这个端口才能被程序监听到,然而,在J2ME之外,似乎没有短信端口这个概念,所以其他手机要往这个端口发短信都不知道如何操作。
不同的手机对J2ME的支持相差太多了,一个简单的发送程序,在NOKIA3230上可以运行,在QD上就不行,而且是莫名其妙地打开了一个空白窗口,什么选项都看不见,按什么键都没反应,都不知出了什么问题。

posted @ 2006-03-25 01:42 amp@java 阅读(294) | 评论 (0)编辑 收藏

使用
sp_OACreate
sp_OADestroy
sp_OAGetProperty
sp_OASetProperty
sp_OAMethod

等系统存储过程。
posted @ 2006-03-23 10:25 amp@java 阅读(495) | 评论 (0)编辑 收藏

使用OPENDATASOURCE函数,该函数的详细使用方法可以在帮助中找到。

例子:
SELECT * FROM
OPENDATASOURCE(
   
'SQLOLEDB',
   
'Data Source=ServerName;User ID=MyUID;Password=MyPass'
).Northwind.dbo.Categories
posted @ 2006-03-23 10:20 amp@java 阅读(414) | 评论 (0)编辑 收藏

    英文原文链接:http://today.java.net/pub/a/today/2006/02/09/file-uploads-with-ajax-and-jsf.html

    Translated by amplifier

    基于浏览器的文件上传,特别是那些通过调用HTML标签<input type="file">来实现的文件上传,总是有很大的缺陷。大家都知道,上传一个大于10MB的文件会导致非常糟糕的用户体验。当用户提交表单上传文件后,浏览器在把文件上传到服务器的过程中就会表现得像失去响应一样。当这个过程在后台进行中的时候,很多不耐烦的用户就会以为服务器挂掉了,于是就尝试重新提交表单,这样一来就更糟糕了。

    为了使文件上传的用户界面更友好,很多网站采用显示不确定的进度动画(例如一个翻转的图标)来提示用户已提交文件。虽然这种技术会让用户觉得好受一点,但它只提供了极少与文件上传状态相关的信息。另外一种尝试是通过实现一个applet来把文件上传到FTP服务器上,这种方法的缺点是它只对有java的浏览器可用。

   在本文,我们将会使用一种新的方法,通过实现一个使用AJAX技术的组件来达到目的,该组件不仅仅把文件上传到服务器,还“实时”监控文件上传的实际进度。该组件的四个状态如图1,2,3,4所示:

Stage 1: Selecting the file upload
图1. 阶段1:选择要上传的文件
Stage 2: Uploading the file to the server
图2.阶段2:上传中

Stage 3: Uploaded completed.
图3.阶段3:上传完毕

File Upload Summary
图4.文件上传概要

(未完待续)
 

posted @ 2006-03-19 21:05 amp@java 阅读(448) | 评论 (0)编辑 收藏

仅列出标题
共10页: First 上一页 2 3 4 5 6 7 8 9 10 下一页