dwr(Direct Web Remoting)是一个WEB远程调用框架.利用DWR可以在客户端利用javascript直接调用服务端的java方法,并返回值给javascript.
原理:DWR通过反射,将java翻译成javascript,然后利用回调机制,轻松实现了javascript调用java代码。
配置及使用步骤:
1. 在项目中引入dwr.jar,在web.xml文件中配置DwrServlet
2. 创建java类,编写业务代码.该代码和dwr无关,就是普通的java类
3. 配置dwr.xml文件 通过配置告诉DWR哪些类的哪些方法需要暴露给前台使用,当DWR启动时根据dwr.xml这个文件把java类中的方法转成js中可用的类中的方法,使前台可以使用。
4. 在web页面中编写javascript方法,调用业务逻辑方法
5. 执行过程中,程序将执行结果利用回调函数返回。在回调函数中,得到执行结果后,可以继续编写业务逻辑的相关javascript代码。
代码实例:
1. 在web.xml中配置DwrServlet
<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>crossDomainSessionSecurity</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
2. 创建java类,编写业务逻辑
public class DWRTest {
public String hello(){
return "Hello World";
}
}
3. 配置dwr.xml
dwr.xml放在web-inf目录下。
第一种写法是调用spring bean,第二种写法是调用普通的java类。
<allow>标签中包括可以暴露给javascript访问的东西。
<create>标签中指定javascript中可以访问的java类,并定义DWR应当如何获得要进行远程的类的实例。creator="new"属性指定java类实例的生成方式,new意味着DWR应当调用类的默认构造函数来获得实例,其他的还有spring方式,通过与IOC容器Spring进行集成来获得实例等等。javascript=" testClass "属性指定javascript代码访问对象时使用的名称。
<param>标签指定要公开给javascript的java类名。
<include>标签指定要公开给javascript的方法。不指定的话就公开所有方法。
<exclude>标签指定要防止被访问的方法。
<dwr>
<allow>
<!-- javascript="在javascript中要用的类名" value="spring配置文件中DWRTest类对应的id"-->
<!-- <create creator="spring" javascript="dwrTest">
<param name="beanName" value="dwrTest"/>
</create> -->
<!-- javascript="在javascript中要用的类名" value="被调用的java类的完整路径"-->
<create creator="new" javascript="DWRTest">
<param name="class" value="com.tgb.DWRTest"/>
</create>
</allow>
</dwr>
4. 在页面中通过javascript调用业务逻辑方法
其中DWRTest.js是dwr根据配置文件自动生成的,engine.js和util.js是dwr自带的脚本文件。
<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/DWRTest.js"></script>
<script type="text/javascript">
//java方法的javascript函数
functiontest1(){
DWRTest.hello( helloreturn );
}
//接收返回值的回调函数
function helloreturn(value){
//value接收方法的返回值,可以在这个回调函数里对返回值进行处理-->
alert(value);
}
//或者采用第二种写法,将回调函数放到javascript函数内部
//function test1(){
// DWRTest.hello(
// function(data){
// alert(data);
// }
// );
// }
</script>
<body>
<input type="button" value="hello" οnclick="test1()">
</body>