在一般WEB应用中使用Spring
与Struts集成
在视图中访问延迟加载的数据
-----------------------------
在一般WEB应用中使用Spring
Spring提供的Web应用核心组件:
ContextLoaderListener
在应用启动时实例化ApplicationContext
将 ApplicationContext 实例设置给ServletContext
WebApplicationContextUtil
访问ServletContet中的ApplicationContext实例
实施步骤:
首先,实现一个web应用,区分 MVC ;
然后,使用 Spring 管理 Model :
1) 配置监听器实例化 ApplicationContext
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2) 访问 ApplicationContext 实例
WebApplicationContext context=
WebApplicationContextUtils
.getWebApplicationContext(this.getServletContext());
与Struts 集成
意义:
辅助 Action 获得 bean
集成方式:
首先,仍设置ContextLoaderListener
然后,Action 有 两种方式获得 bean
1) Spring 不管理Action,则Action类:
XxAction extends ActionSupport
继承了一个方法 :getWebApplicationContext
令外可选择 :
DispatchActionSuport
LookupDispatchActionSupport
MappingDispatchActionSupport
优点:结构清楚简单,容易理解
2) 让 Spring 管理 Action ,有两种方案:
A)使用 DelegatingRequetProcessor
它改写了父类的 processActionCreate
protected Action processActionCreate(){
return applicationContext.getBean("/actionPath");
}
如果同时使用Tiles可以选择DelegatingTilesRequestProcessor
B)使用 DelegatingActionProxy
作为所有 path 映射的type:
<action path="/xxAction" type="DelegatingActionProxy" .../>
它的execute方法基本结构:
public ActionForward execute(..){
targetAction=applicationContext.getBean("/actionPath");
return targetAction.execute(..);
}
Action 的IOC配置应置于单独的文件中
Spring 提供 ContextLoaderPlugIn 加载此配置文件:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/strutsContext.xml"/>
</plug-in>
在视图中访问延迟加载的数据
集成Hibernate时,当事务结束时session被关闭。
若需要在视图中访问延迟加载的数据,则需延迟关闭Session
OpenSessionInViewFilter 可提供此服务
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>