openview失效

handawei_5發表於2010-05-31
我原來用struts/spring/hibernate的時候同樣使用OpenSessionInView,但是似乎沒有robbin所說的問題啊。而且我在使用的時候,是ContextLoaderListener和ContextLoaderPlugIn一起用的。整個配置如下: 1.首先是web.xml Java程式碼 1.<filter> 2. <filter-name>OpenSessionInViewFilter</filter-name> 3. <filter-class>org.springframework.orm.hibernate.support.OpenSessionInViewFilter</filter-class> 4. </filter> 5. 6. <filter-mapping> 7. <filter-name>OpenSessionInViewFilter</filter-name> 8. <url-pattern>/*</url-pattern> 9. </filter-mapping> 10. 11. <listener> 12. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 13.</listener> 14. 15...... <filter><filter-name>OpenSessionInViewFilter</filter-name><filter-class>org.springframework.orm.hibernate.support.OpenSessionInViewFilter</filter-class></filter><filter-mapping><filter-name>OpenSessionInViewFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener> ...... 2. 然後是struts-config.xml: Java程式碼 1.<plug-in classname="org.springframework.web.struts.ContextLoaderPlugIn"> 2. <set-property property="contextConfigLocation" value="/WEB-INF/action-servlet.xml"></set-property> 5.</plug-in><plug-in classname="org.springframework.web.struts.ContextLoaderPlugIn"><set-property property="contextConfigLocation" value="/WEB-INF/action-servlet.xml"></set-property></plug-in> 其餘部分省略。 在上述配置下,使用OpenSessionInView似乎沒有問題。 不知道robbin所說的ContextLoaderListener和ContextLoaderPlugIn不應該同時使用是不是做得是如下的配置:(struts-config.xml) Java程式碼 1.<plug-in> 3.<set-property property="contextConfigLocation"></set-property> 6.</plug-in><plug-in classname="org.springframework.web.struts.ContextLoaderPlugIn"><set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml, /WEB-INF/action-servlet.xml"></set-property></plug-in> 我嘗試了一下,用這種配置時,OpenSessionInView的確失效了。 我猜想,原因大概是這樣:struts的這個plugIn,可能只是為了整合一個action-servlet.xml,將action-servlet.xml中的定義當作Spring的bean來使用,因此,在儲存時,只要有action-servlet.xml的配置,就被儲存到robbin所提到的那個attrName中,而不是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE中,所以,OpenSessionInView是取不到這個配置的。 那麼這個配置什麼時候被取到呢?直覺告訴我,可能是和Action的Proxy有關。於是,檢視了org.springframework.web.struts.DelegatingActionProxy的原始碼,果然: Java程式碼 1./** 2. * Return the delegate Action for the given mapping. 3. *

The default implementation determines a bean name from the 4. * given ActionMapping and looks up the corresponding bean in the 5. * WebApplicationContext. 6. * @param mapping the Struts ActionMapping 7. * @return the delegate Action 8. * @throws BeansException if thrown by WebApplicationContext methods 9. * @see #determineActionBeanName 10. */ 11. protected Action getDelegateAction(ActionMapping mapping); throws BeansException { 12. WebApplicationContext wac = getWebApplicationContext(getServlet();, mapping.getModuleConfig(););; 13. String beanName = determineActionBeanName(mapping);; 14. return (Action); wac.getBean(beanName, Action.class);; 15. } 16. 17. /** 18. * Fetch ContextLoaderPlugIn's WebApplicationContext from the 19. * ServletContext, containing the Struts Action beans to delegate to. 20. * @param actionServlet the associated ActionServlet 21. * @param moduleConfig the associated ModuleConfig 22. * @return the WebApplicationContext 23. * @throws IllegalStateException if no WebApplicationContext could be found 24. * @see DelegatingActionUtils#getRequiredWebApplicationContext 25. * @see ContextLoaderPlugIn#SERVLET_CONTEXT_PREFIX 26. */ 27. protected WebApplicationContext getWebApplicationContext( 28. ActionServlet actionServlet, ModuleConfig moduleConfig); throws IllegalStateException { 29. return DelegatingActionUtils.getRequiredWebApplicationContext(actionServlet, moduleConfig);; 30. } /** * Return the delegate Action for the given mapping. *

The default implementation determines a bean name from the * given ActionMapping and looks up the corresponding bean in the * WebApplicationContext. * @param mapping the Struts ActionMapping * @return the delegate Action * @throws BeansException if thrown by WebApplicationContext methods * @see #determineActionBeanName */ protected Action getDelegateAction(ActionMapping mapping); throws BeansException { WebApplicationContext wac = getWebApplicationContext(getServlet();, mapping.getModuleConfig(););; String beanName = determineActionBeanName(mapping);; return (Action); wac.getBean(beanName, Action.class);; } /** * Fetch ContextLoaderPlugIn's WebApplicationContext from the * ServletContext, containing the Struts Action beans to delegate to. * @param actionServlet the associated ActionServlet * @param moduleConfig the associated ModuleConfig * @return the WebApplicationContext * @throws IllegalStateException if no WebApplicationContext could be found * @see DelegatingActionUtils#getRequiredWebApplicationContext * @see ContextLoaderPlugIn#SERVLET_CONTEXT_PREFIX */ protected WebApplicationContext getWebApplicationContext( ActionServlet actionServlet, ModuleConfig moduleConfig); throws IllegalStateException { return DelegatingActionUtils.getRequiredWebApplicationContext(actionServlet, moduleConfig);; } 仔細看其中的取wac的程式碼,它並不是從WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE取的wac。 由此,我相信,除了robbin講的修改原始碼以外,同時使用ContextLoaderListener和ContextLoaderPlugIn,但是不要在ContextLoaderPlugIn裡面加入applicationContext.xml,只要加入你的action-servlet.xml,我相信,同樣也可以非常流暢的使用OpenSessionInView

相關文章