首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Struts2 值棧生命週期:Result 跳轉與值棧存取的關係

     編輯:程式設計疑難解答

Struts2 的值棧 是 **請求級** 的:每個 HTTP 請求建立一個新的值棧,隨請求結束而銷毀。<result> 類型決定值棧是否可被目標頁面存取。

Result 類型與值棧可見性

Result 類型值棧傳遞典型用途
dispatcher (預設, JSP 轉發)✅ 同一請求,值棧共享Action → JSP 顯示資料
redirect❌ 新請求,值棧重建登入成功 → 重導首頁 (防重複提交)
redirectAction❌ 新請求,但可攜帶參數Action 間跳轉
chain✅ 同一請求,值棧傳遞給下一個 ActionActionA 處理邏輯 → ActionB 顯示
stream / json / plaintext⚠️ 直接輸出,不經 JSPAJAX 回應、檔案下載

提問情境分析

  • 配置 <result>index.jsp</result> (dispatcher): 轉發到 index.jsp,同一請求,值棧內容保留,<s:debug> 可見。
  • 未配置 result (或配置 result type="chain" 但無後續 Action): 預設尋找 actionName-success.jsp,若不存在則 404;若直接回應 (如 AJAX),值棧隨請求結束銷毀,頁面無法存取。
  • 在請求頁面 <s:debug> 為空: 因為該頁面屬於**上一個請求**,值棧已銷毀。<s:debug> 只能看**當前請求**的值棧。

跨請求保存資料的正確做法

  1. Session: ActionContext.getContext().getSession().put("key", value); (小心記憶體洩漏)。
  2. Flash Scope (Struts2 內建): ActionContext.getContext().getSession().put("__flash__", map); 下一請求自動取出並清除,適合重導後提示訊息。
  3. 資料庫/快取: 持久化需求。

值棧存取最佳實踐

  • Action 類別實作 ModelDriven<T> 或提供 getter,OGNL 直接存取屬性。
  • 複雜物體放入值棧:ActionContext.getContext().getValueStack().push(object);。
  • 避免在值棧放入大量資料 (如完整實體列表),只放顯示所需的 DTO/VO。

理解「值棧 = 請求範圍」,配合正確的 Result 類型,即可掌控資料流向。

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