MayMatrix 2009-01-21
DWR 2.0 增加了一个很有趣的新特性,Annotation,因此可以摆脱了dwr.xml里面的配置.同时也可以方便的和spring整合.从官方网站下载dwr.jar包。然后将它放在你webapp的WEB-INF/lib目录下。 修改web.xml
<!--<br><br>CodehighlightingproducedbyActiproCodeHighlighter(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>logLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
<init-param>
<param-name>classes</param-name>
<param-value>
com.spring.User,com.beans.Book
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/beans.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</ listener >beans.xml是spring的配置文件.org.springframework.web.context.ContextLoaderListener是一个监听器.
<param-name>classes</param-name>
<param-value>
com.spring.User,com.beans.Book
</param-value>
</init-param>
param-value:参数为被注解的类.
编写相关类
com.beans.Book:publicclassBook{
@RemoteProperty
privateStringname;
@RemoteProperty
privateStringauthor;
publicStringgetAuthor(){
returnauthor;
}
publicvoidsetAuthor(Stringauthor){
this.author=author;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}@DataTransferObject: 标注在客户端和服务器之间转换类.对应dwr.xml中的<convert>标签.注解的源代码:
@Retention(RetentionPolicy.RUNTIME)
public@interfaceDataTransferObject
{
/**
*Converterthatconvertsinstanceoftheclass(default:beanconverter).
*/
Class<?extendsConverter>converter()defaultBeanConverter.class;
/**
*Parametersfortheconverter.
*/
Param[]params()default{};
}关于annotation可以看这篇文章,java元数据
@RemoteProperty:标注在类中需要转换的属性.
源代码:@Retention(RetentionPolicy.RUNTIME)
public@interfaceRemoteProperty
{
}如果使用dwr.xml配置,可以这样:
<paramname="include"value="name,author"/>
</convert>User:
creatorParams={
@Param(name="beanName",value="user")
})
@DataTransferObject(converter=BeanConverter.class)
publicclassUser{
@RemoteProperty
privateStringwelcome;
@RemoteProperty
privateStringusername;
@RemoteProperty
privateStringaddress;
@RemoteProperty
privateList<Book>books;
@RemoteProperty
privateintage;
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
@RemoteMethod
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetWelcome(){
returnwelcome;
}
publicvoidsetWelcome(Stringwelcome){
this.welcome=welcome;
}
@RemoteMethod
publicList<Book>getBooks(){
returnbooks;
}
publicvoidsetBooks(List<Book>books){
this.books=books;
}
@RemoteMethod
publicUsergetUser(Stringwelcome){
this.welcome=welcome;
returnthis;
}
}
@RemoteProxy:标注要给远程调用的类.
RemoteProxy的name设置创造出来的对象的名字,creator指定使用那种创造器,例子中使用SpringCreator.creatorParams指定创造器的其他参数.不同的创造器参数是不同的.
@RemoteMethod:标注给远程调用的方法4.修改beans.xml
<beanid="user"class="com.spring.User"
p:username="windfree"p:address="anhuihefei"p:age="25">
<propertyname="books">
<list>
<refbean="C"/>
<refbean="java"/>
</list>
</property>
</bean>
<beanid="java"class="com.beans.Book"p:name="java"p:author="mypure"></bean>
<beanid="C"class="com.beans.Book"p:name="C"p:author="zgliu"></bean>其中p为spring2.0中提供的标签.5.html页面
<html>
<head>
<title>SpringUserInfo.html</title>
<scripttype='text/javascript'src='/DWRExample/dwr/interface/user.js'></script>
<scripttype='text/javascript'src='/DWRExample/dwr/engine.js'></script>
<scripttype='text/javascript'src='/DWRExample/dwr/util.js'></script>
<scripttype="text/javascript">
functiontest(){
user.getUser("Hello",callback);
}
varcellFuncs=[
function(data){returndata.name;},
function(data){returndata.author;},
];
functioncallback(user){
//alert(user.books)
DWRUtil.setValue('result',"欢迎你!"+"姓名:"+user.username+",年龄:"+user.age+",住址:"+user.address);
DWRUtil.addRows('tableInfo',user.books,cellFuncs,
{escapeHtml:false,
rowCreator:function(options){
varrow=document.createElement("tr");
varindex=options.rowIndex*50;
row.style.color="rgb("+index+",0,0)";
returnrow;
},
cellCreator:function(options){
vartd=document.createElement("td");
varindex=255-(options.rowIndex*50);
td.style.backgroundColor="rgb("+index+",255,255)";
td.style.fontWeight="bold";
returntd;
}
})
}
</script>
</head>
<body>
<inputid="jbutton"type="button"value="取得信息"onclick="test()"/>
<br>
<divid="result"></div><br>
<tableborder="1">
<thead><tr>
<th>书名</th><th>姓名</th>
</tr></thead>
<tbodyid="tableInfo">
</tbody>
</table>
</body>
</html>
其中使用了util.js中的一些函数.