DWR学习札记(五)
六.DWR中的JavaScript简介:回调函数的声明方式、查找回调函数的原则、创建与java对象匹配的js对象
1.简单说明:DWR根据dwr.xml生成和Java代码类似的Javascript代码。
DWR通过引入回调函数来解决这个问题,当请求结果被返回后,DWR会调用这个回调函数。
2.回调函数的声明方式:有两种,一是可以把回调函数放在参数列表里;一是可以把回调函数放到元数据对象里。
(1)参数列表的回调函数(前边一直用的方式)
例子:
A.生成一个java对象
public class Remote{
public String getData(int index){
.........
}
}
B.通过DWR调用
<script type="text/javascript">
//handleGetData就是回调函数的方法名
Remote.getData(42, handleGetData);
//声明回调函数
function handleGetData(data){
alert(data);
}
</script>
C.也可以将B中的回调函数写成缩写
<script type="text/javascript">
//handleGetData就是回调函数的方法名
Remote.getData(
42,
//匿名回调函数
function(data){
alert(data);
}
);
</script>
(2)元数据对象中的回调函数(推荐使用):这种方式较为规范
例子:任然使用上面的java类Remote类。只是将DWR的js调用做一下更改
Remote.getData(
42,
//定义元数据对象,其中字符串callback是匿名对象的属性,
//而function(data){alert(data);}是callback的属性值。
{
callback:function(data){
alert(data);
}
}
//这里将匿名对象作为了最后一个参数值,匿名对象中存有回调函数,
//这样DWR就可以通过找到callback,得到它的值,并作为回调函数。
);
**说明:通过这种调用元数据对象中的回调函数的好处就是可以指定额外的调用选项。
例子:
Remote.getData(
42,
//元数据对象,内部有多个属性及对应的属性值
{
//回调函数,注意函数仍然是匿名函数
callback:function(data){alert(data);},
//在回调函数的元数据对象中可以指定超时和错误的处理方式
timeout:5000,
errorHandler:function(message){alert("Oops: " + message);}
}
);
3.查找回调函数的原则:我们通过js调用java对象的方法时指定了回调函数,
那么DWR是怎样识别回调函数的呢?为什么它能准确的调用到回调函数。
那是因为DWR通过js调用java对象的方法是传入的回调函数的位置是有规定的
(如:一般最后一个参数用于指定回调函数)
A.如果第一个(针对java对象方法不接收参数的情况)或最后一个参数是一个函数,那么它就是回调函数,其他参数都是Java的方法参数。
B.如果最后一个参数是一个对象,这个对象中有一个"callback"属性(经过验证必须用callback字符串作为属性名,否则不起作用),
并且它是个函数,那么这个对象就是元数据对象,它将作为回调函数的拥有者,其他参数都是Java方法参数。
C.如果第一个参数是null ,我们就假设没有回调函数,其他的都是Java方法参数。
尽管如此,我们会检查最后一个参数是不是null,如果是就发出警告。不是那就正常!
D.如果最后一个参数是null,那么就没有callback函数。
4.创建与java对象匹配的js对象:就是通过创建js对象,
然后通过js调用java对象方法的时候为方法传递参数(主要指Bean对象参数)
A.产生javaBean对象
public Person{
private String name;
private int age;
private Date[] appointments;
getters and setters ...
}
B.生成要用js调用的java类
public class Remote{
private Person person;
public void setPerson(Person p){
this.person = p;
}
}
C.通过js构造Bean参数然后调用方法(此时将涉及到转换,要开启对bean的转换器BeanConverter的支持)
var p = {
//name属性赋值
name:"Fred Bloggs",
//age属性赋值
age:42,
//appointments数组属性赋值
appointments:[ new Date(), new Date("1 Jan 2008") ]
};
//DWR调用java对象方法,传入Bean对象参数值
Remote.setPerson(p);
**注意:这里不用注册回调函数,因为setPerson()方法返回void,即没有返回值,所以不需要回调函数处理返回结果。
当然如果非要注册回调函数也没有问题,只不过回调函数中将不会接收到任何返回数据。