Struts 2 採用攔截器鏈模式:請求進入 → 依序執行配置的攔截器 intercept() → 執行 Action → 依逆序返回。每個攔截器可決定是否繼續鏈 (invocation.invoke()) 或直接返回結果碼短路。
| 名稱 | 類別 | 功能 |
|---|---|---|
| exception | ExceptionMappingInterceptor | 將例外對應至結果頁面 |
| alias | AliasInterceptor | 別名參數映射 |
| servletConfig | ServletConfigInterceptor | 注入 Servlet API (Request/Response/Session) |
| prepare | PrepareInterceptor | 呼叫 Preparable.prepare() |
| i18n | I18nInterceptor | 語系解析與切換 |
| chain | ChainingInterceptor | Action 鏈傳遞狀態 |
| debugging | DebuggingInterceptor | 支援 debug=xml 等除錯模式 |
| profiling | ProfilingInterceptor | 效能分析 |
| scopedModelDriven | ScopedModelDrivenInterceptor | ModelDriven 作用域管理 |
| modelDriven | ModelDrivenInterceptor | 將 Model 物件推入 ValueStack |
| fileUpload | FileUploadInterceptor | 多部分檔案上傳處理 |
| checkbox | CheckboxInterceptor | 處理未勾選 Checkbox 的 false 值 |
| staticParams | StaticParametersInterceptor | 靜態參數注入 Action |
| params | ParametersInterceptor | 請求參數綁定 Action 屬性 (排除 dojo.*) |
| conversionError | ConversionErrorInterceptor | 類型轉換錯誤收集 |
| validation | ValidationInterceptor | 驗證框架 (排除 input/back/cancel/browse) |
| workflow | WorkflowInterceptor | 驗證失敗導向 input 結果 |
<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<interceptor-ref> 時,自動使用 defaultStack<interceptor-ref>,預設堆疊失效,需自行重新引用所需攔截器 (含 defaultStack)<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。
自動呼叫 Action 的 setXxx() 對應 name=xxx 表單欄位。若自定堆疊必須顯式引用。
<action name="first" class="action.FirstAction">
<param name="who">比爾</param>
<interceptor-ref name="static-params"/>
</action>
啟動時注入 setWho("比爾"),不依賴請求參數。
<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>
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;
}
}