Hibernate/Spring/Struts架构使用OpenSessionInView的问题

转载 2007年09月11日 18:36:00
 今天有一个朋友问了我一个问题,他使用的是Hibernate/Spring/Struts架构,配置使 用Spring的OpenSessionInView Filter,但是发现不生效,lazy的集合属性在页面访问的时候仍然报session已经关闭的错误。我和他一起检查了所有的配置和相关的代码,但是 没有发现任何问题。经过调试发现,应用程序使用的Session和OpenSessionInView Filter打开的Session不是同一个,所以OpenSessionInView模式没有生效,但是为什么他们不使用同一个Session呢?

检查了一遍Spring的相关源代码,发现了问题的根源:

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

xml代码: 

         < listener >  
                
< listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class >  
        
</ listener >

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

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

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

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

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

ContextLoaderListener初始化spring配置,然后把它放在ServletContext对象里面保存:

java代码: 

servletContext.setAttribute( 
                                        WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, 
this .context);


请注意,保存的对象的key是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE!

但是ContextLoaderPlugIn初始化spring配置,然后把它放在ServletContext对象里面保存:

java代码: 


String attrName  =  getServletContextAttributeName(); 
getServletContext().setAttribute(attrName, wac);
这个attrName和WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE名字是不一样的!

如果仅仅是名字不一样,问题还不大,你仍然可以放心使用ContextLoaderPlugIn,但是当你使用OpenSessionInView的时候,OpenSessionInViewFilter是使用哪个key取得spring配置的呢?

java代码: 

WebApplicationContext wac  =  
                                WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
显然,OpenSessionInViewFilter是按照WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE这个key去拿spring配置的!

我们整理一下思路:

ContextLoaderPlugIn保存spring配置的名字叫做attrName;
,ContextLoaderListener保存spring配置的名字叫做WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE;
而OpenSessionInView是按照WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE这个名字去取得spring配置的!
而你的应用程序却是按照attrName去取得spring的配置的!

所以,OpenSessionInView模式失效!

解决办法:
修改ContextLoaderPlugIn代码,在getServletContext().setAttribute(attrName, wac);这个地方加上一行代码:
getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);

或者修改OpenSessionInViewFilter,让它按照attrName去取得spring配置。

Hibernate/Spring/Struts架构使用OpenSessionInView的问题

今天有一个朋友问了我一个问题,他使用的是Hibernate/Spring/Struts架构,配置使用Spring的 OpenSessionInView Filter,但是发现不生效,lazy的集合属性...
  • shakesvongreen
  • shakesvongreen
  • 2007年08月28日 13:11
  • 688

用 OpenSessionInViewInterceptor 的思路解决 Spring框架中的Hibernate Lazy

众所周知, 为了解决 Hibernate Lazy 问题, Spring 中引入了 OpenSessionInViewInterceptor, 这样虽然解决了页面上的 Lazy Load 问题,却增加...
  • xzknet
  • xzknet
  • 2007年03月28日 21:06
  • 8483

Hibernate/Spring/Struts架构使用OpenSessionInView的问题

今天有一个朋友问了我一个问题,他使用的是Hibernate/Spring/Struts架构,配置使用Spring的OpenSessionInView Filter,但是发现不生效,lazy的集合属性在...
  • suifeng0117
  • suifeng0117
  • 2010年03月24日 10:49
  • 411

使用struts、hibernate、spring进行框架整合流程详细说明

SSH框架应用非常广泛,是目前较流行的一种Web应用程序开源框架。很多公司很多项目都会用到这3种框架,那么如何正确规范的使用这三种框架开发实际的项目呢?下面介绍struts、hibernate、spr...
  • sinat_24578249
  • sinat_24578249
  • 2016年05月28日 16:06
  • 875

Struts+Spring+Hibernate整合入门详解

Java 5.0 Struts 2.0.9Spring 2.0.6Hibernate 3.2.4                                              作者:  L...
  • princewong
  • princewong
  • 2007年08月12日 16:05
  • 46713

用Struts,Spring和hibernate实现登录操作

刚刚接触Java web 开发,写了一个登录界面,谈谈自己做的时候的一些 感受和具体步骤。  写一个登录的功能首先得有一个页面吧 0.配置环境,因为我是用的myeclipse 我全部是通过myec...
  • qq_32285991
  • qq_32285991
  • 2017年04月23日 21:53
  • 529

Spring ,struts和hibernate的区别

一、Spring  Spring注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的Inversion of Control容器。Spring在使 用Io...
  • qq19931130
  • qq19931130
  • 2014年02月13日 16:28
  • 1874

struts+spring+hibernate之间的关系与差别

Struts:用来作VC部分,即控制和显示作用; Spring:用来作数据库操作的事务处理,在配置文件里配置好就OK了; Hibernate:用来作DAO处理,在此用了Spring的getHibern...
  • yjswjm119
  • yjswjm119
  • 2006年02月25日 15:46
  • 2205

Spring、Struts、Hibernate框架之间的关系是什么以及怎么处理

Spring、Struts、Hibernate框架之间的关系是什么以及怎么处理
  • qq_24452475
  • qq_24452475
  • 2016年04月05日 21:17
  • 3554

spring--openSessionInView的使用步骤

OpenSessionInView 在显示层打开session    由于hibernate存在延迟加载的问题,当dao的事物提交之后,session就关闭  此时显示层 view JSP界面需...
  • u012411414
  • u012411414
  • 2016年01月19日 14:16
  • 578
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate/Spring/Struts架构使用OpenSessionInView的问题
举报原因:
原因补充:

(最多只允许输入30个字)