Struts 2 中的 Result 負責 Action 執行後的視圖導向。掌握四大常用 Result 類型——dispatcher、redirect、chain、redirectAction 的差異,是掌握 Struts 2 流程控制的關鍵。
| 類型 | 跳轉方式 | 瀏覽器 URL | 請求次數 | 適用場景 |
|---|---|---|---|---|
| dispatcher | 伺服器端轉發 | Action URL | 1 次 | 預設類型,JSP 頁面渲染 |
| redirect | 客戶端重導向 | JSP 實際路徑 | 2 次 | 需改變 URL、防止表單重複提交 |
| chain | Action 鏈轉發 | Action URL | 1 次 | Action 間傳遞數據、流程串聯 |
| redirectAction | 重導向到 Action | 目標 JSP 路徑 | 2 次 | 跨模組導向、REST 風格 URL |
<struts>
<constant name="struts.devMode" value="true" />
<package name="resultTypes" namespace="/r" extends="struts-default">
<!-- dispatcher:伺服器端轉發,URL 保持 Action 路徑 -->
<action name="r1">
<result type="dispatcher">/r1.jsp</result>
</action>
<!-- redirect:客戶端重導向,URL 變為 JSP 路徑 -->
<action name="r2">
<result type="redirect">/r2.jsp</result>
</action>
<!-- chain:Action 鏈轉發,共享請求上下文 -->
<action name="r3">
<result type="chain">r1</result>
</action>
<!-- redirectAction:重導向到另一 Action -->
<action name="r4">
<result type="redirectAction">r2</result>
</action>
</package>
</struts>
伺服器內部轉發,RequestDispatcher.forward()。請求物件、參數、屬性完整保留,瀏覽器地址列不變。適合同一請求內的頁面跳轉。
客戶端重導向,HttpServletResponse.sendRedirect()。伺服器回傳 302 狀態碼與新 Location,瀏覽器發起第二次請求。原請求物件銷毀,需透過 Session 或閃存傳值。適用於:
Action 鏈,ActionChainResult。以 forward 方式調用另一 Action,共享同一請求上下文(request、parameters)。目標 Action 可在同包或不同包(需完整命名空間)。適用於多步驟業務流程串聯。
重導向到另一 Action,ServletActionRedirectResult。本質是 redirect,但目標是 Action 名稱而非 JSP 路徑。框架會根據目標 Action 的結果自動解析最終 JSP。支援攜帶參數:<param name="id">123</param>。
理解四大 Result 類型的底層機制(forward vs redirect)、請求生命週期影響、URL 變化,能幫助你在 Struts 2 專案中做出正確的流程控制決策。