dwr处理关联对象
<!--l version="1.0" encoding="UTF-8--><!--CTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dt-->
看了上面XML的配置,大家一定可以看明白如何配置DWR,现在具体的讲讲. 这部分是可选配置的,所以在上面的配置文件中没有,声明那些用于建立远程bean和在方法调用中转换bean的类.多数情况下可以不必使用它,如果你想定义一个新的creator或者converter那么就必须在这部分中声明,具体的可以查看dwr.jar中的dwr.xml是如何配置的,或者到它的官网看看! 1. allow段落里面定义的是DWR可以创建和转换的类。 2.Creators dwr.xml文件中的create元素的结构如下: ... 这里的多数元素都是可选的 - 你真正必须知道的是指定一个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的配置相对来说比较复杂,对于单例类很适用: import org.apache.commons.validator.EmailValidator; return EmailValidator.getInstance(); auth元素 允许你指定一个J2EE的角色作为将来的访问控制检查: include和exclude元素 允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗示默认的访问策略是"拒绝";如果是exclude列表则暗示默认的访问策略是"允许"。例如只想访问addMessage()方法,你应该把如下内容添加到dwr.xml中。 如果有多个,就写多行。 3.Converters 类型转换器,转换器可以把POJO转换成Javascript的接合数组(类似与Java中的Map),或者反向转换。 JDK中的多数类型已经有转换器了,一般来说JavaBean的参数需要一个定义。 具体的结构如: 默认情况下,如下类型不需要定义就可以转换: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.*,但我并不推荐大家这样使用。为什么呢?如果你像前面那样一个一个地注册对象,则就可以在页面使用这个的语句初始化一个对象: varuser = new User(); 如果你使用后一种方法去批量注册对象,那么你就不能这样初始化这个对象而只能这样手动注册: Varuser = {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属性,避免产生死循环。具体写法如下: value部分是需要转换的属性,如果有多个则用逗号隔开就可以了! 4.(Signatures) Signatures:dwr.xml中的签名,DWR使用反射来找出在转换时应该用那种类型。有时类型信息并不明确,signatures段使DWR能确定集合中存放的数据类型。对于list,map等集合有效。 signatures段允许我们暗示DWR应该用什么类型去处理。格式对以了解JDK5的泛型的人来说很容易理解。
<!--DATA[import java.util.List;import com.example.Check;Check.setLotteryResults(List<Integ-->nos); ]]> DWR中又一个解析器专门来做这件事,所以即便你的环境时JDK1.3 DWR也能正常工作。 解析规则基本上会和你预想规则的一样(有两个例外),所以java.lang下面的类型会被默认import。 第一个是DWR1.0中解析器的bug,某些环境下不能 (本内容来自唯才教育网http://www.hn1c.com 原文地址:http://www.hn1c.com/diannao/dn53397/)