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

Struts2 redirectAction 傳遞參數完全指南:原理、語法與三種跳轉對比

     編輯:Java 綜合教學

業務場景:保存後重定向到列表頁並保留數據

用戶註冊/修改後,需重定向到列表頁 (`userlist.action`) 並顯示最新數據。若直接 `return "success"` 轉發到 JSP,刷新頁面會重複提交;需用 **重定向** 打破表單重提交,但重定向會丟失 Request 屬性。

redirectAction 參數傳遞語法

struts.xml 配置關鍵點

<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>

Action 代碼

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";
    }
}

三種跳轉結果類型深度對比

特性chainredirectredirectAction
機制服務端轉發 (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>`

redirectAction 參數傳遞的兩種寫法

1. struts.xml 靜態配置 (推薦)

<result name="list" type="redirectAction">
    <param name="actionName">userlist</param>
    <param name="namespace">/</param>
    <param name="userId">${userId}</param>  <!-- OGNL 取值自 Action 屬性 -->
</result>

2. 動態構建 (Action 中程序化)

public String save() {
    dao.modifyUser(user);
    // 手動構建重定向 URL,靈活但破壞配置集中化
    return "redirect:userlist.action?userId=" + user.getUserId();
}

關鍵差異:redirect vs redirectAction 參數寫法

類型結果值寫法示例
redirectAction**僅 Action 邏輯名**,**不帶 .action 後綴**`userlist?u_id=${userId}`
redirect**完整 URL 路徑**,**需帶 .action 後綴**`userlist.action?u_id=${userId}`

原因: `redirectAction` 由 `ActionMapper` 解析生成最終 URL,而 `redirect` 直接調用 `sendRedirect`,需開發者手寫完整映射路徑。

最佳實踐:Post-Redirect-Get (PRG) 模式

  1. 表單提交至 `save.action` (POST)
  2. `save()` 處理業務,返回 `"list"` (邏輯視圖名)
  3. `struts.xml` 匹配 `type="redirectAction"` 到 `userlist.action`
  4. 瀏覽器收到 302,發起 GET 請求 `userlist.action`
  5. `userlist()` 查詢最新數據,轉發至 `userlist.jsp` 顯示
  6. 用戶刷新頁面僅重複 GET 查詢,不重複提交表單

常見坑點

  • 參數丟失: redirectAction 會丟失原 Request 所有屬性,**必須顯式配置 `` 傳遞**需要的參數。
  • 命名空間: 跨 namespace 重定向必須指定 `/other`。
  • 類型轉換: 參數值經 OGNL 取值後自動轉換為目標 Action 屬性類型。
  • 不要濫用 chain: chain 共享 Request,易導致 Action 耦合、數據污染、無法應對瀏覽器刷新。

掌握 `redirectAction` 的參數傳遞機制與三種跳轉本質差異,是構建健壯、用戶友好的 Struts2 Web 應用的關鍵技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved