DWR 2.0 增加了一个很有趣的新特性,Annotation,因此可以摆脱了dwr.xml里面的配置.同时也可以方便的和spring整合.
从官方网站下载dwr.jar包。然后将它放在你webapp的WEB-INF/lib目录下。 修改web.xml
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (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是一个监听器.
<
init-param
>
<
param-name
>
classes
</
param-name
>
<
param-value
>
com.spring.User,com.beans.Book
</
param-value
>
</
init-param
>
param-value:参数为被注解的类.
编写相关类
com.beans.Book:
@DataTransferObject(converter=BeanConverter.class)
public
class
Book{
@RemoteProperty
private
Stringname;
@RemoteProperty
private
Stringauthor;
public
StringgetAuthor(){
return
author;
}
public
void
setAuthor(Stringauthor){
this
.author
=
author;
}
public
StringgetName(){
return
name;
}
public
void
setName(Stringname){
this
.name
=
name;
}
}
@DataTransferObject: 标注在客户端和服务器之间转换类.对应dwr.xml中的<convert>标签.
注解的源代码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public
@
interface
DataTransferObject
{
/**
*Converterthatconvertsinstanceoftheclass(default:beanconverter).
*/
Class
<?
extends
Converter
>
converter()
default
BeanConverter.
class
;
/**
*Parametersfortheconverter.
*/
Param[]params()
default
{};
}
关于annotation可以看这篇文章,java元数据
@RemoteProperty :标注在类中需要转换的属性.
源代码:
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public
@
interface
RemoteProperty
{
}
如果使用dwr.xml配置,可以这样:
<
convert
converter
="bean"
match
="com.beans.Book"
>
<
param
name
="include"
value
="name,author"
/>
</
convert
>
User:
@RemoteProxy(name
=
"
user
"
,creator
=
SpringCreator.
class
,
creatorParams
=
{
@Param(name
=
"
beanName
"
,value
=
"
user
"
)
})
@DataTransferObject(converter
=
BeanConverter.
class
)
public
class
User{
@RemoteProperty
private
Stringwelcome;
@RemoteProperty
private
Stringusername;
@RemoteProperty
private
Stringaddress;
@RemoteProperty
private
List
<
Book
>
books;
@RemoteProperty
private
int
age;
public
StringgetAddress(){
return
address;
}
public
void
setAddress(Stringaddress){
this
.address
=
address;
}
public
int
getAge(){
return
age;
}
public
void
setAge(
int
age){
this
.age
=
age;
}
@RemoteMethod
public
StringgetUsername(){
return
username;
}
public
void
setUsername(Stringusername){
this
.username
=
username;
}
public
StringgetWelcome(){
return
welcome;
}
public
void
setWelcome(Stringwelcome){
this
.welcome
=
welcome;
}
@RemoteMethod
public
List
<
Book
>
getBooks(){
return
books;
}
public
void
setBooks(List
<
Book
>
books){
this
.books
=
books;
}
@RemoteMethod
public
UsergetUser(Stringwelcome){
this
.welcome
=
welcome;
return
this
;
}
}
@RemoteProxy:标注要给远程调用的类.
RemoteProxy的name设置创造出来的对象的名字,creator指定使用那种创造器,例子中使用SpringCreator.creatorParams指定创造器的其他参数.不同的创造器参数是不同的.
@RemoteMethod:标注给远程调用的方法
4.修改beans.xml
<
bean
id
="remote"
class
="com.spring.Remote"
></
bean
>
<
bean
id
="user"
class
="com.spring.User"
p:username
="windfree"
p:address
="anhuihefei"
p:age
="25"
>
<
property
name
="books"
>
<
list
>
<
ref
bean
="C"
/>
<
ref
bean
="java"
/>
</
list
>
</
property
>
</
bean
>
<
bean
id
="java"
class
="com.beans.Book"
p:name
="java"
p:author
="mypure"
></
bean
>
<
bean
id
="C"
class
="com.beans.Book"
p:name
="C"
p:author
="zgliu"
></
bean
>
其中p为spring2.0中提供的标签.
5.html页面
<!
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"
>
<
html
>
<
head
>
<
title
>
SpringUserInfo.html
</
title
>
<
script
type
='text/javascript'
src
='/DWRExample/dwr/interface/user.js'
></
script
>
<
script
type
='text/javascript'
src
='/DWRExample/dwr/engine.js'
></
script
>
<
script
type
='text/javascript'
src
='/DWRExample/dwr/util.js'
></
script
>
<
script
type
="text/javascript"
>
function
test(){
user.getUser(
"
Hello
"
,callback);
}
var
cellFuncs
=
[
function
(data){
return
data.name;},
function
(data){
return
data.author;},
];
function
callback(user){
//
alert(user.books)
DWRUtil.setValue('result',
"
欢迎你!
"
+
"
姓名:
"
+
user.username
+
"
,年龄:
"
+
user.age
+
"
,住址:
"
+
user.address);
DWRUtil.addRows('tableInfo',user.books,cellFuncs,
{escapeHtml:
false
,
rowCreator:
function
(options){
var
row
=
document.createElement(
"
tr
"
);
var
index
=
options.rowIndex
*
50
;
row.style.color
=
"
rgb(
"
+
index
+
"
,0,0)
"
;
return
row;
},
cellCreator:
function
(options){
var
td
=
document.createElement(
"
td
"
);
var
index
=
255
-
(options.rowIndex
*
50
);
td.style.backgroundColor
=
"
rgb(
"
+
index
+
"
,255,255)
"
;
td.style.fontWeight
=
"
bold
"
;
return
td;
}
})
}
</
script
>
</
head
>
<
body
>
<
input
id
="jbutton"
type
="button"
value
="取得信息"
onclick
="test()"
/>
<
br
>
<
div
id
="result"
></
div
><
br
>
<
table
border
="1"
>
<
thead
><
tr
>
<
th
>
书名
</
th
><
th
>
姓名
</
th
>
</
tr
></
thead
>
<
tbody
id
="tableInfo"
>
</
tbody
>
</
table
>
</
body
>
</
html
>
其中使用了util.js中的一些函数.