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

Struts 2 數據顯示完全指南:OGNL、ValueStack 與 UI 標籤深度解析

     編輯:Java 綜合教學

OGNL:Struts 2 的表達式語言引擎

OGNL (Object Graph Navigation Language) 是功能強大的表達式語言,Struts 2 以其為核心,配合 ValueStack (值棧) 實現 Action 數據到視圖的綁定。OGNL 表達式必須寫在 Struts 標籤內,如 <s:property value="..."/>。

兩大高頻 OGNL 存取方式

類型語法說明範例
基本屬性<s:property value="attr"/>Action 直接屬性name
實體物件屬性<s:property value="obj.prop"/>Action 內嵌物件屬性user.userName

其餘 6 種(集合索引、Map Key、運算、方法呼叫、建集合、建 Map)屬進階用法,掌握前兩種即可覆蓋 90% 場景。

ValueStack:數據流轉的核心中樞

ValueStack 結構圖

雙重存取機制

  1. 棧存取 (預設):OGNL 從棧頂向下尋找 root 物件 (Action),直接寫屬性名如 user.name
  2. Context Map 存取:以 # 開頭,如 #session.user、#request.id,存取 request、session、application 等上下文

棧頂變化的唯一場景:迭代

<s:iterator value="users">
    <s:property value="userName"/> <!-- 此處棧頂為 User 物件 -->
</s:iterator>
  • 迭代開始:循環變量壓入棧頂,Action 降為次頂
  • 迭代結束:循環變量彈出,Action 回歸棧頂

💡 實務口訣:預設棧頂=Action,迭代時棧頂=循環變量,結束即還原。

調試神器

頁面加入 <s:debug></s:debug>,瀏覽器會彈出視窗顯示完整 ValueStack 結構,含棧內容與 Context Map,極利於除錯。

UI 標籤:表單自動回顯與綁定

核心功能:生成 HTML 表單元素,並依 OGNL 從 ValueStack 取值設為預設值,廣泛用於「修改」頁面。

簡單 UI 標籤

標籤生成元素關鍵屬性
<s:textfield><input type="text">name (OGNL)、theme="simple" (無樣式)
<s:password><input type="password">同 textfield
<s:textarea><textarea>同 textfield
<s:checkbox><input type="checkbox">OGNL 需回傳 boolean,true 則勾選
<s:submit><input type="submit">表單送出按鈕

複雜 UI 標籤:選項來源與回顯邏輯

單選框 <s:radio>

<!-- 靜態 Map 方式 -->
<s:radio name="sex" list="#{'M':'男', 'F':'女'}" />

<!-- 動態集合方式 -->
<s:radio name="favoriteCity" list="cities" listKey="cityCode" listValue="cityName" />

邏輯:1. 依 list 生成選項;2. 依 name OGNL 取值,匹配 listKey (或 Map Key) 者預設選中。

多選框 <s:checkboxlist>

<s:checkboxlist name="travelCities" list="cities" listKey="cityCode" listValue="cityName" />

name OGNL 需回傳 List<String> (如城市代碼集合),包含該值的 checkbox 自動勾選。

下拉框 <s:select>

<s:select name="home" list="cities" listKey="cityCode" listValue="cityName" />

生成 <option>,name OGNL 值匹配 listKey 者預設 selected。

實戰經驗總結

  • 優先使用 theme="simple" 避免 Struts 預設表格佈局干擾 CSS
  • listKey/listValue 必須對應實體類別的 getter 方法名
  • 複雜巢狀物件綁定時,善用 <s:push> 暫時改變棧頂
  • 大量表單欄位考慮使用 ModelDriven 或 Preparable 介面簡化 Action
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved