Struts 2 引入主題模板機制,提供豐富的 UI 標籤(<s:checkboxlist>、<s:doubleselect>、<s:token>、<s:datetimepicker> 等)。本文針對常見使用疑難,提供最佳實踐配置與代碼範例。
theme="simple",但會失去錯誤訊息自動顯示、客戶端驗證等便利。建議改寫 CSS 或自訂主題。doubleselect 等依賴 Action 準備數據的標籤,必須通過 Action 請求(如 *.action),不可直接訪問 *.jsp。關鍵在 value 屬性對應 list 的值:
<s:form action="Store">
<!-- 簡單列表 -->
<s:checkboxlist name="skills1" label="Skills 1"
list="{'Java', '.Net', 'RoR', 'PHP'}"
value="{'Java', '.Net'}" />
<-- Map 列表:listKey/listValue 指定鍵值 -->
<s:checkboxlist name="skills2" label="Skills 2"
list="#{1:'Java', 2:'.Net', 3:'RoR', 4:'PHP'}"
listKey="key" listValue="value"
value="{1, 2, 3}" />
</s:form>
Showcase 範例僅兩個選項,實際多選項建議用 Map + OGNL:
<s:set name="foobar"
value="#{'Java':{'Spring','Hibernate','Struts 2'},
'.Net':{'Linq','ASP.NET 2.0'},
'Database':{'Oracle','SQL Server','DB2','MySQL'}}" />
<s:doubleselect list="#foobar.keySet()"
doubleName="technology"
doubleList="#foobar[top]"
label="Technology" />
top 為第一層選中的值(如 'Java')。#foobar[top] 取得對應的第二層集合。struts.token,並存入 Session。token 攔截器比對 Session 與 Request 的 token。invalid.token 結果。<!-- JSP -->
<s:form action="Token">
<s:textfield name="message" label="Message"/>
<s:token/>
<s:submit/>
</s:form>
<!-- struts.xml -->
<action name="Token" class="tutorial.CoolTagAction">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="token"/> <!-- 必須額外引用 -->
<result name="invalid.token">/token.jsp</result>
<result>/token.jsp</result>
</action>
正常提交 → 成功;按 F5 重新整理 → 顯示「Invalid token」錯誤訊息。
<s:datetimepicker name="birthday" label="Birthday"/>
<!-- 日期時間選擇器,支援 format、displayFormat 屬性 -->
<s:updownselect label="Favourite Countries"
list="#{'england':'England','america':'America','germany':'Germany'}"
name="prioritisedFavouriteCountries"
headerKey="-1" headerValue="--- Please Order ---"/>
<!-- 可上下調整順序的選擇框 -->
<s:optiontransferselect label="Favourite Cartoons"
name="leftSide" leftTitle="Available" rightTitle="Selected"
list="{'Popeye','He-Man','Spiderman'}"
doubleList="{'Superman','Mickey Mouse','Donald Duck'}"
doubleName="rightSide"
multiple="true" doubleMultiple="true"/>
<!-- 雙向穿梭選擇框 -->
checkboxlist 用 value 預設勾選,支援 List/Map。doubleselect 多級聯動靈活運用 Map + #map[top] OGNL 表達式。token 需在 struts.xml 額外引用 token 攔截器並配置 invalid.token 結果。