spring-OpenSessionInVies延长session的生命周期
2015-11-29 16:49
519 查看
在做项目过程中,报如下的错误:
Service
调用父类的方法:
注意:@Transactional,spring的声明式事务。在父类中注入,子类也可以起作用;该事务的范围,当其作用范围当事务环境的方法被调用完毕之后关闭。
JSP:
注意:这里department.name,是想通过懒加载获取数据的。实际情况呢,session早在方法DaoSupportImpl执行完方法之后就关闭了,导致如上错误错误。
Web.xml
注意:该配置一定要放到struts2的核心控制器之前。
效果图:
核心代码
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的生命周期开始提前,关闭延后,这样就使得我们的懒加载发挥的了极致。当然生命周期过长也存在一定的弊端,那就是大量缓冲数据在内容中停留时间过长。相关文章推荐
- 安装eclipse for php
- 1. Spring Security 4.2
- 斐波那契数列(Java)
- 从零开始写javaweb框架笔记3-编写一个简单的web应用
- 源码解析HashMap
- Android项目文件构成(Eclipse示例)
- Android项目文件构成(Eclipse示例)
- 深入理解JavaBean内省
- java/HashSet
- Java使用局部变量的一些要点
- Java 8中处理日期和时间
- 我看Java虚拟机(4)---Javac编译器
- 设置自己喜欢的eclipse背景风格
- java/TreeSet
- spring MVC学习(三)
- 从零开始写javaweb框架笔记2-搭建web项目框架
- Java多态知识小结+简单代码实例
- Java的一些经验
- Java多线程学习笔记(二)
- Android studio修改变更Eclipse快捷键