OGNL (Object Graph Navigation Language) 是功能強大的表達式語言,Struts 2 以其為核心,配合 ValueStack (值棧) 實現 Action 數據到視圖的綁定。OGNL 表達式必須寫在 Struts 標籤內,如 <s:property value="..."/>。
| 類型 | 語法 | 說明 | 範例 |
|---|---|---|---|
| 基本屬性 | <s:property value="attr"/> | Action 直接屬性 | name |
| 實體物件屬性 | <s:property value="obj.prop"/> | Action 內嵌物件屬性 | user.userName |
其餘 6 種(集合索引、Map Key、運算、方法呼叫、建集合、建 Map)屬進階用法,掌握前兩種即可覆蓋 90% 場景。

user.name# 開頭,如 #session.user、#request.id,存取 request、session、application 等上下文<s:iterator value="users">
<s:property value="userName"/> <!-- 此處棧頂為 User 物件 -->
</s:iterator>
💡 實務口訣:預設棧頂=Action,迭代時棧頂=循環變量,結束即還原。
頁面加入 <s:debug></s:debug>,瀏覽器會彈出視窗顯示完整 ValueStack 結構,含棧內容與 Context Map,極利於除錯。
核心功能:生成 HTML 表單元素,並依 OGNL 從 ValueStack 取值設為預設值,廣泛用於「修改」頁面。
| 標籤 | 生成元素 | 關鍵屬性 |
|---|---|---|
<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"> | 表單送出按鈕 |
<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 預設表格佈局干擾 CSSlistKey/listValue 必須對應實體類別的 getter 方法名<s:push> 暫時改變棧頂ModelDriven 或 Preparable 介面簡化 Action