您的位置:首页 > 编程语言 > Java开发

spring-OpenSessionInVies延长session的生命周期

2015-11-29 16:49 519 查看
在做项目过程中,报如下的错误:



核心代码

Action

<span style="font-size:14px;">//分页查询
publicString list() {
PageBeanpageBean= userService.findByPage(pageSize, pageNum);
ActionContext.getContext().put("pageBean",pageBean);
return"list";
}</span>


Service
调用父类的方法: 

<span style="font-size:14px;">@Transactional
@Service
public  abstract class DaoSupportImpl<T>implements DaoSupport<T> {
@Resource
privateSessionFactory sessionFactory;
privateClass<T> clazz;
@SuppressWarnings("unchecked")
publicDaoSupportImpl() {
//使用反射技术得到T的真实类型,泛型化的类型
ParameterizedTypept =  (ParameterizedType)this.getClass().getGenericSuperclass(); // 获取当前new的对象的 泛型的父类 类型
this.clazz= (Class<T>) pt.getActualTypeArguments()[0]; // 获取第一个类型参数的真实类型
System.out.println("clazz---> " + clazz);
}
//公共的查询分页信息的方法
@SuppressWarnings({"unchecked", "unused", "rawtypes" })
publicPageBean  findByPage(int pageSize,intpageNum){
//分页查询
System.out.println(clazz.getSimpleName());
ListcurrentPageList =getSession().createQuery("From"+clazz.getSimpleName())//
.setFirstResult((pageNum-1)*pageSize)//
.setMaxResults(pageSize)//
.list();
//计算出总几记录数据
intallRecordsCount=findAll().size();
returnnew PageBean(pageNum,pageSize,allRecordsCount,currentPageList);
}
}</span>


注意:@Transactional,spring的声明式事务。在父类中注入,子类也可以起作用;该事务的范围,当其作用范围当事务环境的方法被调用完毕之后关闭。
JSP:

<span style="font-size:14px;"><!--显示数据列表-->
<tbodyid="TableData" class="dataContainer"datakey="userList">
<s:iteratorvalue="#pageBean.currentPageList">
<trclass="TableDetail1 template">
<td>${loginName} </td>
<td>${name} </td>
<td>${department.name} </td>
<td>${description} </td>
<td><aonClick="return window.confirm('您确认删除数据吗?')" href="user_delete.action?id=${id}">删除</a> <a
href="user_editUI.action?id=${id}">修改</a>
<ahref="user_initPassword.action?id=${id}">初始化密码</a>
</td>
</tr>
</s:iterator>

</tbody></span>


注意:这里department.name,是想通过懒加载获取数据的。实际情况呢,session早在方法DaoSupportImpl执行完方法之后就关闭了,导致如上错误错误。

解决方案

思路是把session的生命周期延长即可。而spring已经给我们解决了这个问题,它提供了专门的OpenSessionInViewFilter的过滤器。
Web.xml

<span style="font-size:14px;"><!--配置Spring用于解决懒加载问题的过滤器 -->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping></span>


注意:该配置一定要放到struts2的核心控制器之前。
 
效果图:



 

总结

OpenSessionInViewFilter它使得session的生命周期开始提前,关闭延后,这样就使得我们的懒加载发挥的了极致。当然生命周期过长也存在一定的弊端,那就是大量缓冲数据在内容中停留时间过长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: