随笔-124  评论-194  文章-0  trackbacks-0
当我们写好SERVICE层的MANAGER方法后,就已经完成业务逻辑,可以用DWR从BROWSER直接调用,不必要再写一个“缓冲层”,这样的好处是避免了今后对SERVICE层的多处同时改动。
SERVICE层的JPA配置不再赘述,参看:这里
重点说下DWR配置中注意的问题:

一、在DWR序列化过程中,JPA的SESSION关闭的解决办法
由于我们是在SERVICE层的各个MANAGER方法上设置transaction,方法调用结束意味着EntityManager(或者说数据库会话)关闭,导致lazy-init失效,应该在web.xml中配置Spring OpenEntityManagerInViewFilter让其保持打开:
    <!-- below let session is open after DWR invoked manager method, so lazy property can effect -->
    
<filter>
        
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
        
<filter-class>
            org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
        
</filter-class>
    
</filter>

    
<filter-mapping>
        
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
        
<url-pattern>/*</url-pattern>
    
</filter-mapping>


二、把DWR配置成可调用MANAGER方法
我们的MANAGER是SPRING创建的BEAN,所以DWR里要把creator写成spring
        <create creator="spring" javascript="HostGroupManager">
            
<param name="beanName" value="hostGroupManager" />
            
<include method="findAll" />
        
</create>

三、对一对多、多对多等关系的处理,避免大量SELECT操作
findAll方法将返回HostGroup的集合,由于HostGroup和RealHost是一对多关系,在取HostGroup过程中会把它关联的所有RealHost取出来传至BROWSER,这是不能接受的,应该在DWR里这样配置:
        <convert converter="bean" match="com.exchangebit.nms.config.entity.HostGroup">
            
<param name="exclude" value="realHosts" />
        
</convert>

这样,可以让DWR在序列化HostGroup时,将realHosts排除在外。

四、浏览器端代码
注意这里需要包含HostGroupManager.js:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>test dwr get</title>
<script type='text/javascript'
    
src='<%=request.getContextPath()%>/dwr/engine.js'></script>
<script type='text/javascript'
    
src='<%=request.getContextPath()%>/dwr/util.js'></script>
<script type='text/javascript'
    
src='<%=request.getContextPath()%>/dwr/interface/HostGroupManager.js'></script>
<script type="text/javascript">
        
function handleGroups(g) {
            
for (var i=0; i<g.length; i++){
                
var li = document.createElement("li");
                li.appendChild(document.createTextNode(
                        g[i].name)
                );
                document.getElementById(
"north").appendChild(li);
            }

        }

    
</script>
</head>

<body>
<button onClick="HostGroupManager.findAll (handleGroups);">hehe</button>
<div id="north">
<p>good</p>
</div>
</body>

</html>


象上述这样就可以在浏览器端直接调用SERVICE层方法,方便而直接。

posted on 2008-03-03 20:59 我爱佳娃 阅读(4755) 评论(1)  编辑  收藏 所属分类: AJAX

评论:
# re: DWR+JPA: DWR直接访问SERVICE层,并直接处理DAO返回的BEAN[未登录] 2008-06-30 09:07 | XXX
这个
没看出有多好
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: