首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

WebWork 學習筆記(八):xwork.xml 控制器配置深度解析

     編輯:Java 綜合教學

xwork.xml 架構概覽

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>

子配置結構(以 user.xml 為例)

<!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>

核心元素詳細說明

1. <package>:模組化命名空間

  • name:邏輯模組名,不可重複。
  • extends:繼承基礎包(如 webwork-default),獲得預設攔截器、結果類型等。
  • namespace(未顯式寫入時預設為 /):對應 URL 路徑前綴,如 namespace="/user" → 訪問 /user/*.action。好處:避免多模組 Action 名稱衝突,體現模組化。

2. <action>:請求處理單元

  • name:Action 名稱,對應 URL 片段(如 dirUser → /user/dirUser.action)。
  • class:處理類完整限定名。
  • method(可省略,預設 execute):指定處理方法。

3. <result>:視圖解析與流向控制

ServletDispatcher 是核心機制,Result 代表 Action 返回的邏輯狀態字串(success、error 等)。

type必要參數行為描述
dispatcherlocation轉發至 JSP,保留 Request 屬性,Action 數據可直接被頁面使用。
redirectlocation瀏覽器重定向,Request 屬性丟失,URL 變更。
chainactionName, namespaceAction 鏈:將執行上下文傳遞給另一個 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>

4. 攔截器:橫切關注點注入

三大常用攔截器堆疊:

  1. defaultStack:預設表單處理,自動將請求參數綁定至 Action 屬性(需繼承 ActionSupport)。
  2. modelDrivenStack:模型驅動,Action 需實作 ModelDriven 介面,getModel() 返回領域物件,參數直接綁定至該物件屬性。
  3. uploadStack:檔案上傳,自動處理 multipart/form-data,將檔案映射為 File 屬性。

defaultStack 實戰

<!-- 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; }
}

modelDrivenStack 實戰

<!-- 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; }
}

uploadStack 實戰

<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 框架的核心架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved