-
Struts2 標籤庫概述
- Struts2 標籤庫的組成
- Struts2 框架的標籤庫可以分爲以下三類:
- 用戶界面標籤 (UI 標籤 ) :主要用來生成 HTML 元素的標籤。
- 表單標籤:主要用於生成 HTML 頁面的 FORM 元素,以及普通表單元素的標籤。
- 非表單標籤:主要用於生成頁面上的 tree , Tab 頁等。
- 非用戶界面標籤 ( 非 UI 標籤 ) :主要用於數據訪問,邏輯控制。
- 數據訪問標籤:主要包含用於輸出值棧 (ValueStack) 中的值,完成國際化等功能的標籤。
- 流程控制標籤:主要包含用於實現分支,循環等流程控制的標籤。
- AJAX 標籤 : 用於支持 Ajax 效果
-
Struts2 標籤庫
- 在早期的 WEB 開發中, JSP 視圖控制和顯示技術主要依靠 Java 腳本來實現,這樣一來, JSP 頁面重新嵌入了大量的 Java 腳本代碼,給開發帶來了極大的不方便。
- 從 JSP1.1 規範後, JSP 增加了自定義標籤庫的支持。標籤庫是一種組件技術,通過標籤庫,可以將複雜的 Java 腳本代碼封裝在組件中,開發者只需要使用簡單的代碼就可以實現複雜的 Java 腳本功能。提供了 Java 腳本的複用性,提高了開發者的開發效率。
- Struts2 標籤庫相對 struts1.x 進行了巨大的改進,支持 OGNL 表達式,不再依賴任何表現層技術。
-
Struts2 標籤的使用
- 我們可以在 struts2-core-2.0.11.jar 壓縮文件的 META-INF 目錄下找到 struts-tags.tld 文件,這個文件裏定義了 Struts2 的標籤。
- 要在 jsp 中使用 Struts2 的標誌,先要指明標誌的引入。通過 jsp 的代碼的頂部加入以下的代碼:
- <%@taglib prefix="s" uri="/struts-tags" %>
-
Struts2 標籤語法 ( 一 )
- Struts2 的標籤都支持動態數據的訪問,標籤的屬性都可以使用 OGNL 表達式, struts2 標籤的屬性具有類型,這些類型可以簡單地分爲字符串類型和非字符串類型,對於字符串類型的屬性,如果要訪問動態數據,需要使用 %{… } 這樣的語法,
- 例如: <s:include value=“%{ url }” />
- Include 標籤的 value 屬性是字符串類型, Struts2 將對這個屬性進行解析,查找符合 %{…} 樣式的字符串,然後將花括號之間的內容作爲 OGNL 表達式進行求值。如果屬性中沒有 %{…} 樣式的字符串,那麼屬性的值將被直接看成是字符串數據。
- 例如: <s:include value=“urlTag.action” />
- 對於非字符串類型的屬性值,將直接作爲 OGNL 表達式進行求值。
- 例如: <s:property value=“username”/>
- property 標籤的 value 屬性是 Object 類型,它的值 username 將作爲 OGNL 表達式進行求值,結果是值棧中位於棧頂的對象的 username 屬性的值。如果要爲非字符串類型的屬性直接指定字符串數據,那麼需要使用 OGNL 中的字符串常量,即用單引號(‘)或雙引號(“)將字符串括起來。
- 例如: <s:property value=“’zhangsan‘”/>
- value 屬性的值‘ zhangsan’ 作爲字符串常量,計算結果就是 zhangsan ,因此輸出 zhangsan 。
-
Struts2 標籤語法 ( 二 )
- 除上述用法之外,也可以使用 %{…} 這樣的語法來指定字符串常量。
- 例如: <s:property value=“%{ ‘zhangsan’ }”/>
- 在這種情況下, %{ } 將被忽略,花括號中的內容將作爲表達式被計算。
- 總結一下, struts2 標籤的屬性按照下列的三個規則進行計算。
- (1) 所有的字符串屬性類型都會解析“ %{…}” 這樣的語法。
- (2) 所有的非字符屬性類型都不會被解析,而是直接被看作一個 OGNL 表達式進行求值
- (3) 對於第二個規則的例外情況是,如果非字符串屬性使用了“ %{…}” 語法,那麼 %{…} 將被忽略,花括號中的內容將作爲表達式計算。
- 如果大家在使用標籤時, 忘記了某個屬性是字符串類型,還是非字符串類型,那麼有一個簡單的方法,那就是不考慮它是什麼類型,統一使用“ %{…}” 語法。
-
Struts2 通用標籤
- Struts2 中通用標籤可以分爲二類:控制標籤和數據標籤 。控制標籤用於呈現頁面時控制執行流程,數據標籤用於訪問值棧中的數據。
- 數據標籤: 用於訪問 ActionContext 和值棧中的數據。數據標籤包括:
- property set push param bean action include
- url a i18n text date debug
- 控制標籤: 用於在呈現結果頁面時控制程序的執行流程,根據程序執行的狀態輸出不同的結果,控制標籤包括下列標籤:
- if/elseif/else iterator append merge
- generator subset sort
-
數據標籤 -----property 標籤
- property 標籤用於輸出值棧中的對象的屬性 (property) 值,使用 value 屬性來指定要輸出的對象屬性,如果沒有指定 value 屬性,那麼默認輸出棧頂對象。
- property 標籤屬性
- 在前面的章節中,我們已經使用過了 property 標籤,我們再看一個例子:
- <s:property value=“username” default=“ 遊客” />
- 取出棧頂對象 ( 通常是 action) 的 username 屬性並輸出,如果沒有找到 username 屬性,那麼輸出”遊客”。
-
數據標籤 -----set 標籤
- Set 標籤將一個值賦給指定範圍內變量。 Set 標籤在某些情況下是比較有用的,例如在頁面中多次引用一個複雜的表達式,我們可以將這個表達式賦給一個變量,然後直接引用變量。帶來的好處就是:
- 提升了性能 ( 表達式的計算只有一次 )
- 提高了代碼的可讀性。
- set 標籤屬性
- Set 標籤以 name 屬性的值作爲鍵 (key) ,將 value 屬性的值保存到指定的範圍對象中。屬性 scope 取值中的 page,request,session,application 同 JSP 的 4 種範圍,如果指定了 action 範圍 ( 默認值 ) , value 屬性的值將被同時保存到 request 範圍和 OgnlContext 中。
- 示例:訪問地址: http://localhost:8080/.../setTag.action
-
數據標籤 -----push 標籤
- push 標籤用於把一個值壓入值棧 ( 位於棧頂 ) ,注意和 set 標籤的區別, set 標籤是將值放到 action 上下文中。當 push 標籤結束後, push 標籤放入值棧中的對象將被刪除,換句話說,要訪問 push 標籤壓入棧中的對象,需要在標籤內部去訪問。
- push 標籤的屬性
- Push 標籤示例 訪問: http://localhost:8080/...../pushTag.action
-
數據標籤 -----param 標籤
- param 標籤被用作其他標籤的子標籤,用於爲其他標籤提供參數,例如:爲 bean 標籤和 include 標籤提供參數。
- param 標籤的屬性
- 當使用 param 標籤時, 參數的值可以通過 value 屬性給出,也可以在標籤體中給出 ( 開始標籤和結束標籤之間的文本 ) 。這二種用法有一些區別。我們看下面的例子:
- <param name=“color”>blue</param> <!-- (1) -->
- <param name=“color” value=“blue” /> <!-- (2) -->
- 在第 (1) 種情形中,參數值將作爲 java.lang.String 對象 ( 即字符串 ) 被放入棧中;
- 在第 (2) 種情形中,參數值將作爲表達式進行計算,如果 blue 不存在,則 color 參數的值爲 null 。
- 在第 (1) 種情形中,要爲 color 指定字符串值,可以寫爲:
- <param name=“color” value=“ ‘ blue ‘ ”/> 或者 <param name=“color” value=“%{‘ blue ‘ }“/>
- 使用單引號包圍字符串,表明這是一個字符串常量
-
數據標籤 -----bean 標籤
- bean 標籤用於實例化一個 JavaBean 對象 ( 必須遵照 JavaBean 規範 ) , bean 標籤的標籤體內可以包含多個 param 標籤,用於設置 Bean 的屬性 ( 必須有相應的 setter 方法 ) 。如果指定了 id 屬性,則創建的 Bean 實例將被放入到 OgnlContext 中。
- bean 標籤的屬性
- 注意:
- id 屬性是可選的,無論是否指定 id 屬性, bean 標籤創建的 JavaBean 實例都會被壓入到值棧的頂部,在 bean 標籤內部可以直接訪問創建的對象,無須使用” #” 標記,當 bean 標籤結束的時候, bean 標籤創建的實例將從值棧中刪除。
- 如果指定了 id 屬性,那麼 bean 標籤創建的 JavaBean 實例還將被放到 OgnlContext 中,這樣在 bean 標籤的外部,也可以訪問創建的對象了,不過此時就要使用” #” 標記了。
- bean 標籤示例
-
bean 標籤示例說明
- 在沒有指定 id 屬性的情況下,創建的 User 對象只被壓入值棧,在 bean 標籤的內部使用 property 標籤可以直接訪問 User 對象的屬性。在 bean 標籤外部,由於值棧中的 User 對象已被刪除,所以無法訪問到 User 對象的屬性了。
- 在指定了 id 屬性的情況下,創建的 User 對象除了被放到值棧中外,還被放到 action 上下文中,因此在標籤的內部和外部都可以訪問 User 對象屬性,只不過在標籤外部訪問時需要添加 #user 前綴 ,
- 訪問路徑: http://localhost:8080/..../beanTag.action
-
- 通過指定 action 的名字和可選的名稱空間, action 標籤允許你在 JSP 中直接調用 action 。如果將標籤的 excuteResult 屬性設爲 true, 那麼 action 對應的結果輸出也將被包含到本頁面中。
- 在 action 標籤的標籤體中可以嵌套 param 標籤,向 action 傳遞參數。
- action 標籤的屬性
- 如果指定了 id 屬性,則 action 將被放到 OgnlContext 中,在 action 標籤結束後,可以通過 #id 來引用 action.
- ActionTagAction.java actionTagSuccess.jsp
- actionTag.jsp
-
示例說明
- 在第一個 action 標籤調用中,執行了結果,但沒有設置 ActiontagAction 的 username 和 email 屬性,所以結果頁面中的這兩項輸出爲空。
- 在第二個 action 標籤調用中,不執行結果,調用 ActionTagAction 的 doDefault() 方法,在這個方法中,我們在請求對象中設置了 greeting 屬性,在頁面中使用 property 標籤,通過表達式 #attr.greeting 來獲取 greeting 屬性。
- 在第三個 action 標籤調用中,執行了結果,並通過 param 標籤設置了 ActionTagAction 的 username 和 email 屬性,在結果頁面中通過 property 標籤輸出這兩個屬性的值。
- 訪問路徑: http://localhost:8080/....actionTag.jsp
-
數據標籤 -----include 標籤
- include 標籤類似於 JSP 的 <jsp:include> 標籤,用於包含一個 Servlet 或 JSP 頁面。 include 標籤的標籤體內可以包含多個 param 標籤,用於向被包含的頁面傳遞請求參數
- include 標籤的屬性
-
include 標籤示例說明
- 在 jsp2.jsp 中,我們使用 JSP 的 EL 表達式來獲取傳的請求參數。注意:在 include 標籤內部使用 param 標籤向被包含的頁面傳遞的請求參數, 不能使用如下的 property 標籤來訪問: <s:property value=“#parameters.username” />
- #parameters 引用的實質是一個 Map 對象,並不等同於 HttpServletRequest 對象。
- 在包含頁面時,如果頁面中有中文,將會出現亂碼,要解決這個問題,可以在 struts.xml 文件中配置 struts.i18n.encoding 屬性,如下:
- <constant name=“struts.i18n.encoding” value=“gbk” />
- 訪問路徑: http://localhost:8080/.../includeTag.jsp
-
數據標籤 -----i18n 和 text 標籤
- i18n 和 text 標籤用於對國際化提供支持 .i18n 標籤用於將一個資源包放入值棧, text 標籤用於從資源包中獲取消息。例如
- <s:i18n name=“ApplicationResources”>
- <s:text name=“title”/>
- </s:i18n>
- i18n 標籤將基名爲 ApplicationResources 的資源包放入到值棧中, text 標籤從資源包中獲取鍵爲 title 的文本消息。
- 注意: i18n 標籤放入值棧的資源包只能在 i18n 標籤的標籤體內訪問,一旦 i18n 標籤結束,值棧中的資源包將被刪除。
- text 標籤也可以單獨使用,在這種情況下,它將首先查找資源包的基名與調用的 Action 類名相同的資源包。這意味着你可以在 Action 類所在的包中創建與 Action 類名相同的資源文件,例如:在 com.ibm.action 包中有一個名爲 LoginAction 的類, 你可以在 com.ibm.action 包括中創建名爲 LoginAction.properties 、 LoginAction_zh.properties 、 LoginAction_en.properties 等資源文件 ( 名字中的 LoginAction 部分稱爲基名 ) ,當執行完 LoginAction 後,在轉向的結果頁面中使用單獨的 text 標籤獲取本地化的文本消息,那麼 text 標籤將從 com.ibm.action.LoginAction_xx.properties( 根據當前的語言環境選擇某個資源文件 ) 中讀取 name 屬性值對應的文本消息。
-
數據標籤 -----i18n 和 text 標籤
- 如果找不到與 Action 類名相同的資源包,那麼就從默認資源包中獲取消息;如果默認資源包不存在,或者默認資源包中也沒有找到對應的消息,那麼 text 標籤的標籤體內容將作爲默認消息被輸出;如果沒有標籤體,那麼 name 屬性的值將直接被輸出。
- text 標籤內部還可以使用嵌套的 param 標籤,來指定消息文本中的參數, param 標籤的順序對應了消息文本中參數的索引順序。
- i18n 標籤的屬性
- text 標籤的屬性
-
i18n 和 text 標籤示例
- 第一步
- 在項目的 src 下新建包: com.ibm.action, 在這個包中新建 TextTagAction 類,繼承自 ActionSupport 類,注意:你的 Action 類一定要繼承 ActionSupport 類,因爲 ActionSupport 類對國際化提供了支持,這樣 text 標籤才能訪問到資源包的基名與你的 Action 類名相同的資源包。
- TextAction 類沒有任何代碼,這主要是因爲 ActionSupport 基類已經實現了 execute() 方法,該方法返回 Action.SUCCESS, 這就足夠了,我們編寫 TextAction 類的目的是爲了通過這個 Action 來訪問使用了 text 標籤的結果頁面。
-
i18n 和 text 標籤示例
- 第二步
- 在 com.ibm.action 包中新建 TextTagAction.properties, 內容如下:
- username= lisi
- email= lisi @163. com
- now=Now is {0} . {1} , welcome you.
- 鍵爲 now 的消息有兩個參數,分別用 {0} 和 {1} 來表示。
- 第三步
- 新建 ApplicationResources.properties, 內容如下:
- username=zhangsan
-
i18n 和 text 標籤示例
- 第四步
-
數據標籤 -----date 標籤
- date 標籤用於格式化輸出日期值,也可用於輸出當前日期值與指定日期值之間的時差
- date 標籤的屬性
- 注意:
- 1 、 format 屬性用於指定日期的格式化樣式,具體的樣式規則可以參看 java.text.SimpleDateFormat 類的 API 文檔。
- 2 、將 nice 屬性設爲 true ,可以輸出指定日期值和當前日期值之間的時差,此時 format 屬性失效,也就是說,當 nice 屬性爲 true 時,即使你指定了 format 屬性,它也不會起作用
- 3 、如果沒有使用 nice 屬性,也沒有指定 format 屬性,那麼 date 標籤將會在國際化資源包中查找 struts.date.format 鍵,並以這個鍵的值作爲日期的格式化樣式;如果這個鍵不存在,那麼默認將會使用 DateFormat.MEDIUM 格式化樣式。
- 4 、如果找不到 name 屬性指定的 Date 對象,那麼將返回空。
-
date 標籤示例
- 第一步
- 在 ApplicationResources.properties 文件中添加 struts.date.format 鍵
- struts.date.format=yyyy/MM/dd hh:mm:ss
- 第二步、
- 可以使用 struts2 的 struts.custom.i18n.resources 屬性來設置默認的資源包,編輯 struts.xml 文件,使用 constant 元素來配置 struts.custom.i18n.resources 屬性,內容如下
- <constant name=“struts.custom.i18n.resources” value=“ApplicationResources”/>
-
測試: http://localhost:8080/...../dateTag.jsp
- 第三步
-
控制標籤
- 控制標籤用於完成流程控制,例如分支,循環等操作。控制標籤包含下面幾個:
- if: 用於控制選擇輸出。
- elseif: 同 if 標籤結合使用,用來控制選擇輸出。
- else: 同 if 標籤結合使用,用來控制選擇輸出。
- append: 用來將多個集合拼接爲一個新的集合。
- generator: 爲一個字符串解析器,用來將一個字符串解析爲一個集合。
- iterator: 迭代器,用來迭代輸出集合數據。
- merge: 用來將多個集合拼接爲一個新的集合 , 同 append 有所區別。
- sort: 用來對集合排序。
- subset :用來截取集合的部分集合,開成新的集合子集合。
-
控制標籤 -----if/elseif/else 標籤
- if/elseif 標籤屬性 test: 爲必填屬性,是一個 Boolean 類型值,決定是否顯示 if 標籤內容。該標籤標準格式如下:
- <s:if test=“ 表達式” >
- …… ..
- </s:if>
- <s:elseif test=“ 表達式” >
- …… ..
- </s:elseif>
- <s:else>
- ……… ..
- </s:else>
-
控制標籤 ----- if/elseif/else 標籤舉例
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <!-- 定義一個 testname 屬性 -->
- <s:set name="testname" value="%{'Java'}" />
- <!-- 使用 if 標籤判斷 -->
- <s:if test="%{#testname=='Java'}">
- <div>
- <s:property value="%{# testname}" />
- </div>
- </s:if>
- <s:elseif test="%{#testname=='Jav'}">
- <div>
- <s:property value="%{# testname}" />
- </div>
- </s:elseif>
- <s:else>
- <div>
- testname 不是“ Java”
- </div>
- </s:else>
-
控制標籤 ----- if/elseif/else 標籤舉例
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <s:set name="age" value="61"/>
- <s:if test="${age > 60}">
- 老年人
- </s:if>
- <s:elseif test="${age > 35}">
- 中年人
- </s:elseif>
- <s:elseif test="${age > 15}" id="wawa">
- 青年人
- </s:elseif>
- <s:else>
- 少年
- </s:else>
-
控制標籤 ----- if/elseif/else 標籤舉例
- <%@ taglib prefix="s" uri="/struts-tags"%>
- <s:set name="name" value="<%="'"+ request.getParameter("name")+"'" %>"/>
- <%
- System.out.println(request.getParameter("name"));
- %>
- <s:if test="#name=='zhaosoft'">
- zhaosoft here
- </s:if>
- <s:elseif test="#name=='zxl'">
- zxl here
- </s:elseif>
- <s:else>
- other is here
- </s:else>
-
控制標籤 ----- iterator (迭代標籤)
- Iterator (迭代)
- 描述:用於遍歷集合( java.util.Collection ) List,Map, 數組或枚舉值 (java.util.iterator) 。該標籤的屬性如下表:
-
IteratorStauts 實例包含方法
- int getCount(): 返回當前迭代過元素的總數。
- int getIndex(): 返回當前迭代元素的索引。
- boolean isEven(): 判斷當前迭元素是否爲偶數。
- boolean isOdd(): 判斷當前迭元素是否爲奇數。
- boolean isFirst(): 判斷當前迭元素是否爲第一個元素。
- boolean isLast(): 判斷當前迭元素是否爲最後一個元素
- IteratorStauts 的這些方法分別對應了 count,index,even,odd,first,last 屬性
- 控制標籤 ----- iterator 標籤示例
-
控制標籤 ----- iterator (迭代標籤)舉例
- <s:iterator value ="{' 第一個元素 ',' 第二個元素 '}" >
- <p>day is: <s:property/></p>
- </s:iterator>
- private List myList;
- private Map myMap;
- public String execute() throws Exception {
- myList = new ArrayList();
- myList.add(" 第一個元素 ");
- myList.add(" 第二個元素 ");
- myList.add(" 第三個元素 ");
- myMap = new HashMap();
- myMap.put("key1", " 第一個元素 ");
- myMap.put("key2", " 第二個元素 ");
- myMap.put("key3", " 第三個元素 ");
- return SUCCESS ;
- }
- 省略生成 setter/getter 方法
-
- <table>
- <s:iterator value="{' 第一個元素 ',' 第二個元素 '}" status="st">
- <tr>
- <td><s:property value="#st.getIndex()" /></td>
- <td><s:property /></td>
- </tr>
- </s:iterator>
- </table>
- <h2> 顯示 List 屬性 </h2>
- <table>
- <s:iterator value="myList" status="st">
- <tr>
- <td><s:property value="#st.getIndex()" /></td>
- <td><s:property /></td>
- </tr>
- </s:iterator>
- </table>
-
- <h2> 顯示 Map</h2>
- <table>
- <s:iterator value="#{'key1':' 第一個元素 ','key2':' 第二個元素 '}" status="st">
- <tr>
- <td><s:property value="#st.getIndex()" /></td>
- <td><s:property /></td>
- </tr>
- </s:iterator>
- </table>
- <h2> 顯示 Map 屬性 </h2>
- <table>
- <s:iterator value="myMap" status="st">
- <tr>
- <td><s:property value="#st.getIndex()" /></td>
- <td><s:property /></td>
- </tr>
- </s:iterator>
- </table>
-
控制標籤 ----- append 標籤
- append: 用來將多個集合拼接爲一個新的集合。這樣拼接的目的就是可以將多個集合使用一個 <iterator /> 標籤完成迭代。標籤屬性 id: 指定了集合元素的 ID 。
- private List myList1, myList2;
- private Map myMap1, myMap2;
- public String execute() throws Exception {
- myList1 = new ArrayList();
- myList2 = new ArrayList();
- myList1.add(" 第一個集合 # 第一個元素 ");
- myList1.add(" 第一個集合 # 第二個元素 ");
- myList1.add(" 第一個集合 # 第三個元素 ");
- myList2.add(" 第二個集合 # 第一個元素 ");
- myList2.add(" 第二個集合 # 第二個元素 ");
- myList2.add(" 第二個集合 # 第三個元素 ");
- myMap1 = new HashMap(); myMap2 = new HashMap();
- myMap1.put("key1", " 第一個集合 # 第一個元素 ");
- myMap1.put("key2", " 第一個集合 # 第二個元素 ");
- myMap1.put("key3", " 第一個集合 # 第三個元素 ");
- myMap2.put("key1", " 第二個集合 # 第一個元素 ");
- myMap2.put("key2", " 第二個集合 # 第二個元素 ");
- myMap2.put("key3", " 第二個集合 # 第三個元素 ");
- return SUCCESS;
- } // 省略 setter/getter 方法
-
- <h1><span style="background-color: #FFFFcc">Append 標籤示例 </span></h1>
- <h2> 拼接 List 屬性 </h2>
- <table>
- <s:append id="newList">
- <s:param value="myList1" />
- <s:param value="myList2" />
- </s:append>
- <s:iterator value="#newList" id="name" status="st">
- <tr>
- <td><s:property value="#st.getIndex()" /></td>
- <td><s:property /></td>
- </tr>
- </s:iterator>
- </table>
- <h2> 拼接 Map 屬性 </h2>
- <table>
- <s:append id="newMap">
- <s:param value="myMap1" />
- <s:param value="myMap2" />
- </s:append>
- <s:iterator value="#newMap" status="st">
- <tr>
- <td><s:property value="#st.getIndex()" /></td>
- <td><s:property /></td>
- </tr>
- </s:iterator>
- </table>
-
控制標籤 ----- generator 標籤
- generator 標籤用來將指定的字符串按規定的分隔符分解爲多個子字符串,生成的多個子字符串可以使用 iterator 標籤輸出。
- 該標籤的屬性如下:
- id: 指定了集合元素的 ID 。
- count :可選屬性,爲一個 Integer 類型值,指定生成集合中元素的總數。
- separator: 必填屬性,爲一個 String 類型值,指定用來分解字符串的分隔符。
- val :必填屬性,爲一個 String 類型值,指定被分解的字符串。
- converter :可選屬性,爲一個 Converter 類型實例,指定一個轉換器,該轉換器負責將集合中的每個字符串轉換爲對象。
-
控制標籤 ----- generator 標籤舉例
- private String msg;
- public String getMsg() {
- return msg;
- }
- public void setMsg(String msg) {
- this.msg = msg;
- }
- public String execute() throws Exception {
- setMsg(" 第一個元素 ; 第二個元素 ; 第三個元素 ");
- return SUCCESS;
- }
-
控制標籤 ----- generator 標籤舉例
- <h1>
- <span style="background-color: #FFFFCC">Generator 標籤示例 </span>
- </h1>
- <table>
- <s:generator separator=";" val="msg" id="temp" count="2"></s:generator>
- <s:iterator status="st" value="#attr.temp">
- <tr>
- <td><s:property value="#st.getIndex()" /></td>
- <td><s:property /></td>
- </tr>
- </s:iterator>
- </table>
- 注意:如果在 generator 標籤中指定了 count 屬性,則該集合中最多只能有 count 個元素,多餘的元素將會被忽略。
-
控制標籤 ----- append 標籤
- append: 用來將多個集合拼接爲一個新的集合。
-
控制標籤 ----- merge 標籤
- Merge 標籤用於合併迭代器,其用法與 append 相似,區別就是對合並後的迭代器中的元素迭代的順序不一樣。
-
控制標籤 ----- subset 標籤
- Subset 標籤用於截取一個迭代器的子集,其內部實現是通過 org.apache.struts2.util.SubsetIteratorFilter 類來完成的。
- Subset 標籤示例
-
subset 標籤示例
- 除了上面的用法之外,還可以使用 subset 屬性指定一個 Decider ,用於過濾某些元素。要編寫一個 Decider 類,需要實現 org.apache.struts2.util.SubsetIteratorFilter.Decider 接口,該接口只有一個方法, public boolean decide(Object element) throw Exception, 如果該方法返回 true ,表明參數 element 表示的元素應該被包含到子集中。
- 我們編寫一個 Decider 類,選取集合中含有“ java” 子串的元素,代碼如下:
-
控制標籤 ----- sort 標籤
- Sort 標籤根據 comparator 屬性指定的比較器對集合進行排序,並將排序後的迭代器壓入值棧的棧頂。在 sort 標籤的內部,你可以使用 iterator 標籤取出棧頂的迭代器對排序後的元素進行迭代。當 sort 標籤結束時,棧頂的迭代器將被刪除。
- sort 標籤示例
-
表單標籤
- Struts2 的表單標籤可以分爲兩類, form 標籤本身和包裝 HTML 表單元素的其他標籤。 form 標籤本身的行爲不同於它內部的元素。
- Struts2 表單標籤包括下列標籤:
- form textfield password radio checkbox checkboxlist select
- doubleselect combobox optiontransferselect optgroup updownselect
- textarea hidden file label reset submit token head
- 表單標籤
-
表單標籤的 name 和 value 屬性
- 很多表單標籤( form 標籤除外)的 name 屬性和 value 屬性之間存在一個獨特的關係。 name 屬性除了爲 HTML 表單元素指定名字,在表單提交時作爲請求參數的名字外,同時它還映射到 Action 的屬性。
- 在大多數情況下, name 屬性映射到一個簡單的 JavaBean 屬性,例如 name 屬性的值爲” postalCode”, 在表單提交後, struts2 框架將會調用 Action 的 setPostalCode() 方法來設置屬性。
- 有的時候你希望在表單元素中顯示 Action 屬性的數據,這時就輪到 value 屬性登場了,爲 value 屬性指定表達式” %{postalCode}”, 這將會調用 Action 的 getPostalCode() 方法,並在表單中顯示返回的數據,之後, 用戶可以編輯這個值,然後重新提交它。
-
form 標籤
- form 標籤輸出一個 HTML 輸入表單,此外, xhtml 主題的 form 標籤還輸出表單元素外圍的表格。
-
- 1) 通常情況下,當前輸出表單的請求和提交表單的請求屬於同一個命名空間。例如:請求 /admin/updateCategory!default.action 輸出的表單,命名空間會被假設爲 /admin ,因此在使用 form 標籤時,可以不使用 namespace 屬性。如下:
- <s:form action=“updateCategory” >
- 如果輸出表單的請求和提交表單的請求分屬於不同的名稱空間,那麼可以通過
- namespace 屬性指定處理表單提交的 action 所屬的名稱空間。
- 2) 若通過 action 的一個非 execute 方法輸出表單,然後將表單提交給 action 默認的 execute 方法執行,那麼 form 標籤的 action 屬性可以忽略。例如:對於下面的表單:
- <s:form >
- <s:textfield name=“username” label=“ 用戶名” />
- <s:submit />
- </s:form>
- 當訪問 /register!default.action 時, 輸出上表單, form 標籤會自動將 action 屬性設爲
- register ,這樣在表單提交後就會執行 action 的 execute 方法。
- 3)method 和 enctype 是 HTML form 標籤的屬性。
- 4) 當使用驗證框架時,將 form 標籤的 validate 屬性設爲 true ,將自動生成客戶端的 JavaScript 驗證代碼。
- <s:form action=“register” method=“post” />
- struts2 默認的主題是 xhtml, 上述代碼在客戶端瀏覽器中的輸出如下:
- <s:form id=“register” οnsubmit=“return true” action=“register” method=“post”>
- <table class=“wwFormTable”></table>
- </s:form>
- 可以看到 form 標籤內部輸出了一個 table 元素。
-
textfield 標籤
- textfield 標籤輸出一個 HTML 單行文本輸入控件,等價於 HTML 代碼: <input type=“text” …/>
- 看下面的代碼:
- <s:form action=“register” method=“post”>
- <s:textfield name=“username” label=“ 用戶名” />
- </s:form>
-
password 標籤
- password 標籤輸出一個 HTML 口令輸入控件,等價於 HTML 代碼: <input type=“password” ../>
- 例子: <s:password name=“password” label=“ 密碼” />
-
textarea 標籤
- textarea 標籤輸出一個 HTML 多行文本輸入控件,等價於 HTML 代碼: <textarea …./>.
- 例子:
- <s:textarea name=“personal” cols=“30” rows=“5” label=“ 個人簡歷” />
-
select 標籤
- select 標籤輸出一個 HTML 列表框,等價於 HTML 代碼:
- <select …><option..></option></select>
-
select 標籤示例
- 示例一:
- <s:form>
- <s:select label=“ 最高學歷” name=“education” list=“{‘ 高中’,‘大學’,‘碩士’ }” />
- </s:form>
- 在 select 標籤的 list 屬性中直接使用 OGNL 表達式創建了一個列表,列表中的每一項都將作爲 HTML 列表框的一個選項。
- 示例二:
- <s:form>
- <s:select label=“ 最高學歷” name=“education” list=“#{1:‘ 高中’, 2:‘ 大學’, 3:‘ 碩士’ }” />
- </s:form>
- 在 select 標籤的 list 屬性中直接使用 OGNL 表達式創建了一個 Map 。在這裏要注意的是, Map 的 key 是作爲列表框選項的值,而 Map 中的 value 是作爲列表框選項的內容。
-
select 標籤示例
- 示例三:
- <s:form>
- <s:select label=“ 最高學歷” name=“education” list=“{‘ 高中’,‘大學’,‘碩士’ }” headerKey=“-1” headerValue=“ 請選擇你的學歷” />
- Header 選項主要用來越提示作用,因此應該將 header 選項的值 ( 通過 headerKey 屬性設置 ) 設爲無意義的值,例如此處的 -1.
- 示例四:
- <s:form>
- <s:select label=“ 最高學歷” name=“education” list=“{‘ 高中’,‘大學’,‘碩士’ }” headerKey=“-1” headerValue=“ 請選擇你的學歷” emptyOption=“true” multiple=“true” / >
- 使用 emptyOption 屬性在 header 選項後添加一個空的選項。
- multiple 屬性設爲 false ,則只能從下拉列表中選擇一個選項,如果設爲 true ,則可以多選。
-
optgroup 標籤
- optgroup 標籤作爲 select 標籤的子標籤使用,用於創建選項組。你可以在 select 標籤的標籤體中使用一個或者多個 optgroup 標籤,對選項進行邏輯分組。注意, optgroup 標籤本身不能嵌套。
- 例子:
- <%@ taglib prefix=“s” uri=“/struts-tags” %>
- <s:form>
- <s:select label= " 選擇圖書 " name= "book" list="#{1:'JAVA 核心編程 ',2:' 深入 struts2 學習 '}" >
- <s:optgroup label= "C/C++ 圖書 " list="#{3:'VC++ 編程詳解 ',4:'Spring 詳解 '}"/>
- <s:optgroup label= "Oracle 圖書 " list="#{5:'Oracle 基礎 ',6:'DBA 入門 '}"/>
- </s:select>
- </s:form>
-
optgroup 標籤注意
- optgroup 標籤的 label 屬性指定選項組的組名。 optgroup 標籤對應的模板需要使用 listKey 和 listValue 屬性的值,因此你要麼爲 list 屬性指定一個 Map 類型的值 ( 此時, listKey 默認爲 Map.Entry 的 key , listValue 默認爲 Map.Entry 的 value) ,要麼爲 list 屬性指定一個對象列表,然後使用 listKey 和 listValue 屬性指定對象的屬性作爲選項的值和內容。
-
radio 標籤
- radio 標籤輸出一組 HTML 單選按鈕,等價於一組 HTML 代碼: <input type=“radio” …/>
- 例子:
- <%@ taglib prefix= "s" uri= "/struts-tags" %>
- <s:form>
- <s:radio name= "user.sex" value= "1" list="#{1 : ' 男 ', 0 : ' 女 '}" label= " 性別 " />
- </s:form>
-
checkbox 標籤
- checkbox 標籤輸出一個 HTML 複選框,等價於代碼: <input type=“checkbox”…/>
- checkbox 標籤創建一個 value 屬性爲 true 或者爲 false 的複選框。你可以通過 checkbox 標籤的 fieldValue 屬性來指定創建的 HTML 複選框 value 屬性的值。我們看下面的代碼:
- <s:checkbox name=“user.username” label=“ 是否顯示 Email” fieldValue=“true” />
- 複選框的值是 true 還是 false ,是由 fieldValue 屬性來控制的,而不是由通常的 value 屬性來設置的。
- 注意,除非你知道你要做什麼,否則不要將 fieldValue 屬性設置爲 false 。將 fieldValue 屬性設置爲 false 可能會導致一些問題。 HTML 規範規定,複選框只有在選中時纔會被提交,在通常的 Servlet/JSP 處理過程中,我們可以通過判斷複選框的 name 屬性所指定的請求參數是否存在來獲知用戶是否選中了複選框,如果選中,則取出它的值。然而,在使用 struts2 框架時,這一切發生了一些微妙的變化。如果將 fieldValue 屬性設置爲 false ,那麼複選框的值將是 false 。當沒有選中複選框時,提交的請求參數中不會有複選框對應的請求參數。不過,雖然 struts2 框架沒有接收到這個請求參數,但它仍然會將複選框對應的 action 屬性的值設爲 false 。於是你就會看到一個奇怪的現象,那就是不管你是否選中複選框,對應的 action 屬性的值都是 false.
-
checkboxlist 標籤
- checkboxlist 標籤使用一個列表創建一系列複選框,屬性設置與 <s:select/> 和 <s:radio/> 類似,只是創建的是 HTML 複選框。不同的是, checkboxlist 標籤是多選標籤。
- 示例:
- <s:form>
- <s:checkboxlist name= "interest" list= "{' 足球 ',' 籃球 ',' 排球 ',' 游泳 '}" label= " 興趣愛好 " />
- </s:form>
-
hidden 標籤
- hidden 標籤輸出一個 HTML 隱藏表單元素,等價於 HTML 代碼: <input type=“hidden”…/>. 在 xhtml 主題下, hidden 標籤與其它的標籤不太一樣, hidden 標籤並不輸出表行。 xhtml 主題直接從 simple 主題繼承了 hidden.ftl 模板。除了公共屬性外, hidden 標籤沒有特有的屬性。
- 示例:
- <s:hidden name=“id” value=“5” />
-
submit 標籤
- submit 標籤輸出一個提交按鈕。 submit 標籤和 form 標籤一起使用可以提供異步表單提交功能。 submit 標籤可以輸出以下三種類型的提交按鈕。
- input: 等價於 HTML 代碼 <input type=“submit”…>
- image: 等價於 HTML 代碼 <input type=“image”…>
- button: 等價於 HTML 代碼 <input type=“submit”…>
- HTML 的 button 標籤已經演進爲可以分別指定提交的值 ( 通過 value 屬性指定 ) 和按鈕上顯示的文本 ( 通過標籤的內容來指定 ) ,但只能用於 IE6.0 以上版本的瀏覽器。
-
submit 標籤示例
- 例 1 :指定 image 類型的提交按鈕,使用 method 屬性。
- <s:submit type=“image” method=“login” src=“images/login.gif” />
- 上述代碼在客戶端瀏覽器中的輸出如下:
- <input type=“image” src=“images/login.gif” name=“method:login” value=“Submit”…./>
- 注意生成的 input 元素的 name 屬性。
- 例 2 :指定 button 類型的提交按鈕,使用 action 和 method 屬性。
- <s:submit type=“button” action=“userManager” method=“login” label=“ 登錄” />
- 上述代碼在客戶端瀏覽器中的輸出如下 :
- <button type=“submit” name=“action:userManager!login” value=“submit” …/> 登錄 </button>
- 注意 button 標籤的 name 屬性。
- 通過上面的例子可以看到 name 屬性有二個前綴: method 和 action ,這是 struts2 提供的一種特性,即使用一些預定義的前綴來命名一個按鈕,通過按鈕的名字來改變執行的行爲。 Struts2 定義了 4 個前綴,如下:
- method-------method:login
- action--------action:userManager
- redirect------redirect:cancel.jsp
- redirection-action------redirect-action:register
-
method 前綴
- 使用 method 前綴,來取代 action 默認的 execute() 方法的執行。例如一個表單同時用於用戶註冊和登錄,那麼可以編寫代碼如下:
- <s:form action=“userManager”>
- <s:textfield label=“ 用戶名” name=“user.username” />
- <s:password label=“ 密碼” name=“user.password” />
- <s:submit value=“ 登錄” name=“method:login” />
- <s:submit value=“ 註冊” name=“method:reg” />
- </s:form>
- 注意: 1) 對於 input 類型的提交按鈕,不能通過 submit 標籤的 label 屬性來設置提交按鈕上的文本,只能使用 value 屬性。
- 2) 可以在 submit 標籤的 name 屬性中直接使用 method 前綴,也可以像前面給出的例子中使用 submit 標籤的 method 屬性來指定處理請求的 action 方法。
-
action 前綴
- 使用 action 前綴,取代 form 標籤指定的 action ,將請求導向到另外的 action 進行處理。
- 示例:
- <s:form action=“login”>
- <s:textfield label=“ 用戶名” name=“user.username” />
- <s:password label=“ 密碼” name=“user.password” />
- <s:submit value=“ 登錄” />
- <s:submit value=“ 註冊” name=“action:register” />
- </form>
- 如果用戶已經註冊,可以直接登錄,否則單擊註冊按鈕,轉到註冊頁面。 action 前綴也可以和 struts2 的動態方法調用結合使用,例如: name=“action:userManager!register”.
-
redirect 前綴
- 使用 redirect 前綴將請求重定向到其他的 URL ,甚至可以是 Web 應用程序外部的 URL 。
- 示例:
- <s:form action=“login”>
- <s:textfield label=“ 用戶名” name=“user.username” />
- <s:password label=“ 密碼” name=“user.password” />
- <s:submit value=“ 登錄” />
- <s:submit value=“ 註冊” name=“redirect:www.163.com” />
- </form>
-
redirect-action 前綴
- 使用 redirect-action 前綴將請求重定向到其他的 action 。在內部, struts2 使用 ServletRedirectResult 來執行這個任務。
- 示例:
- <s:form action=“login”>
- <s:textfield label=“ 用戶名” name=“user.username” />
- <s:password label=“ 密碼” name=“user.password” />
- <s:submit value=“ 登錄” />
- <s:submit value=“ 註冊” name=“redirect-action : register” />
- </form>
-
reset 標籤
- reset 標籤輸出一個重置按鈕。 reset 標籤與 form 標籤一起使用,用來提供表單的重置。 reset 標籤可以輸出以下兩種類型的重置按鈕:
- input: 等價於 HTML 代碼 <input type=“reset”…>
- button: 等價於 HTML 代碼 <button type=“reset”…>
- 示例
- <s:reset value=“ 重置” />
- <s:reset type=“button” label=“ 重置” />
- 如果是類型爲 input 的重置按鈕,則只能通過 value 屬性來設置重置按鈕上的文本。
-
label 標籤
- Xhtml 主題下的 label 標籤輸出兩個 HTML 的 label 標籤 (simple 主題下的 label 標籤只輸出一人 HTML label 標籤 ) ,分別位於一行的兩列,左邊的 label 標籤起提示作用,右列的 label 標籤用於顯示只讀的 action 屬性數據。
- 示例
- <s:label label=“ 用戶名” name=“user.username” />
- 如果 Action 實例已經創建,並且 user.username 有值,那麼在錶行的右列中將顯示 user.username 的值。
-
token 標籤與 file 標籤
- token 標籤輸出兩個隱藏的表單字段,用於防止表單的重複提交。要讓 token 標籤正常工作,需要啓用 TokenInterceptor 或者 TokenSessionInterceptor 攔截器。
- 示例: <s:token /> 具體使用後面章節講解。
- file 標籤輸出一個 HTML 文件選擇框,等價於 HTML 代碼: <input type=“file” …/>.
- 示例:
- <s:file name=“uploadFile” accept=“text / *” />
- <s:file name=“anotherUploadFile” accept=“text/html,text/plain” />
- 文件上傳後面章節詳解。
-
非表單標籤
- Struts2 的非表單標籤包括下列標籤:
- component 、 a 、 actionerror 、 actionmessage 、 fielderror
- component 標籤使用特定的模板輸出一個自定義的 UI 小部件 (widget) 。
- a 標籤創建一個 HTML 超鏈接,等價於 HTML 代碼: <a href=“….” />.
- a 標籤雖然可以在 simple 、 xhtml 和其它主題中使用,但它實際上是爲了更好地和 ajax 主題一起工作佈置而設計的 .
- a 標籤有一個 String 類型的 href 屬性,用於指定鏈接的 URL 。看下面的例子:
- <s:a href=“register!default.action”> 重新註冊 </s:a>
-
actionerror 、 actionmessage 、 fielderror 標籤
- actionerror 、 actionmessage 、 fielderror 標籤都是用於輸出消息的 .
- 不同的是 :
- actionerror 標籤輸出 action 的錯誤消息,
- actionmessage 標籤輸出 action 的一般消息,
- fielderror 標籤輸出 action 字段的錯誤消息 .
- actionerror 標籤輸出 action 的 actionErrors 屬性 (property) 保存的錯誤消息, actionErrors 是一個 Collection 類型的屬性;
- actionmessage 標籤輸出 action 的 actionMessages 屬性保存的消息, actionMessages 是一個 Collection 類型的屬性;
- fielderror 標籤輸出 action 的 fieldErrors 屬性保存的字段錯誤消息, actionMessages 是一個 Map 類型的屬性;
- 對於 fielderror 標籤,可以通過嵌套的 param 標籤來指定輸出特定字段的錯誤消息。
- actionerror 、 actionmessage 、 fielderror 標籤輸出消息的佈局依賴於使用的主題。
-
示例 : MessageAction .java
- public class MessageAction extends ActionSupport
- {
- @Override
- public String execute() throws Exception
- {
- // 添加 action 錯誤消息
- addActionError("Action Error Message1");
- addActionError("Action Error Message2");
- // 添加 action 一般性消息
- addActionMessage("Action Message1");
- addActionMessage("Action Message2");
- // 添加字段消息
- addFieldError("field1","field1 error");
- addFieldError("field2","field2 error");
- return SUCCESS ;
- }
- }
-
示例 : message.jsp
- <%@ page contentType= "text/html;charset=GBK" %>
- <%@ taglib prefix= "s" uri= "/struts-tags" %>
- <h3> 輸出 action 的錯誤消息 </h3>
- <s:actionerror/>
- <h3> 輸出 action 的一般性消息 </h3>
- <s:actionmessage/>
- <h3> 輸出所有字段的錯誤消息 </h3>
- <s:fielderror/>
- <h3> 輸出特定字段的錯誤消息 </h3>
- <s:fielderror>
- <s:param value= "'field2'" />
- </s:fielderror>
struts標籤庫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.