DWR的转换器

DWR默认提供了一些类型转换器(boolean、byte、short、int、long、float、
double、char、java.lang.Boolean、java.lang.Byte、java.lang.Short、java.lang.Integer、
java.lang.Float、java.lang.Double、java.lang.Character、java.math.BigInteger、
java.math.BigDecimal、java.lang.String)
即如果定义的java类中有方法参数或返回值为这些类型则无需在dwr.xm中的<convert../>元素配置.
  如果定义的java类中有方法的参数不是上述类型,为复合类型或数组或集合类型,则需要在dwr.xml中的<convert../>中配置.

1.对于方法返回或参数类型为复合类型,DWR提供了Bean转换器和Object转换器,但它们默认关闭,即在使用时必须打开:
	<convert match="com.wang.Person" converter="bean"/>
	<convert match="com.wang.Person" converter="object">
             <!--通过force参数指定可以访问对象的私有属性-->
             <param name="force" value="true"/>
        </convert>
 要同时使用bean转换器转换某个包下的所有类:
<convert match="com.wang.*" converter="bean"/>
 要使用bean转换器转换所有类:
<convert match="*" converter="bean"/>
 object转换器也支持上述方式.

bean转换器和object转换器的不同之处在于,bean转换器要求要转换的属性类必须符合JavaBean规范
即bean转换器是通过setter和getter方法来访问属性),而object没有上述要求(object转换器使用反射来访问属性)

例如:
 对于方法:
public String sendObj(Person p)
{
	return p.getName()+",您好,这是一个JavaBean参数的方法";
}
 1.使用bean转换器:
<convert match="com.wang.Person" converter="bean"/>
 则Person类必须符合javaBean规范:
package com.wang;
public class Person
{
	private String name;
        private int age;
	public Person(){}
	public Person(String name,int age)
	{
		this.name = name;
                this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge()
        {
                return age;
        }
        public void setAge(int age)
        {
                this.age = age;
        }
}
 2.使用object转换器:
	<convert match="com.wang.Person" converter="object">
              <param name="force" value="true"/>
        </convert>
 Person无需符合javaBean规范:
package com.wang;

public class Person
{
	private String name;
	public Person(){}
	public Person(String name,int age)
	{
		this.name = name;
                this.age = age;
	}
	
}
 默认情况生成的javascript对象包含所有属性,当使用javascript调用sendObj(Person p)方法使用json格式:
 hello.sendObj(
		 {name:'wang',
		  age:23},cb);
 其中cb为回调函数.
对于这个例子age属性完全没有用到,如果要使生成的javascript对象只是需要的,屏蔽某些属性有两种方式:
(1)白名单方式:
<convert conterter="bean" match="com.wang.ajax.entity.Person">
	<param name="include" value="property1,property2..."/>
</convert>
  对于本例:
<convert match="com.wang.Person" converter="bean">
	<param name="include" value="name"/>
</convert>
 (2)黑名单方式:
<convert conterter="bean" match="com.wang.ajax.entity.Person">
	<param name="exclude" value="property1,property2..."/>
</convert>
 对于本例:
<convert match="com.wang.Person" converter="bean">
	<param name="exclude" value="age"/>
</convert>
 
2.DWR默认打开数组转换器,即参数或返回值为数组时不需再dwr.xml中配置
  返回值为数组时:
//data为返回值
for(var i = 0 ;i<data.length;i++)
{
    result+=data[i].name;
}
  参数为数组时:
var args=[
{name:"aaaa"},
{name:"bbbb"}
]
//cb为回调函数
methodA(args,cb);
 3.DWR默认提供了两个集合转换器Map和Collection对象,无需显式配置
 如果需要显式配置:
<convert match="java.util.Collection" converter="collection"/>
<convert match="java.util.Map" converter="map"/>
  DWR支持Collection放Map,也可Map放Collection.
 (1)如果集合不使用泛型,DWR无法确定集合元素的类型(可以在dwr.xml中<signatures.../>来声明集合元素数据类型)
 (2)不能明确指定集合的类型,只能使用基于接口的类型转换
 参数是集合使用泛型:
public String sendList(List<Person> p1)
{
	String result = "";
	for(Person p : p1)
	{
		result += p.getName()+"<br/>";
	}
	return result;
}
 javascript客户端调用时执行传入一个集合参数即可
 参数是集合不使用泛型:
public String sendListNoGeneric(List p1)
{
	String result = "";
	for(Object p : p1)
	{
	result += ((Person)p).getName()+"<br/>";
	}
	return result;
}
  需要在dwr.xml中:
<signatures>  
    <!--DWR默认会导入java.lang.*下的所有类-->
    <![CDATA[ 
    import java.util.List; 
    import dwr.HelloDwr; 
    import dwr.Person; 
    HelloDwr.sendListNoGeneric(List<Person>); 
    ]]>  
</signatures>  
 

猜你喜欢

转载自betterthisworld.iteye.com/blog/2074586