一 概述 1.整合目的 將所有對象的創建與管理任務交給Spring容器,降低程式的耦合度。 2.整合途徑 將Spring容器註入到Web容器中。 3.具體實現 使用ServletContextListener監聽ServletContext,當ServletContexxt創建時同時創建Spring ...
一 概述
1.整合目的
將所有對象的創建與管理任務交給Spring容器,降低程式的耦合度。
2.整合途徑
將Spring容器註入到Web容器中。
3.具體實現
使用ServletContextListener監聽ServletContext,當ServletContexxt創建時同時創建Spring容器,並將創建完成的容器放到ServletContext即application中,在Web中獲取Spring容器,就可以訪問對象了。ContextLoadListener是ServletContextListener的一個實現類,配置:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
預設情況下,Spring的配置文件只能放在WEB-INF目錄下,名稱為applicationContext.xml,可以在web.xml文件中修改,將配置文件放在src目錄下:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:xxxx.xml</param-value> </context>
4.獲取Spring容器
WebApplicationContext context=WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
二 延時載入問題
1.原因
表示層調用Service層方法從資料庫中載入對象,如果Dao層採用了延時載入,返回一個包含null對象的代理,在視圖層訪問對象的詳情時,Service層已經執行完畢,事務已關閉,對象為空,就無法獲取對象的詳情。
2.解決方法
將Session與請求線程綁定,允許在事務關閉以後完成延時載入任務。
3.具體實現
在web.xml中配置:
<filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>opernSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>