1.直接在web.xml中配置創建spring容器
1.1 用ServletContextListener方式實現
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
如果有多個配置文件需要載入,使用<context-param>元素,ContextLoaderListener加載時,會查找名爲contextConfigLocation的參數,所以,有下面:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>
1.2 用load-on-startup Servlet方式實現
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
2.用struts plugin創建spring容器
在struts-config.xml中加入
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/action-servlet.xml(用於配置表示層上下文),/WEB-INF/applicationContext.xml"/>
</plug-in>
二.問題
如何讓控制器訪問到spring容器中的業務邏輯組件?有兩種方式2.1,2.2
2.1 spring管理控制器,並利用IOC爲控制器注入邏輯組件
2.1.1 使用spring的DelegatingRequestProcessor
在struts-config.xml中加入
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
而後,struts會接取用戶請求轉發到spring context下的bean,根據bean的name來匹配,因此在struts的action中配置type是沒用的!
如下:
<action path="/login" name="loginForm" scope="requerst" validate="true" input="/login.jsp">
<forward name="input" path="/login.jsp"/>
<forward name="welcom" path="/welcom.jsp"/>
</action>
然後在web.xml中配置:
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.1.2 使用DelegatingActionProxy(爲了避免應用程序本身就擴展了RequetstProcessor,DelegatingRequestProcessor就用不成了)
DelegatingActionProxy被配置成struts的Action(即所有請求先被ActionServlet得到),轉發到相應的Action,而Action的實現全都是DelegatingActionProxy,DelegatingActionProxy再把請求轉發給spring容器的Action.
DelegatingActionProxy不需要在struts-config.xml中配置<controller>元素,只需將action type進行如下配置:
<action path="/login" name="loginForm" scope="requerst" validate="true" input="/login.jsp" type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="input" path="/login.jsp"/>
<forward name="welcom" path="/welcom.jsp"/>
</action>
2.2 使用srping的ActionSupport代替struts 的Action
這種方式下,struts的Action不受spring Ioc容器管理,Action代碼與spring API部分耦合(造成代碼污染),但其增強了代碼的可讀性,Action代碼中顯示調用業務邏輯組件,無需等容器注入。
例如:
public class LoginAction extends ActionSupport { //繼承spring的ActionSupport
public LoginAction()
{
//不可在構造方法中調用getWebApplicationContext()
}
private LoginService loginService; //將業務邏輯組件對象作爲成員變量
public LoginService getLoginService()
{
return (LoginService)getWebApplicationContext().getBean("loginService");
}
//重寫execute()方法
}
struts-config.xml中<action>元素正常配置