用戶註冊/修改後,需重定向到列表頁 (`userlist.action`) 並顯示最新數據。若直接 `return "success"` 轉發到 JSP,刷新頁面會重複提交;需用 **重定向** 打破表單重提交,但重定向會丟失 Request 屬性。
<package name="user" namespace="/" extends="struts-default">
<action name="*" class="user.TotalAction" method="{1}">
<result name="success">/WEB-INF/user/userlist.jsp</result>
<result name="modify">/WEB-INF/user/modifyit.jsp</result>
<!-- 關鍵:redirectAction 傳參 -->
<result name="list" type="redirectAction">
<param name="actionName">userlist</param> <!-- 不帶 .action 後綴 -->
<param name="namespace">/</param>
<!-- 可添加請求參數 -->
<param name="userId">${userId}</param>
</result>
</action>
</package>
public class TotalAction extends ActionSupport {
private UserDAO dao = new UserDAO();
private List<User> userList;
private User user; // 模型驅動接收表單數據
private Integer userId; // 接收重定向參數
// Getter/Setter 省略
public String userlist() {
userList = dao.getUser();
return "success";
}
public String save() {
dao.modifyUser(user);
// 返回邏輯視圖名 "list",匹配 redirectAction 結果
return "list";
}
}
| 特性 | chain | redirect | redirectAction |
|---|---|---|---|
| 機制 | 服務端轉發 (RequestDispatcher.forward) | 客戶端重定向 (response.sendRedirect) | 客戶端重定向到 Action (經 ActionMapper 解析) |
| URL 變化 | 瀏覽器地址欄**不變** | 地址欄**變為目標 URL** | 地址欄**變為目標 Action URL** |
| Request 屬性 | **保留** (同一請求) | **丟失** (新請求) | **丟失** (新請求) |
| Action 實例 | **同一實例** 繼續執行 | 新請求創建**新實例** | 新請求創建**新實例** |
| 參數傳遞 | 無需額外傳遞 (共享 Request) | 需在 URL 附加 `?param=value` | 配置 `` 或 URL 附加,支援 OGNL 表達式 |
| 適用場景 | 多 Action 協作、Wizard 流程、權限檢查後轉發 | 跳轉靜態頁、外部 URL、PRG 模式簡單跳轉 | **PRG 模式標準選擇**、跳轉到另一 Action 並傳參 |
| 語法示例 | `<result type="chain">targetAction</result>` | `<result type="redirect">target.action?param=value</result>` | `<result type="redirectAction"><param name="actionName">target</param></result>` |
<result name="list" type="redirectAction">
<param name="actionName">userlist</param>
<param name="namespace">/</param>
<param name="userId">${userId}</param> <!-- OGNL 取值自 Action 屬性 -->
</result>
public String save() {
dao.modifyUser(user);
// 手動構建重定向 URL,靈活但破壞配置集中化
return "redirect:userlist.action?userId=" + user.getUserId();
}
| 類型 | 結果值寫法 | 示例 |
|---|---|---|
| redirectAction | **僅 Action 邏輯名**,**不帶 .action 後綴** | `userlist?u_id=${userId}` |
| redirect | **完整 URL 路徑**,**需帶 .action 後綴** | `userlist.action?u_id=${userId}` |
原因: `redirectAction` 由 `ActionMapper` 解析生成最終 URL,而 `redirect` 直接調用 `sendRedirect`,需開發者手寫完整映射路徑。
掌握 `redirectAction` 的參數傳遞機制與三種跳轉本質差異,是構建健壯、用戶友好的 Struts2 Web 應用的關鍵技能。