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

Struts2 Action 資料未傳遞至 JSP:ValueStack 存取問題

     編輯:程式設計綜合問答

問題現象

Action 中設定 getMonitorObj,JSP 用 <s:property value="getMonitorObj.idMon" /> 取值卻為空。

根本原因

Struts2 預設只將 Action 實例本身 (this) 推入 ValueStack 栈頂。Action 的實例屬性 (getter/setter) 會被 OGNL 自動存取,但區域變數 或未暴露 getter 的欄位 不在 ValueStack 中。

解決方案

  1. 確保屬性有公開 Getter (最標準)
    public class PylAction extends ActionSupport {
        private MonitorObj getMonitorObj; // 實例屬性
        public MonitorObj getGetMonitorObj() { return getMonitorObj; } // 必須有 getter
        public String pylShow() {
            getMonitorObj = pylmonitormanager.pylgetmoninfo(...);
            return SUCCESS;
        }
    }
  2. 手動放入 ValueStack (不推薦,破壞封裝)
    ActionContext.getContext().getValueStack().set("getMonitorObj", getMonitorObj);
    // 或
    ActionContext.getContext().put("getMonitorObj", getMonitorObj); // 放入 Request Map
    
  3. JSP 正確引用
    <!-- 直接用屬性名,OGNL 會呼叫 getGetMonitorObj() -->
    <input name="test" value="<s:property value='getMonitorObj.idMon' />" />
    <!-- 注意單引號包裹屬性值,避免雙引號衝突 -->

除錯技巧

  • 在 JSP 臨時加入 <s:debug></s:debug>,瀏覽器開啟除錯視窗檢視 ValueStack 完整結構。
  • 檢查 struts.xml 是否攔截器包含 params、modelDriven 等影響屬性注入的攔截器。

最佳實踐

採用 ModelDriven 介面或單純 POJO Action + Getter/Setter,讓框架自動管理 ValueStack,避免手動操作 ActionContext。

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