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

Struts 2 攔截器核心機制詳解:defaultStack、內建攔截器與攔截器堆疊配置

     編輯:Java 相關知識

攔截器運作原理

Struts 2 採用攔截器鏈模式:請求進入 → 依序執行配置的攔截器 intercept() → 執行 Action → 依逆序返回。每個攔截器可決定是否繼續鏈 (invocation.invoke()) 或直接返回結果碼短路。

內建攔截器一覽 (struts-default.xml)

名稱類別功能
exceptionExceptionMappingInterceptor將例外對應至結果頁面
aliasAliasInterceptor別名參數映射
servletConfigServletConfigInterceptor注入 Servlet API (Request/Response/Session)
preparePrepareInterceptor呼叫 Preparable.prepare()
i18nI18nInterceptor語系解析與切換
chainChainingInterceptorAction 鏈傳遞狀態
debuggingDebuggingInterceptor支援 debug=xml 等除錯模式
profilingProfilingInterceptor效能分析
scopedModelDrivenScopedModelDrivenInterceptorModelDriven 作用域管理
modelDrivenModelDrivenInterceptor將 Model 物件推入 ValueStack
fileUploadFileUploadInterceptor多部分檔案上傳處理
checkboxCheckboxInterceptor處理未勾選 Checkbox 的 false 值
staticParamsStaticParametersInterceptor靜態參數注入 Action
paramsParametersInterceptor請求參數綁定 Action 屬性 (排除 dojo.*)
conversionErrorConversionErrorInterceptor類型轉換錯誤收集
validationValidationInterceptor驗證框架 (排除 input/back/cancel/browse)
workflowWorkflowInterceptor驗證失敗導向 input 結果

defaultStack 定義

<interceptor-stack name="defaultStack">
  <interceptor-ref name="exception"/>
  <interceptor-ref name="alias"/>
  <interceptor-ref name="servletConfig"/>
  <interceptor-ref name="prepare"/>
  <interceptor-ref name="i18n"/>
  <interceptor-ref name="chain"/>
  <interceptor-ref name="debugging"/>
  <interceptor-ref name="profiling"/>
  <interceptor-ref name="scopedModelDriven"/>
  <interceptor-ref name="modelDriven"/>
  <interceptor-ref name="fileUpload"/>
  <interceptor-ref name="checkbox"/>
  <interceptor-ref name="staticParams"/>
  <interceptor-ref name="params">
    <param name="excludeParams">dojo\..*</param>
  </interceptor-ref>
  <interceptor-ref name="conversionError"/>
  <interceptor-ref name="validation">
    <param name="excludeMethods">input,back,cancel,browse</param>
  </interceptor-ref>
  <interceptor-ref name="workflow">
    <param name="excludeMethods">input,back,cancel,browse</param>
  </interceptor-ref>
</interceptor-stack>

預設行為

  • <package extends="struts-default"> 自動繼承 defaultStack
  • Action 未指定 <interceptor-ref> 時,自動使用 defaultStack
  • 一旦 Action 宣告任何 <interceptor-ref>,預設堆疊失效,需自行重新引用所需攔截器 (含 defaultStack)

四大常用內建攔截器實戰

1. timer - 計算執行時間

<action name="first" class="action.FirstAction">
  <interceptor-ref name="timer"/>
  <interceptor-ref name="logger"/> <!-- 放在 timer 後可計算 logger+Action 時間 -->
</action>

Console 輸出:Executed action [/test/first!execute] took 1000 ms.

需 commons-logging.jar。

2. params - 請求參數綁定

自動呼叫 Action 的 setXxx() 對應 name=xxx 表單欄位。若自定堆疊必須顯式引用。

3. static-params - 靜態參數注入

<action name="first" class="action.FirstAction">
  <param name="who">比爾</param>
  <interceptor-ref name="static-params"/>
</action>

啟動時注入 setWho("比爾"),不依賴請求參數。

4. 自訂攔截器堆疊

<package name="demo" extends="struts-default">
  <interceptors>
    <interceptor-stack name="mystack">
      <interceptor-ref name="timer"/>
      <interceptor-ref name="logger"/>
      <interceptor-ref name="params"/>
      <interceptor-ref name="static-params"/>
    </interceptor-stack>
  </interceptors>

  <action name="first" class="action.FirstAction">
    <param name="who">比爾</param>
    <interceptor-ref name="mystack"/>
  </action>
</package>

測試 Action 範例

public class FirstAction extends ActionSupport {
    private String who;
    public void setWho(String who) { this.who = who; }
    public String execute() throws Exception {
        Thread.sleep(1000); // 模擬耗時
        return SUCCESS;
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved