DWR:全称Direct Web Remoting,是一种简化AJAX开发的开源库。DWR框架是一个可以允许你去创建AJAX WEB站点的JAVA开源库。它可以让你在浏览器的JavaScript代码中调用Web服务器的Java代码,就像Java代码在浏览器中一样。DWR工作原理是通过动态把Java类生成JavaScript,让使用者感觉调用就像发生在浏览器端。当我们的业务需要在页面不提交的情况下访问服务器端并实现页面数据局部刷新时,我们就可以使用DWR。
下面对如何使用DWR进行了归纳:
1.首先把dwr的类库jar包放入项目的lib路径下,这是废话。
2.在web.xml增加一段配置,因为dwr是靠一个Servlet来接收来至javascript的请求的
<servlet>
<servlet-name>dwr</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dwr</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
3.在WEB-INF下面添加一个名为dwr.xml的配置文件,在这里配置需要在js里面访问的Java类和方法。下面以检查邮件地址是否占用的操作为例,<allow>标记表示了那些类需要转换为Ajax方式调用,create="new"指定dwr引擎以何种方式创建要调用的类,还有jsf,struts,spring,none等选项,new 是比较适中的也是默认的创建方式。javascript="CheckEmailService"指定该java类生成的js文件的名字(或者说在js里该类的名字)。如果你需要在js调用Java时传递对象如VO,可以如下指定一个<convert>,这表示你允许dwr帮你把Java类转换为js里模拟的对象,js里调用时可以传递这个VO.
<dwr>
<allow>
<create creator="new" javascript="CheckEmailService">
<param name="class"
value="com.xxx.CheckEmailService" />
</create>
<convert converter="bean" match="com.xxx.CallbackVo" />
</allow>
</dwr>
4.在项目里编写Java类:一个VO类,一个用来AJAX执行的类,注意方法的参数可以是对象哦!!!
import com.xxx.EmailVo;
public class CheckEmailService{
public String checkEmail(EmailVo email){
//.....do something......
}
}
public class EmailVo{
private String mail;
//.....getter,setter,以及其他属性
}
5.接下来就在jsp里面导入js文件了。任何使用dwr的jsp必须导入以下两个dwr已有的js:
<script type='text/javascript' src="/dwr/engine.js"/>
<script type='text/javascript' src="/dwr/util.js"/>
当然还必须导入dwr从CheckEmailService类生成而来的js文件,比如:
<script type='text/javascript' src="/dwr/interface/CheckEmailService.js"/>
注意了,这个地方有的人会迷惑,这些js在哪里?实际上你是找不到的,因为dwr把这些js文件输出到浏览器缓存里,文件系统没有。(如果你用firefox浏览器,可以安装JS Viewer插件来查看缓存里的js)。
6.好了,在jsp里面要以AJAX方式检查邮件是否占用可以这么写:
<script>
var emailVo={mail:document.getElementById("mailInputText"),....};
CheckEmailService.checkEmail(emailVo,
callback(returnValue){
if(returnValue==""){
alert("邮件被占用!");
}
}
);
</script>
看到了没,先以{ 属性1:属性值1, 属性2:属性值2...}方式创建一个数组来模拟对象,然后传给执行检查的checkEmail方法,checkEmail的第二个参数是一个js函数,用来回调。也就是服务器端Java类的checkEmail执行完返回后,来调用这个回调的函数处理结果。
7.总结:我这里给出了一个解释原理的示意性例子,要会用dwr,主要是理解其原理。其原理就是通过Java反射机制生成对应于Java类的js文件,在客户端模拟Java调用;由engine.js里的execute()函数向服务器发送,提交到Servlet后转给Java类执行。理解,切记。共勉!