WebWork(Struts 1 前身)以 xwork.xml 為核心配置骨架,透過 <include> 引入模組化子配置,實現大型專案的可維護性。
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "https://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<include file="webwork-default.xml"/>
<include file="common.xml"/>
<include file="user.xml"/>
</xwork>
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "https://www.opensymphony.com/xwork/xwork-1.0.dtd">
<xwork>
<package name="user" extends="webwork-default" systemId="1001" caption="用戶管理">
<default-interceptor-ref name="defaultStack"/>
<action name="dirUser" class="com.rambo.app.base.user.action.DirUser" caption="查詢用戶" event-type="5">
<result name="success" type="dispatcher"><param name="location">/user/diruser.jsp</param></result>
<result name="error" type="redirect"><param name="location">doError.action</param></result>
</action>
<action name="addUser" class="com.rambo.app.base.user.action.AddUser" caption="添加用戶" event-type="3">
<result name="success" type="dispatcher"><param name="location">/result.jsp</param></result>
<result name="error" type="dispatcher"><param name="location">/result.jsp</param></result>
<interceptor-ref name="modelDrivenStack"/>
</action>
</package>
</xwork>
webwork-default),獲得預設攔截器、結果類型等。/):對應 URL 路徑前綴,如 namespace="/user" → 訪問 /user/*.action。好處:避免多模組 Action 名稱衝突,體現模組化。dirUser → /user/dirUser.action)。execute):指定處理方法。ServletDispatcher 是核心機制,Result 代表 Action 返回的邏輯狀態字串(success、error 等)。
| type | 必要參數 | 行為描述 |
|---|---|---|
| dispatcher | location | 轉發至 JSP,保留 Request 屬性,Action 數據可直接被頁面使用。 |
| redirect | location | 瀏覽器重定向,Request 屬性丟失,URL 變更。 |
| chain | actionName, namespace | Action 鏈:將執行上下文傳遞給另一個 Action 繼續處理。 |
<!-- dispatcher 簡寫 -->
<result name="success" type="dispatcher">userinfo.jsp</result>
<!-- redirect -->
<result name="error" type="redirect">../userinfo.jsp</result>
<!-- chain -->
<result name="success" type="chain">
<param name="actionName">rambo</param>
</result>
三大常用攔截器堆疊:
ActionSupport)。ModelDriven 介面,getModel() 返回領域物件,參數直接綁定至該物件屬性。multipart/form-data,將檔案映射為 File 屬性。<!-- JSP 表單 -->
<input name="sysId" />
<input name="gUser.email" /> <!-- OGNL 表達式綁定巢狀屬性 -->
<!-- xwork.xml -->
<action name="login" class="com.rambo.app.user.login.LoginAction">
<interceptor-ref name="defaultStack"/>
</action>
<!-- Java Action -->
public class LoginAction extends ActionSupport {
private Integer sysId;
public GUser gUser = new GUser(); // 需預先實例化
public String execute() { return Action.SUCCESS; }
}
<!-- JSP 表單欄位直接對應 User 屬性 -->
<input name="email" /> <input name="realName" />
<!-- xwork.xml -->
<action name="editUserInfo" class="com.rambo.app.user.info.EditUserInfo">
<interceptor-ref name="modelStack"/>
</action>
<!-- Java Action -->
public class EditUserInfo extends ActionSupport implements ModelDriven {
private GUser info = new GUser();
public Object getModel() { return info; }
}
<form action="uploadUserImg.action" method="post" ENCTYPE="multipart/form-data">
<input type="file" name="uploadFile" />
</form>
<action name="uploadUserImg" class="com.rambo.app.user.info.UploadUserImg">
<interceptor-ref name="uploadStack"/>
</action>
public class UploadUserImg extends ActionSupport {
private Integer userId;
private File uploadFile; // 自動注入上傳檔案
}
WebWork 的 xwork.xml 以包、動作、結果、攔截器四大元素構建清晰的 MVC 控制層配置,其模組化、攔截器堆疊、結果類型多樣化等設計思想直接繼承至 Struts2,理解之有助於掌握現代 MVC 框架的核心架構。