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>  
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章