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

Struts 2 新表單標籤深度解析與實戰技巧

     編輯:Java 相關知識

前言

Struts 2 引入主題模板機制,提供豐富的 UI 標籤(<s:checkboxlist>、<s:doubleselect>、<s:token>、<s:datetimepicker> 等)。本文針對常見使用疑難,提供最佳實踐配置與代碼範例。

通用技巧

  • 佈局風格:預設表格佈局,按鈕右對齊。若需自訂,設 theme="simple",但會失去錯誤訊息自動顯示、客戶端驗證等便利。建議改寫 CSS 或自訂主題。
  • 訪問方式:包含 doubleselect 等依賴 Action 準備數據的標籤,必須通過 Action 請求(如 *.action),不可直接訪問 *.jsp。

1. <s:checkboxlist> — 預設勾選

關鍵在 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>

2. <s:doubleselect> — 多級聯動下拉選單

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] 取得對應的第二層集合。
  • 無需在 Action 中寫死邏輯,JSP 端純 OGNL 解決。

3. <s:token> — 防重複提交

原理

  1. 頁面載入時生成 GUID 隱藏欄位 struts.token,並存入 Session。
  2. 表單提交時,token 攔截器比對 Session 與 Request 的 token。
  3. 一致 → 移除 Session 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」錯誤訊息。

4. 其他實用標籤速覽

<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 結果。
  • 主題機制強大但複雜,優先嘗試 CSS 覆蓋,必要時自訂主題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved