一、 简单的说说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。