spring對struts的內建主要是把它的依賴注入(Ioc)功能服務于struts數量衆多的Action類,來為Action注入業務類對象。
我們知道,對于普通的Java類,由Ioc來建立和管理對象,給我們提供了極大的友善;但是,我們在使用struts時,Action類的對象是由struts幫我們建立和管理的,這就産生了尖銳的沖突。spring通過提供代理類DelegatingActionProxy,配置在struts-config.xml中<action>标簽的type屬性,當struts再需要action對象時,它在type裡找到的不是相應的Action類,而是Action的代理DelegatingActionProxy,這個代理會到spring配置檔案中找name屬性等于struts-config.xml的<action>标簽path指定的路徑的<bean>, 然後到Ioc容器中找到相應的action對象給struts,當然,由spring給提供的action自然可以輕松完成業務對象的注入,隻不過要求我們在寫Action類時給它聲明一個沒有初始化的業務類執行個體及其setter方法。就這樣,“狡猾的”spring在不“得罪”struts的情況下,巧妙的“攫取”了對Action對象的建立和管理權限。
一個登陸小程式。
1.登陸頁面:
login.jsp
</html>
<body>
<form action="login.do" method="post">
使用者名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
<input type="submit" value="登入">
</form>
</body>
</html>
2.FormBean類:
LoginActionForm.java
public class LoginActionForm extends ActionForm {
private static final long serialVersionUID = -367009923055443789L;
private String username;
private String password;
//一系列的setter/getter方法
}
3.Action類:
LoginAction.java
public class LoginAction extends Action {
private UserManager um;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginActionForm laf = (LoginActionForm) form;// 用request也能取得資料,但是ActionForm會幫我們進行資料類型的轉化,是以struts一般還是使用ActionForm
um.login(laf.getUsername(), laf.getPassword());
return mapping.findForward("success");
}
public void setUm(UserManager um) {
this.um = um;
4. 業務類:
UserManagerImpl.java
public class UserManagerImpl implements UserManager {
public void login(String username, String password) {
//這裡隻是簡單列印一下參數代替業務處理
System.out.println("UserManagerImpl.login:username="+username+",password="+password);
5.struts配置檔案
struts-config.xml
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.sxt.spring.struts.usermgr.forms.LoginActionForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/login"
type="org.springframework.web.struts.DelegatingActionProxy"
name="loginForm"
scope="request"
>
<forward name="success" path="/success.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="MessageResources" />
</struts-config>
6.pring 的配置檔案:
applicationContext-actions.xml
<bean name="/login" class="com.sxt.spring.struts.usermgr.actions.LoginAction" scope="prototype">
<!-- 推薦scope設定成prototype,這樣每次在使用action時都會建立一個執行個體,性能上損失并不多,
但是這就完全避免了線程安全問題了,可以随心所欲的在action中使用成員變量
-->
<property name="um" ref="userManager"></property>
</bean>
applicationContext-beans.xml
<bean id="userManager" class="com.sxt.spring.struts.usermgr.manager.UserManagerImpl"></bean>
7.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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>
<param-name>detail</param-name>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
<!-- 預設找/WEB-INF/applicationContext.xml -->
classpath*:applicationContext-*.xml,/WEB-INF/applicationContext-*.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
本文轉自NightWolves 51CTO部落格,原文連結:http://blog.51cto.com/yangfei520/285772,如需轉載請自行聯系原作者