请教open session in view

05-08-30 sha1979
刚刚接触Spring,我想做个练习,但总出错;

struts1.1 + hibernate3+spring1.2.1+Tomcat5

我想使用open session in view模式

hibernate中以设置成lazy="true"。

抱错:session 以关闭

配置如下

web.xml

?xml version="1.0" encoding="UTF-8"?

!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"

web-app

display-name wish /display-name

context-param

param-name contextConfigLocation /param-name

param-value /WEB-INF/applicationContext.xml /param-value

/context-param

filter

filter-name hibernateFilter /filter-name

filter-class org.springframework.orm.hibernate3.support.OpenSessionInViewFilter /filter-class

init-param

param-name singleSession /param-name

param-value false /param-value

/init-param

/filter

filter-mapping

filter-name hibernateFilter /filter-name

url-pattern *.do /url-pattern

/filter-mapping

listener

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

/listener

servlet

servlet-name action /servlet-name

servlet-class org.apache.struts.action.ActionServlet /servlet-class

init-param

param-name config /param-name

param-value /WEB-INF/struts-config.xml /param-value

/init-param

init-param

param-name debug /param-name

param-value 2 /param-value

/init-param

init-param

param-name application /param-name

param-value ApplicationResources /param-value

/init-param

load-on-startup 2 /load-on-startup

/servlet

servlet-mapping

servlet-name action /servlet-name

url-pattern *.do /url-pattern

/servlet-mapping

.........................

...........................

/web-app

struts-config.xml如下

?xml version="1.0" encoding="UTF-8"?

!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"

"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"

struts-config

form-beans

form-bean name="lazyForm" type="sixhero.actionForm.LazyForm" /

/form-beans

action-mappings

action name="lazyForm" path="/test/lazyAction" scope="request"

type="org.springframework.web.struts.DelegatingActionProxy"

forward name="ok" path="/test/ok.jsp" /

forward name="no" path="/test/no.jsp" /

/action

/action-mappings

message-resources parameter="ApplicationResources" /

plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"

set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /

/plug-in

/struts-config

ok.jsp如下

%@ page contentType="text/html; charset=GB2312" %

%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %

%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %

%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %

%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %

%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %

%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %

html

head

title

ok

/title

/head

body bgcolor="ffffff"

logic:notEmpty name="list"

logic:iterate id="temp" name="list"

bean:write name="temp" property="UserName"/

br

bean:write name="temp" property="forumDescript"/

br

br

bean:write name="temp" property="Order.name" filter="true"/

br

br

/logic:iterate

/logic:notEmpty

/body

/html

Order.name总是抱错

1
banq
2005-08-30 17:29
是小写的order.name

sha1979
2005-09-01 10:33
谢谢您的回答:我试了.我哪个关连字段是Order

struts能不能用open session in view,是不是只有用spring mvc才能用.struts中应该怎么用?或哪里有相关的例子.

banq
2005-09-01 10:49
open session in view是你必须做一种过滤器,一直保持Hibernate的session打开,这和Spring有什么关系?Spring是个可有可无的东西,只不过它开发很多方便的API。

在struts中,Jsp中的order的意思不是你的关联字段,而是相应的getOrder方法,将get去除,O变成小写,所以无论你的字段是大小写,反正Jsp中order是小写,试试一下就知道了。

sha1979
2005-09-01 10:52
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

这个类是否就是Filter,直接用可不可以。

banq
2005-09-01 10:55
直接用可以:

http://www.jroller.com/page/cardsharp?entry=open_session_in_view_pattern

Open session in view是Hibernate中很丑陋的东西,对于Open session in view解决方案,Jdon框架是采取ID集合查询的方式,这样在需要时根据ID再查询数据库,而不是为了以后获取保持数据库一直打开,有性能陷阱。

banq
2005-09-01 10:58
亏得Gavin King想得出来,还把它上升为模式,自说自话妄图铁板钉钉,这种模式实际是反模式的。不多谈...

sha1979
2005-09-01 10:59
我知道是po与vo的问题,网上也有类似的讨论。我只是现做一做,看能不能实现。

sha1979
2005-09-01 11:06
您能告诉我struts+hibernate+spring中可不可以实现,若可以我会试着做。但今后不会采用该方法解决问题。

很高兴与您讨论问题。

banq
2005-09-01 11:13
任何稀奇古怪的方案都是可以实现的。

我觉得你的问题有些主次不分,open session in view是hibernate为掩饰自己的设计缺点而提出的一个修补方案,它怎么能成为一个整体架构追求实现的目标呢?

Struts等MVC模式框架都是透明的,基于Jsp/Web技术,只要符合J2EE标准的技术有什么不可以实现的呢?

sha1979
2005-09-01 11:25
明白了 open session in view 只是hibernate为在view层打开的一种连接的实现.与strus无关.

这个问题不占您的时间了.

end

banq
2006-10-14 14:01
open session in view 是有性能陷阱的,使用时需要特别注意,那么有没有其他实现懒加载的方式,见下帖讨论:

http://www.jdon.com/jive/thread.jsp?forum=91&thread=28955

sashalin
2006-11-30 19:34

open session in view 不是一直保持Hibernate的session打开,而是保持它在一个request/response cycle中打开,比较常见的应用情况是在编辑页面点击保存按钮后,先执行一个保存的SERVLET,后通过FORWORD显示保存后的信息。利用过滤器让显示的内容全部读入内存后再COMMIT这个TRANSACTION,这样就可以避免在JSP里面读到某个对象的LAZY LOADING的关联对象时候出现LazyInitializationException: Session has been closed 之类的信息。

GAVIN 绝不会傻到将CONNECTION一直打开的地步。

而SPRING里提供了较简便的方法来实现这个PATTERN. 当然不用SPRING也可以实现啦

这当然是一个模式,在某些情况下很有用。虽然不是在所有情况下都适合。但每个模式都有其适合和不适合的地方吧。

banq 连自己都不清楚就来说有点太不厚道了吧

banq
2006-12-06 12:04
>open session in view 不是一直保持Hibernate的session打开

这个问题已经在其他帖子校正,这个session不是httpSession的意思,而是request生命周期,在这个周期中一直打开着,因为一个request周期中,经过表现层 业务层 持久层三个环节,层层环节相套,Exception等抛出出现之后,处理更加复杂。

sashalin
2006-12-06 19:23
对不起,那是我误解您的意思了,我只是觉得您这么说GAVIN有点不太公平,HIBERNATE还是很不错的

猜你喜欢
2Go 1 2 下一页