`
finally_m
  • 浏览: 69295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用OpenSessionInViewFilter解决session关闭问题

阅读更多

基于JavaEE平台的软件开发中,使用Spring+Struts+Hibernate三个框架来构建软件项目是目前最为流行的方式。
目前我们已经掌握了Spring+Hibernate 或 Spring+Struts的集成方式,那么spring,Hibernate,Struts三个框架的集成也就不成问题了,但是在集成的过程中,需要注意一些问题:

问题一:使用MyEclipse引入三个框架后有重复JAR包,删除重复的JAR即可。

问题二:在使用HibernateTemplate的load方法查找数据, 需要在页面显示数据时出现Session已关闭异常。

 

问题分析:
因为HibernateTemplate模版类内部已经对Session的关闭进行了封装,这个问题我们可以使用事务管理来解决,但是当事务结束后,依然会关闭Session,从而导致页面获取不到数据。

 

OpenSessionInViewFilter
Session已关闭异常解决方法:
(1) 关闭延迟加载功能(不推荐使用)
(2) 使用Spring提供的OpenSessionInViewFilter类把Session关闭延长至页面加载数据完毕。

 

在web.xml中配置OpenSessionInViewFilter

<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>*.do</url-pattern>
</filter-mapping>

 

OpenSessionInViewFilter不起作用问题:
通常在Web应用中初始化Spring的配置,我们会在web.xml里面配置一个Listener,即:

	<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/dao-config.xml,
			/WEB-INF/service-config.xml,
			/WEB-INF/spring-config.xml
		</param-value>
	</context-param>  

 

如果使用Struts,那么需要在Struts的配置文件struts-config.xml里面配置一个Spring的plugin:ContextLoaderPlugIn。


注意:

要在应用中使用OpenSessionInViewFilter,加载Spring配置文件需要在web.xml中配置,如果是使用Spring提供的插件在struts-config.xml文件里进行配置,将出现获取不到ApplicationContext对象的异常。

原因是,OpenSessionInViewFilter类需要通过ApplicationContext获取sessionFactory对象时得不到ApplicationContext对象,

 

实际上ContextLoaderListener和ContextLoaderPlugIn的功能是重叠的,他们都是进行Spring配置的初始化工作的。因此,如果你不打算使用OpenSessionInView,那么你并不需要在web.xml里面配置ContextLoaderListener。

好了,但是你现在既需要Struts集成Spring,又需要OpenSessionInView模式,问题就来了!

 

由于ContextLoaderListener和ContextLoaderPlugIn功能重叠,都是初始化Spring,你不应该进行两次初始化,所以你不应该同时使用这两者,只能选择一个,因为你现在需要集成Struts,所以你只能使用ContextLoaderPlugIn。

但是令人困惑的是,ContextLoaderListener和ContextLoaderPlugIn有一个非常矛盾的地方!

 

ContextLoaderListener和ContextLoaderPlugIn初始化spring配置后,都把配置对象放在ServletContext对象里面保存,问题在于他们各使用的key是不同的。而OpenSessionInViewFilter是按照ContextLoaderListener初始化后保存使用的key来获取配置对象,所以在使用ContextLoaderPlugIn初始化配置OpenSessionInViewFilter就得不到spring配置对象了。

 

 

这个问题解决办法是:
(1) 修改OpenSessionInViewFilter代码,使之获取配置对象的key与ContextLoaderPlugIn初始化后用于保存的key 一致。


(2) 使用ContextLoaderListener方式初始化配置。

分享到:
评论

相关推荐

    关于OpenSessionInViewFilter的学习

    OpenSessionInViewFilter是Spring框架中一个非常重要的组件,主要用于解决数据访问层(DAO)与视图层(View)之间的事务管理问题。在Web应用中,由于HTTP请求的无状态性,一次请求通常由多个Servlet过滤器、控制器和...

    Open_Session_In_View详解.doc

    然而,在没有使用Spring提供的`Open Session In View`的情况下,当懒加载设置为`true`时,如果在服务层(service or DAO)关闭了session,则需要在应用层内手动初始化所有关系集合(例如通过调用`company.getEmployees...

    懒加载异常解决.docx

    通过配置OpenSessionInViewFilter,可以在很大程度上解决懒加载异常的问题,尤其是在Java Web应用中使用Hibernate等ORM框架时。当然,还需要根据实际项目的具体情况,灵活调整和优化配置,以达到最佳的性能和稳定性...

    使用Spring引起的错误

    通过保持Hibernate Session在整个请求周期内处于打开状态,可以避免在视图层因为Session关闭而导致的`LazyInitializationException`异常。Open Session In View可以通过两种方式进行配置: 1. **...

    Hibernate事务管理.

    为了解决这个问题,通常建议在Service层使用Spring的`@Transactional`注解来管理事务,这样可以更精确地控制事务的边界,避免长时间打开Session带来的风险。同时,也可以考虑优化数据模型和查询设计,减少对懒加载的...

    HIBERNATE4开发文档,HIBERNATE4的变化

    为了解决这个问题,可以添加`OpenSessionInViewFilter`过滤器,确保在视图渲染期间保持session打开。 5. **分页查询的注意事项** - Hibernate4中,如果你在进行分页查询时遇到“ResultSet may only be accessed in...

    错误及解决方案.pdf

    通过以上分析,可以看出文档内容主要涉及到了JavaEE Web应用开发过程中经常碰到的问题及其解决方法,尤其强调了与Hibernate框架结合使用时需要注意的一些细节和最佳实践。理解这些知识点有助于提高开发效率并避免...

    OpenSessionInView项目整合jar包

    这个模式的主要目的是解决在HTTP请求处理过程中,由于Session范围内的Hibernate Session关闭导致的数据访问异常。OpenSessionInView模式确保在整个HTTP请求生命周期内,数据库操作都在一个开放的Hibernate Session中...

    spring中lazy=“true”的正常读取关联表(用opensessioninview)

    为了解决这个问题,Spring提供了一个过滤器 `OpenSessionInViewFilter` 或者 `OpenSessionInViewInterceptor`,通常简称为OSIV(Open Session In View)模式。 OSIV模式的核心思想是在Controller层和View层之间保持...

    三大框架整合常见问题

    - 在上述代码片段中,使用`OpenSessionInViewFilter`过滤器来实现Session的自动开启和关闭。 **示例代码:** ```xml &lt;filter-name&gt;hibernateFilter org.springframework.orm.hibernate3.support....

    我的智囊团(SSH)_04_开发提问及回复功能_上

    OpenSessionInViewFilter的主要作用是在HTTP请求的生命周期内保持一个Hibernate的Session,确保在视图层(例如JSP页面)也能访问到数据库会话,解决了“懒加载”问题,避免了因为请求结束而关闭Session导致的数据...

    Spring提供的CharacterEncoding和OpenSessionInView功能

    在处理Web应用时,Spring提供了一些关键特性,如`CharacterEncodingFilter`和`OpenSessionInViewFilter`,它们对于解决特定问题至关重要。 首先,让我们深入了解一下`CharacterEncodingFilter`。在Web应用中,字符...

    spring监听器

    1. **OpenSessionInViewFilter**:这是一个由Spring提供的过滤器,用于解决在Web应用程序中使用Hibernate时常见的问题——事务管理。当用户发起一个HTTP请求时,OpenSessionInViewFilter会在请求开始时打开一个新的...

    Hibernate 与 MyFaces的整合

    当请求开始时,Filter会开启一个新的Session,而在请求结束时,Session会被关闭或返回到池中。Spring框架下的`OpenSessionInViewFilter`是一个典型例子,只需在`web.xml`中进行配置即可轻松实现。 四、最佳实践与...

    Hibernate4.1环境搭建

    通过上述步骤,我们可以成功地搭建起Spring4.1 + Hibernate4 + Struts2的环境,并解决了session数据为空的问题。在实际开发中,还需要根据具体的应用场景对配置进行适当的调整,以确保应用能够稳定运行。同时,熟练...

    SSH框架整合所需类class.txt

    - **应用场景**:在使用Spring MVC与Hibernate集成的应用中,为了确保在视图层渲染数据时不会因为Session关闭而导致的问题,需要配置`OpenSessionInViewFilter`。 ##### 4. `org.apache.struts2.dispatcher.ng....

    java程序中的延时加载异常及解决方案

    解决这个问题的一种常见方法是在Spring与Hibernate整合的环境中,使用`OpenSessionInViewFilter`。这个过滤器的作用是在HTTP请求的整个生命周期内保持Hibernate Session的开放,确保在视图层也能访问到延迟加载的...

    Struts,Spring与hibernate集成

    10. **处理Hibernate延迟加载问题**:为了解决由于Session生命周期和HTTP请求生命周期不匹配导致的延迟加载问题,可以使用OpenSessionInViewFilter。这个过滤器确保Session在请求结束时才关闭,从而能正确处理延迟...

    SSH整合环境 配置

    - `OpenSessionInViewFilter` 是Spring提供的一个过滤器,用于解决数据访问层(DAO)在Web请求结束时无法关闭Session的问题,防止出现Session过早关闭导致的事务问题。`sessionFactoryBeanName`参数指定了...

    S2SH集成 案例

    在这个案例中,Hibernate的SessionFactory可能被Spring管理,通过OpenSessionInViewFilter来保证每个HTTP请求都有一个活跃的Hibernate Session,从而解决延迟加载问题。 OpenSessionInViewFilter是一个重要的组件,...

Global site tag (gtag.js) - Google Analytics