一,Dwr的原理
Dwr的核心就是直接能够调用业务层的方法,对于返回的数据不需要在来拼json数组,就可以直接使用,但是,其实不是直接访问的service层的方法,是通过生成一个跟业务层相同的方法的js文件,调用和业务层相同方法名的方法来调用核心控制器(dwrServlet)来调用业务层的方法,貌似是直接调用业务层的方法,但是其实真正的不是这样的
二,整合spring+hibernate的步骤
1,struts+spring+hibernate加载完,测试完成
2,拷dwr.jar 到lib下面
3拷dwr30.dtd 和 dwr.xml 到WEB-INF下面,然后把dwr.xml中的"http://directwebremoting.org/schema/dwr20.dtd" 改成 "dwr30.dtd"(这样就有提示)
4,在dwr.xml中写规则
<dwr>
<allow>
//cnverter="bean"是要查关联表,"hibernate3"是不需要查关联表
<convertmatch="hwt.pojo.*"converter="bean"></convert>
<create creator="spring" javascript="emp">//creator是指的创建方式,如new, spring,javascript="?"是定义一个在js中用的对象,通过这个对象来调用这个业务方法
<paramname="beanName" value="empService"></param>
//name=beanName是死的,value="?"是这个业务对象在applicationContext.xml中bean中的名字
</create>
</allow>
</dwr>
5,在web.xml中的servlet中添加一个dwrServlet的核心控制器,要加一个参数:debug = true
<servlet>
<servlet-name>dwrServlet</servlet-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwrServlet</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
有个地方要注意:如果dwr整合的项目是struts2的话,那么struts2中的过滤器中的<url-mapping>[…] </url-mapping>,[…]里面不能是/*,因为这样也会截获dwr的请求,导致找不到Action,可以使用*.action 或者*.do..
6,测试:http://127.0.0.1:8080/工程名/dwr/
输入地址,看是否能够显示出一个页面,里面好多方法,点击一个自己写的业务层方法来测试一下,看能否得到想要的答案
7,页面:
首先要将第6步的测试页面中的前面导入的js代码拷贝到自己的页面,这些js文件就是对应这service层的类生成的一些同名的js文件,通过调用这些文件来调用业务层的方法,但是本人不喜欢用dwr提供的一些方法,我喜欢用jquery来操作dwr,所以我可以不导入 <scripttype='text/javascript'src='/工程名/dwr/util.js'></script>
但是我需要在页面导入jquery的js:
<script>
$(function(){
//得到所有的员工
emp.getAllEmps(function(data){
$.each(data,function(key,value){
alert(data[key].ename+"-"+data[key].empno);
});
});
//根据员工号得到员工的名字
emp.getEmpName(7788,function(data){
alert(data);
});
});
</script>
三,注意:
1,整合jQuery,因为在dwr中也有$,代表document.getElementById("idname");
所以为了使得两个$不混合:
·把jQuery的导入的位置放在Dwr的后面,那么不用dwr的$,
·jQuery的位置放在Dwr的前面,但是jQuery中的$用jQuery来代替
2,解决lazy问题
1.写语句时用fetch
2.<convert match="com.pojo.*"converter="hibernate3"></convert>
不会查关联表
<convert match="com.pojo.*"converter="bean"></convert>
用bean会去查dep里面员工集合
3.使用一个过滤器来控制session开关
请求时:开session
响应后:关session