dwr是java平台上一个可用的Ajax-RPC 工具包,用于改善web页面端与java类的交互。它使得Ajax开发变的更加简单。使用DWR框架可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样。更简单一点来说DWR提供了一个引擎文件engine.js,它可以把服务器端java对象的方法暴露给javascript。使用 DWR 可以有效地从应用程序代码中把 Ajax 的全部请求 - 响应循环消除掉。这意味着客户端代码再也不需要直接处理 XMLHttpRequest 对象或者服务器的响应。不再需要编写对象的序列化代码或者使用第三方工具才能把对象变成 XML 。甚至不再需要编写 servlet 代码把 Ajax 请求调整成对 Java 域对象的调用。
那么如何将dwr与spring进行集成从而实现前后台交互呢?下面我将通过一个实例来进行介绍。本实例仍然分为以下几个部分进行:
1.引入相关jar包:
commons-logging-1.1.1.jar
dwr.jar
spring.jar
2.编写web.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/app*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置DWR的前端控制器 --> <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>config</param-name> <!-- 加载dwr.xml文件,该文件位于src下的config文件夹中 --> <param-value> /WEB-INF/classes/config/dwr.xml </param-value> </init-param> <!-- 开启DWR的调试模式 --> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> </web-app>
3.配置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> <allow> <create javascript="T10" creator="spring" > <param name="beanName" value="dwrtest"></param> </create> <create javascript="T11" creator="spring" > <param name="beanName" value="dwrtest2"></param> </create> </allow> </dwr>
4.配置applicationContext-beans文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="dwrtest" class="com.bjsxt.dwrtest.Test10"></bean> <bean id="dwrtest2" class="com.bjsxt.dwrtest.Test11"></bean> </beans>
5.编写后台java类代码:
package com.bjsxt.dwrtest; public class Test11 { public String method1(){ return "调用方法111111"; } public String method2(){ return "调用方法222222"; } }
package com.bjsxt.dwrtest; public class Test10 { public String method1(){ return "调用方法0001"; } }
6.编写jsp页面代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="dwr/engine.js"></script> <script type="text/javascript" src="dwr/util.js"></script> <script type="text/javascript" src="dwr/interface/T11.js"></script> <script type="text/javascript" src="dwr/interface/T10.js"></script> <script type="text/javascript"> function test1(){ //设置为同步方式 dwr.engine.setAsync(false); T10.method1( function(datas){ alert(datas); } ); T11.method1( function(datas){ alert(datas); } ); } </script> </head> <body> <input type="button" value="ceshi" onclick="test1()"> </body> </html>
在jsp页面代码中需要注意的是引入我们所需要的engine.js文件,util.js文件以及我们所需要的dwr接口文件,而所谓的接口文件就是我们在dwr.xml文件中定义的create元素中javascript属性的值。这个接口文件充当了了前台js与后台java类的中间媒介。由于dwr框架同样是利用ajax技术的,所以当一个javascript函数中需要调用多个java类函数的时候,虽然函数体中有先后调用顺序,但是ajax的异步性决定了他们不一定是按照代码编写的顺序执行的,所以当我们需要强制性的执行先后的函数的时候必须要设置dwr引擎的执行方式为同步性,也就是将dwr引擎的Async属性设置为false。这样在调用javascript函数的时候,函数体内的各个java函数的调用就是按照顺序执行的了。