DWR详解

看了上面XML的配置,大家一定可以看明白如何配置DWR,现在具体的讲讲.

<init>

    <creator id="..." class="..."/>

    <converter id="..." class="..."/>

 </init>

这部分是可选配置的,所以在上面的配置文件中没有,声明那些用于建立远程bean和在方法调用中转换bean的类.多数情况下可以不必使用它,如果你想定义一个新的creator或者converter那么就必须在这部分中声明,具体的可以查看dwr.jar中的dwr.xml是如何配置的,或者到它的官网看看!

1.<allow>

allow段落里面定义的是DWR可以创建和转换的类。

2.Creators

dwr.xml文件中的create元素的结构如下:

<allow> <create creator="..." javascript="..." scope="..."> <param name="..." value="..."/> <auth method="..." role="..."/> <exclude method="..."/> <include method="..."/> </create> ... </allow>

这里的多数元素都是可选的 - 你真正必须知道的是指定一个creator和一个javascript名字。

creator是用来指定使用那种创造器,

DWR1.1有八种创造器。它们是:

  • new: 用Java的new关键字创造对象。
  • none: 它不创建对象
  • scripted: 通过BSF使用脚本语言创建对象,例如BeanShell或Groovy。
  • spring: 通过Spring框架访问Bean。
  • jsf: 使用JSF的Bean。 (v1.1+)
  • struts: 使用Struts的FormBean。 (v1.1+)
  • pageflow: 访问Beehive或Weblogic的PageFlow。 (v1.1+)     
  • ejb3  

 

如果你需要写自己的创造器,你必须在init部分注册它。none 创造器不创建任何对象, 它会假设你不需要创建对象。有两种情况:可能在使用的scope不是"page",并在在前面已经把这个对象创建到这个scope中了,这时你就不需要再创建对象了。还有一种情况是要调用的方法是静态的,这时也不需要创建对象。DWR会在调用创建器之前先检查一下这个方法是不是静态的。

 

javascript属性 用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascript的关键字。

scope属性 可选,非常类似servlet规范中的scope。它允许你指定这个bean在什么生命范围。选项有"application", "session", "request" 和"page"。默认是page.

 

param元素 被用来指定创造器的其他参数,每种构造器各有不同。在上面的dwr.xml中显示了spring的配制

          方法,而在 简单部署DWR 中有new的配置方法!struts和jsf的配置如下:

scripted的配置相对来说比较复杂,对于单例类很适用:

auth元素 允许你指定一个J2EE的角色作为将来的访问控制检查:

<create creator="new" javascript="Test">

  <param name="class" value="dwr.test.Test"/>

  <auth method="setWibble" role="admin"/>

</create>

 

include和exclude元素 允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗示默认的访问策略是"拒绝";如果是exclude列表则暗示默认的访问策略是"允许"。例如只想访问addMessage()方法,你应该把如下内容添加到dwr.xml中。

<create creator="new" javascript="test">

<param name="class" value="dwr.test.Test"/>

<include method="addMessage"/>

</create>

如果有多个,就写多行。

 

 3.Converters

类型转换器,转换器可以把POJO转换成Javascript的接合数组(类似与Java中的Map),或者反向转换。

JDK中的多数类型已经有转换器了,一般来说JavaBean的参数需要一个<convert ...>定义。

具体的结构如:

  <convert match="com.htxx.demo.datasource1.model.Department"    

     javascript="Department" converter="hibernate3"/>  

默认情况下,如下类型不需要定义就可以转换:boolean, byte, short, int, long, float, double, char, java.lang.Boolean, java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double, java.lang.Character, java.math.BigInteger, java.math.BigDecimal 和 java.lang.String.具体的你可以打开dwr.jar,在org.directwebremoting包中找到一个dwr.xml的文件,后半部分以convert为标签的都是。在这些基础转换器中,特别要提的是Date转换器,它负责在Javascript的Date类型与Java中的Date类型(java.util.Date, java.sql.Date, java.sql.Times or java.sql.Timestamp)之间进行转换。如果你有一个Javascript的字符串 (例如"01 Jan 2010") ,你想把它转换成Java的Date类型有两个办法:在javascript中用Date.parse()把它解析成Date类型,然后用DWR的DateConverter传递给服务器;或者把它作为字符串传递给Server,再用Java中的SimpleDateFormat(或者类似的)来解析。同样,如果你有个Java的Date类型并且希望在HTML使用它。你可以先用SimpleDateFormat把它转换成字符串再使用。也可以直接传Date给Javascript,然后用Javascript格式化。第一种方式简单一些,尽管浪费了你的转换器,而且这样做也会是浏览器上的显示逻辑受到限制。

 

match是用于告诉DWR你将需要把java中的哪些类转换成js。你也可以写成dwr.test.*,但我并不推荐大家这样使用。为什么呢?如果你像前面那样一个一个地注册对象,则就可以在页面使用这个的语句初始化一个对象:

var user = new User();

如果你使用后一种方法去批量注册对象,那么你就不能这样初始化这个对象而只能这样手动注册:

Var user = {userid:"", username:null, ……}; 

Javascript用于说明你在页面中使用这个对象的名称,强烈建议大家使用首字母大写,在JS中容易看出这是一个与后台对应的对象。

Converter用于告诉DWR用什么DWR的类来执行转换,常用的转换器有bean、object、hibernate2、hibernate3等。DWR有哪些转换器可以在dwr.jar的dwr.xml中找到。用bean转换器对于转换一些简单的javabean(属性是基础对象)的比较适合,因为DWR会将该值对象的所有属性,及其这些属性的所有属性,所有属性的属性,都以穷举的方式取出来,如果是复杂对象会有效率上的问题以及其他意外的问题。如果使用了项目中使用了hibernate那么选择hibernate3比较好,因为它不但能够很好的解决bean转换中的问题,还解决了延迟查询的问题,而且hibernate2还有其它的问题,比如容易取到空Bean!

另外一个需要提的是,与creator一样,转换器也可以一样地设置exclude和include参数。但是与creator不同的是,是指转换对象的时候需要转换或不转换某些属性。这个参数对于hibernate的一对一关联非常重要。在hibernate中一对一关联是不做延迟查询的,假如有一个值对象Employee与值对象Address是一对一关联,那么Employee中有Address的属性,而Address中有Employee的属性。由于一对一关联不做延迟查询,当DWR在转换一个Employee是会装载它的属性Address,然后在装载Address的时候,又会去装载Address中的Employee属性。如此这样,就会形成一个死循环,最后以堆栈溢出告终。解决这个问题的办法就是禁掉Address中的Employee属性,避免产生死循环。具体写法如下:

<convert match="dwr.test.Address" javascript="Address" converter="hibernate3">  

    <param name="exclude" value="employee"/>  

</convert>  

value部分是需要转换的属性,如果有多个则用逗号隔开就可以了!

 

4.(Signatures)

Signatures:dwr.xml中的签名,DWR使用反射来找出在转换时应该用那种类型。有时类型信息并不明确,signatures段使DWR能确定集合中存放的数据类型。对于list,map等集合有效。

signatures段允许我们暗示DWR应该用什么类型去处理。格式对以了解JDK5的泛型的人来说很容易理解。<signatures>

  <![CDATA[

  import java.util.List;

  import com.example.Check;

  Check.setLotteryResults(List<Integer> nos);

  ]]>

</signatures>

DWR中又一个解析器专门来做这件事,所以即便你的环境时JDK1.3 DWR也能正常工作。

解析规则基本上会和你预想规则的一样(有两个例外),所以java.lang下面的类型会被默认import。

第一个是DWR1.0中解析器的bug,某些环境下不能返回正确类型。所以你也不用管它了。

第二个是这个解析器时"阳光(sunny day)"解析器。就是说它非常宽松,不想编译器那样严格的保证你一定正确。所以有时它也会允许你丢失import:

<signatures> <![CDATA[ import java.util.List; Check.setLotteryResults(List<Integer>); ]]> </signatures>

将来的DWR版本会使用一个更正式的解析器,这个编译器会基于官方Java定义,所以你最好不要使用太多这个不严格的东西。

signatures段只是用来确定泛型参数中的类型参数。DWR会自己使用反射机制或者运行时类型确定类型,或者假设它是一个String类型。所以:

不需要signatures - 没有泛型参数:

public void method(String p); public void method(String[] p);

需要signatures - DWR不能通过反射确定:

public void method(List<Date> p); public void method(Map<String, WibbleBean> p);

不需要signatures - DWR能正确的猜出:

public void method(List<String> p); public void method(Map<String, String> p);

不需要signatures - DWR可以通过运行时类型确定:

public List<Date> method(String p);

没有必要让Javascript中的所有对象的key都是String类型 - 你可以使用其他类型作为key。但是他们在使用之前会被转换成String类型。DWR1.x用Javascript的特性把key转换成String。DWR2.0可能会用toString()方法,在服务段进行这一转换。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值