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

Struts 2 核心配置詳解:從工作原理到結果類型全攻略

     編輯:Java 綜合教學

一、Struts 2 工作流程核心圖解

Struts 2 採用過濾器攔截請求,核心流程如下:

  1. 客戶端發起請求,經過一系列過濾器(含可選的 ActionContextCleanUp,利於 SiteMesh 等插件整合)。
  2. FilterDispatcher 接管請求,委託 ActionMapper 判斷是否需調用 Action。
  3. 若需調用,FilterDispatcher 將處理權交給 ActionProxy。
  4. ActionProxy 透過 Configuration Manager 讀取配置,定位 Action 類。
  5. 建立 ActionInvocation 實例,按命名模式調用 Action,過程中穿插攔截器(Interceptor)執行。
  6. Action 執行完畢,ActionInvocation 根據 struts.xml 尋找對應結果(通常為 JSP/FreeMarker),過程中可使用 Struts 標籤。

所有物件(Action、Result、Interceptor 等)均由 ObjectFactory 創建。

Struts2 工作流程圖

二、struts.xml 核心配置詳解

2.1 常用常量配置

<struts>
    <!-- 開發模式,輸出詳細錯誤 -->
    <constant name="struts.devMode" value="true" />
    <!-- 國際化編碼 -->
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    <!-- 允許 OGNL 訪問靜態方法 -->
    <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
    <!-- 處理的請求後綴,預設 action -->
    <constant name="struts.action.extension" value="action"/>
    <!-- 瀏覽器靜態資源緩存,開發關閉 -->
    <constant name="struts.serve.static.browserCache" value="false"/>
    <!-- 配置文件熱重載 -->
    <constant name="struts.configuration.xml.reload" value="true"/>
    <!-- 預設 UI 主題 -->
    <constant name="struts.ui.theme" value="simple"/>
    <!-- Spring 管理 Action -->
    <constant name="struts.objectFactory" value="spring"/>
    <!-- 關閉動態方法調用 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
    <!-- 上傳檔案大小限制 -->
    <constant name="struts.multipart.maxSize" value="10701096"/>
    <!-- 模組化引入子配置 -->
    <include file="cn/qjc/action/login/login.xml"/>
    <include file="cn/qjc/action/demo/demo01.xml"/>
    <include file="cn/qjc/interceptor/interceptor.xml"/>
</struts>

2.2 配置文件載入優先順序(後覆蓋前)

  1. default.properties(核心 JAR 內,唯讀)
  2. struts-default.xml(核心 JAR 內,唯讀)
  3. struts-plugin.xml(插件 JAR 內,唯讀)
  4. struts.xml(專案 src 根目錄,**推薦**)
  5. struts.properties(專案根目錄,不推薦)
  6. web.xml filter 參數(不推薦)

struts.xml 載入過程

三、Package 與 Action 配置

3.1 <package> 元素

  • name:唯一標識
  • extends:繼承父包,通常需直接/間接繼承 struts-default,否則核心功能失效
  • abstract:無 Action 子元素可聲明為抽象包
  • namespace:命名空間,以 / 開頭,訪問路徑 = namespace + action 名稱;空字串為預設命名空間

3.2 <action> 配置

  • name:動作名稱,包內唯一
  • class:Action 類全名,預設 ActionSupport
  • method:執行方法,預設 execute()
<package name="default" extends="struts-default" abstract="true">
    <global-results>
        <result name="success">/WEB-INF/login/success.jsp</result>
    </global-results>
</package>
<package name="login" namespace="/user" extends="default">
    <action name="login" class="cn.qjc.action.login.Login" method="login">
        <result name="success" type="dispatcher">/WEB-INF/login/success.jsp</result>
        <result name="error">/WEB-INF/login/error.jsp</result>
    </action>
</package>

四、Action 類編寫三種方式

  1. POJO:普通 JavaBean,無需實現介面。
  2. 實現 Action 介面:需實現 execute(),提供 SUCCESS 等常數。
  3. 繼承 ActionSupport(推薦):內建驗證、國際化、預設 execute() 返回 success 等功能。

ActionSupport 實現了 Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable 等介面。若 <action> 未指定 class,框架會使用 struts-default.xml 中定義的 <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />。

五、結果類型(Result Types)全解析

Struts 預設提供 10 種結果類型(struts-default.xml 定義),預設為 dispatcher(請求轉發)。

5.1 常用類型

類型說明典型用法
dispatcher請求轉發(預設)<result>/page.jsp</result> 或 <param name="location">/page.jsp</param>
redirect重定向,丟失請求參數/屬性不可重定向到 /WEB-INF/ 下資源
redirectAction重定向到另一 Action支援 actionName、namespace 參數
chainAction 鏈轉發到另一 Action 並保留狀態
stream檔案下載配合 inputName 等參數
freemarker/velocity模板引擎頁面靜態化
plainText純文本輸出輸出原始碼

5.2 自定義結果類型步驟

  1. 實現 com.opensymphony.xwork2.Result(建議繼承 StrutsResultSupport),重寫 doExecute。
  2. 在 <result-types> 中聲明:<result-type name="captcha" class="cn.qjc.action.demo.Demo02"/>
  3. Action 中使用:<result name="success" type="captcha"><param name="width">200</param></result>

範例:驗證碼圖片直接輸出到響應流。

自定義結果類型流程

六、Action 原型模式(多例)

Struts 2 的 Action 預設為**多例**(Prototype):每次請求創建新實例,天然線程安全。驗證方式:在構造函數輸出日誌,連續請求兩次觀察是否打印兩次。

public class MoreInstanceAction extends ActionSupport {
    public MoreInstanceAction() { System.out.println("create new action"); }
    public String execute() { System.out.println("more instance action"); return SUCCESS; }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved