一、 简单的说说dwr.xml的配置文件、dwr.xml的大致如下【实例】:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd"> <dwr> <init> <converter id="..." class="..."/> <creator id="..." class="..."/> </init> <allow> <convert match="com.aokunsang.dwr.bean.PersonBean" converter="bean"></convert> <create javascript="getPerson" creator="new"> <param name="class" value="com.aokunsang.dwr.server.DwrServer"></param> <include method="print"/> <include method="getLength"/> <include method="getAllPerson"/> </create> </allow> <signatures> <![CDATA[ import java.util.List; getPerson.getLength(List<String> list); ]]> </signatures> </dwr>
1、<init> 大多数情况下你不需要使用这个标签,因为默认的dwr.xml已经为我们提供了很多常用的creator和converter,详细内容可参见dwr.jar中的org.directwebremoting包中的dwr.xml文件,
<init> <creator id="jsf" class="org.directwebremoting.faces.JsfCreator"/> <creator id="none" class="org.directwebremoting.create.NullCreator"/> <creator id="new" class="org.directwebremoting.create.NewCreator"/> <creator id="pageflow" class="org.directwebremoting.beehive.PageFlowCreator"/> <creator id="spring" class="org.directwebremoting.spring.SpringCreator"/> <creator id="script" class="org.directwebremoting.create.ScriptedCreator"/> <creator id="struts" class="org.directwebremoting.struts.StrutsCreator"/> <creator id="ejb3" class="org.directwebremoting.create.Ejb3Creator"/> <converter id="null" class="org.directwebremoting.convert.NullConverter"/> <converter id="enum" class="org.directwebremoting.convert.EnumConverter"/> <converter id="primitive" class="org.directwebremoting.convert.PrimitiveConverter"/> <converter id="bignumber" class="org.directwebremoting.convert.BigNumberConverter"/> <converter id="string" class="org.directwebremoting.convert.StringConverter"/> <converter id="array" class="org.directwebremoting.convert.ArrayConverter"/> <converter id="map" class="org.directwebremoting.convert.MapConverter"/> <converter id="collection" class="org.directwebremoting.convert.CollectionConverter"/> <converter id="date" class="org.directwebremoting.convert.DateConverter"/> <converter id="dom" class="org.directwebremoting.convert.DOMConverter"/> <converter id="dom4j" class="org.directwebremoting.convert.DOM4JConverter"/> <converter id="jdom" class="org.directwebremoting.convert.JDOMConverter"/> <converter id="xom" class="org.directwebremoting.convert.XOMConverter"/> <converter id="servlet" class="org.directwebremoting.convert.ServletConverter"/> <converter id="bean" class="org.directwebremoting.convert.BeanConverter"/> <converter id="object" class="org.directwebremoting.convert.ObjectConverter"/> <converter id="hibernate2" class="org.directwebremoting.hibernate.H2BeanConverter"/> <converter id="hibernate3" class="org.directwebremoting.hibernate.H3BeanConverter"/> <converter id="url" class="org.directwebremoting.convert.URLConverter"/> <converter id="exception" class="org.directwebremoting.convert.ExceptionConverter"/> <converter id="miniException" class="org.directwebremoting.convert.MinimalistExceptionConverter"/> </init>
这种方式很像Java中的import语句。多数类需要在使用前先import一下,但是import的类并不表明这个类已经被使用了
2、<convert>
a、match属性是bean或者你需要转换的某种Java类型的全类名;
b、converter属性就是你要转换的类型。详见dwr.jar中的org.directwebremoting包中的dwr.xml文件中的<init>,
c、还有一个param属性,针对不同的converter,param参数不同。如:
<convert match="com.aokunsang.dwr.bean.PersonBean"converter="bean"> <param name="exclude或者include" value="property1, property2" /> </convert>
该标签的意思是:包含或者不包含bean中的哪些属性、
3、<create>
a、creator属性使用什么样的构造器创造类的实例,默认为new。还有null[不创建对象],可能的原因有:调用该类的方法是静态方法,dwr调用创建器之前先检查一下该方法是否为静态。详见dwr.jar中的org.directwebremoting包中的dwr.xml文件中的<init>。
b、javascript属性在浏览器里给你创建的对象命名,避免使用JavaScript保留字、
这个名字与导入的js名字一致,
<script type="text/javascript" src="<%=path%>/dwr/interface/getPerson.js"></script>
<script type="text/javascript" src="<%=path%>/dwr/engine.js"></script>
还有在js中调用service类中的方法时的名字也要一致。
function printPerson(){
person = {};
person.name = "jack";
person.age = "12";
person.gender = "男";
getPerson.print(person,{callback:function(data){alert(data);}})
}
function getCount(){
var arr = new Array();
arr[0]=12;
arr[1]=11;
arr[2]=14;
getPerson.getLength(arr,{callback:function(data){alert(data);}})
}
c、param指定创建器的参数,不同的创建器参数不同。
d、include、exclude:include包含哪些方法,其他的不包含,默认该类中的方法全部包含。exclude反之、
4、<signatures>
DWR使用反射机制在转换过程中找到它应该使用的类型。有时候类型的信息无法获得【如泛型,dwr2.0引入了泛型】,在这种情况下你要在此处用方法签名给予暗示。
经测试,如果你的泛型为简单类型,如String,Integer等。<signatures>不写可以正常运行,不过控制台会有警告提示,上篇博文中的实例就可以不写【大家可以试试】。
有一些数据类型不需要我们import,如:String,Map等,详见dwr.jar中的org.directwebremoting包中的dwr.xml文件中的<allow>、
二、 再了解一下dwr的工具js,engine.js、
它有很多方法,在这里只说个别常用的、
1、DWREngine.setXXX 设置全局变量,如:DWREngine.setTimeout(3000);
也可以设置局部的超时时间:如调用回调函数时,可以以对象的形式设置超时,
function getCount(){ var arr = new Array(); arr[0]=12; arr[1]=11; arr[2]=14; getPerson.getLength(arr, { callback:function(data){alert(data);}, timeout:3000 }) }
2、DWREngine.beginBatch()和DWREngine.endBatch();这两个方法是同时出现的,如果没有endBatch(),则所有的远程调用都会一直出于队列中。
功能:用来批量执行远程调用来减少反应时间。DWREngine.endBatch()可以设置超时,如:DWREngine.endBatch({timeout:3000});
3、顺序调用DWREngine.setOrdered(Boolean),默认为false、因为Ajax是异步调用,所以远程调用不会按照一定的顺序返回结果,如果你设置了setOrdered(true),dwr将严格按照发送的顺序返回结果,即:DWR会在旧的请求安全无误的返回结果后才会发送新的请求、
【个人建议】:设置为true时,如果一个请求丢失,那么浏览器将会一直处于等待该请求的返回而没有反应、会大大降低你的应用程序的速度,所以在使用之前要考虑好后果,三思而后行、
后续:对于util.js没有了解,大致看了一下,感觉它和jquery一样,对html页面的一些操作,个人感觉还是Jquery使用方便,有空了再看看dwr提供的util.js。