DWR运行原理:
(1)部署阶段:
1)读dwr.xml,在该xml文件中定义的Javascript(如名为cc),它对应的类为如DWRTest,这里cc相当于DWRTest,通过反射生成cc.js,其中DWRTest中的方法也就是调用后台类的方法;
(2)运行阶段:
(2)运行阶段:
触发事件调用一个方法——>
从自己的js中调用了上面的cc.js中的方法t1——>
调用客户端的AJAX引擎发出请求——>
以上三步都是由客户端完成,后面的都是有服务器端来完成:
Web容器先接到请求,找上下文路径:/dwr/匹配dwr中对应的servlet——>
读dwr.xml;根据js名匹配creator定义;依据creator方法创建实例(反射);调用方法,得到返回值——>
out出去——>
回调处理——>
调用客户端的回调处理(自己写的方法)。
DWR:
1
、是什么?
2
、有什么?
DWR
的工作原理是通过动态把
Java
类生成为
Javascript
。它不需要任何网页浏览器插件就能运行在网页上。
3
、能干什么?
让客户端
Javascript
通过
DWR
访问
Java
程序。
dwr使用
dwr使用
自己总结的教程:
dwr是有版本区分的,不同版本的dwr.xml是不一样的,引用的dwr.jar包也是不一样,现在用的是dwr3.0
1、jsp引用和调用访问(必须要引用的):
引用:
<script type='text/javascript' src='<%=basePath%>dwr/engine.js'></script>
<script type='text/javascript' src='<%=basePath%>dwr/util.js'></script>
<script type='text/javascript' src='<%=basePath%>dwr/interface/wltSay.js'></script>
其中:wltSay.js的脚本必须要跟dwr.xml里面的配置的javascript名称一样
其中:这三个文件存放的目录dwr,要跟web里面的配置一样:
记住,
上面引用的这三个脚本文件都是你看不到的,因为都在浏览器缓存里面。引用的路径是固定的
调用访问:
<script>
var req1 = {name1:"第一个req1",age1:"22岁"};
var req = {name:"第一个req",age:"21岁",bean1:req1};
//传参,复杂参数:对象里面包对象
//对应的后台代码如下:
//public ResponseBean sayAction(RequestBean requestBean){
//wltSay就是我们引用的js的名称,所以调用的名称和引用的脚本名称以及dwr.xml配置里面javascript的名称是一样。调用的方法就像类名.成员方法,调用成员变量一样
wltSay.sayAction(req,function(data){
alert(data.info);
});
var req1 = {name1:"测试同时传递两个对象",age1:"22岁"};
//传参,复杂参数,同时传递两个对象req,req1
//对应的后台代码如下:
//public ResponseBean sayAction(RequestBean requestBean,RequestBean1 requestBean1){
wltSay.sayAction(req,req1,function(data){
alert(data.info);
});
</script>
注意:dwr里面的方法不能支持重载,虽然可以发送请求过去,但是这个时候两个重载的方法回调函数只有一个生效。原因参考:
查看原因
2、web.xml配置(直接复制进去就好了)
<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>
<init-param>
<param-name>allowScriptTagRemoting</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>
dwr3.0的配置文件的配置模板:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr30.dtd">
<dwr>
<allow>
<create creator="new" javascript="wltSay">
<param name="class" value="com.wlt.action.Say"/>
</create>
<convert match="com.wlt.model.*" converter="bean"></convert>
</allow>
</dwr>