今天看了這個博客,感覺挺詳細的,對我也現在也很有幫助,所以轉載一下,希望對大家有些幫助
好東西就要分享一下:
Struts2的控制標籤,主要用於完成流程控制,以及對ValueStack的控制。數據標籤主要用於訪問ValueStack中的數據;控制標籤可以完成輸出流程的控制,例如循環,分支等操作,也可以完成對集合的合併,排序等操作。
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <!-- 引入struts2的標籤庫 -->
- <%@ taglib uri="/struts-tags" prefix="s"%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme() + "://"
- + request.getServerName() + ":" + request.getServerPort()
- + path + "/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- </head>
- <body>
- <h1>
- Struts2控制標籤案例
- </h1>
- <!--
- <h3>OGNL中的集合操作</h3>
- <h5>OGNL直接生成List類型的集合</h5>
- 語法格式:{e1,e2,e3,e4,.......}
- 以上的語法中就直接生成了一個List類型的集合,該集合中包含的元素有:e1,e2,e3,e4,
- 如果需要更多的集合元素,則元素之間可以使用英文逗號分隔.
- <h5>OGNL直接生成Map類型的集合</h5>
- 語法格式:# {key:value,key1:value1,key2:value2,.....}
- 以上的語法中就直接生成了一個Map類型的集合,該Mapd對象中的每個key-value對象之間用英文的冒號隔開
- ,多個元素之間用逗號分隔。
- <h5>OGNL提供的對集合的操作符</h5>
- OGNL提供了兩個元素符:in 和not in
- in代表的是:判斷某個元素是否在指定的集合中
- not in代表的是:某個元素是否不在指定的集合中
- 除此之外:OGNL還允許通過某個規則取得集合的子集。取得子集的操作符有:
- 1、? : 取出所有符合選擇邏輯的元素
- 2、^ : 取出符合選擇邏輯的第一個元素
- 3、$ : 取出符合選擇邏輯的最後一個元素
- <h4>控制標籤</h4>
- Struts2的控制標籤,主要用於完成流程控制,以及對ValueStack的控制。
- 數據標籤主要用於訪問ValueStack中的數據;控制標籤可以完成輸出流程的控制,例如循環,分支等操作
- 也可以完成對集合的合併,排序等操作。常見的控制標籤有:
- if :用於控制選擇輸出的標籤
- elseif:與if標籤結合使用,用於控制選擇輸出的標籤
- else :與if標籤結合使用,用於控制選擇輸出的標籤
- iterator:是一個迭代器,用於將集合迭代輸出
- sort:用於對集合排序
- append:用於將多個集合拼接成一個新的集合
- generator:是一個字符串解析器,用於將一個字符串解析成一個新的集合
- merge:用於將多個集合拼接成一個新的集合,但與append的拼接方式有所有不同
- subset:用於截取集合的部分元素,形成一個新的集合
- -->
- <h5>
- if/elseif/else標籤
- </h5>
- 這三個標籤都是用於進行分支控制的,它們都是根據一個Boolean表達式的值,來決定是否計算、輸出 標籤體的內容
- test:爲boolean表達式 如果爲真執行標籤體 否則不執行
- <s:set name="score" value="80"></s:set>
- <s:if test="%{#attr.score>60}">
- 成績及格了.....
- </s:if>
- <s:elseif test="%{#attr.score>35}">
- 成績實在是太爛了....
- </s:elseif>
- <s:else>
- 成績以及慘不忍睹.......
- </s:else>
- 上面的if/elseif/else標籤組合使用與Java語言中的if/else if/else條件控制結構相似
- <s:debug></s:debug>
- <h4>
- Iterator標籤的使用
- </h4>
- Iterator標籤主要用於對集合進行迭代,這裏的集合包含List、Set和數組,也可以對Map類型的對象 進行迭代輸出
- 可以指定3個屬性: value :這是一個可選屬性,value屬性指定的就是被迭代的集合,被迭代的集合通常
- 使用OGNL表達式指定。如果沒有指定value屬性,則使用ValueStack棧頂的集合
- id:這是可選屬性,該屬性指定了集合裏的元素的ID
- status:可選屬性,該屬性指定了迭代時的IteratorStatus實例,通過該實例即可以判定當前 迭代的元素的屬性。
- 例如:是否是最後一個元素,以及當前迭代元素的索引等。 IteratorStatus實例包含以下幾個方法: int
- getCount()返回當前迭代了幾個元素 int getIndex();返回當前元素的索引 boolean
- isEven();返回當前迭代的索引是否是偶數 boolean isFirst();返回當前迭代的索引是否是第一個元素 boolean
- isLast();返回當前迭代的索引是否是最後一個元素 boolean isOdd();返回當前迭代的索引是否是奇數
- var:當前迭代的元素 begin:開始的位置 end:結束的位置 step:跨度
- <table border="1px" cellpadding="0" cellspacing="0">
- <caption>
- 圖書名稱信息
- </caption>
- <tr>
- <th>
- 圖書的名稱
- </th>
- </tr>
- <s:iterator var="name"
- value="{'HTML入門','Java基礎','CSS入門','JavaWeb實戰'}" status="st">
- <s:if test="#st.odd">
- <tr style="background-color: red;">
- <td>
- <s:property value="name" />
- </td>
- </tr>
- </s:if>
- <s:else>
- <tr style="background-color: green;">
- <td>
- <s:property value="name" />
- </td>
- </tr>
- </s:else>
- </s:iterator>
- </table>
- 作業實現表格各行換色
- <table border="1px" cellpadding="0" cellspacing="0">
- <caption>
- 圖書信息
- </caption>
- <tr>
- <th>
- 圖書的名稱
- </th>
- <th>
- 圖書的作者
- </th>
- </tr>
- <s:iterator var="name"
- value="#{'HTML入門':'redarmy','Java基礎':'lihui','CSS入門':'baobao','JavaWeb實戰':'yq'}">
- <tr>
- <td>
- <s:property value="key" />
- </td>
- <td>
- <s:property value="value" />
- </td>
- </tr>
- </s:iterator>
- </table>
- <h5>
- append標籤的使用
- </h5>
- append標籤用於將多個對象拼接起來,形成一個新的集合
- <h5>
- List集合拼接
- </h5>
- <s:append var="newList">
- <s:param value="{'HTML入門','Java基礎','CSS入門','JavaWeb實戰'}"></s:param>
- <s:param value="{'HIbernate教程','Struts2教程'}"></s:param>
- </s:append>
- <table border="1px" cellpadding="1px" cellspacing="1px">
- <caption>
- 圖書信息2
- </caption>
- <tr>
- <th>
- 圖書名稱
- </th>
- </tr>
- <s:iterator value="#newList">
- <tr>
- <td>
- <s:property />
- </td>
- </tr>
- </s:iterator>
- </table>
- <h5>
- Map集合的拼接
- </h5>
- <s:append var="newMap">
- <s:param
- value="#{'HTML入門':'redarmy','Java基礎':'baobao','CSS入門':'李慧','JavaWeb實戰':'yq'}"></s:param>
- <s:param value="#{'HIbernate教程':'李剛','Struts2教程':'redarmy'}"></s:param>
- </s:append>
- <table border="1px" cellpadding="1px" cellspacing="1px">
- <caption>
- 圖書信息2
- </caption>
- <tr>
- <th>
- 圖書名稱
- </th>
- <th>
- 圖書作者
- </th>
- </tr>
- <s:iterator value="#newMap">
- <tr>
- <td>
- <s:property value="key" />
- </td>
- <td>
- <s:property value="value" />
- </td>
- </tr>
- </s:iterator>
- </table>
- <h5>
- map List集合的拼接
- </h5>
- <s:append var="newLM">
- <s:param
- value="#{'HTML入門':'redarmy','Java基礎':'baobao','CSS入門':'李慧','JavaWeb實戰':'yq'}"></s:param>
- <!-- List方式要寫成Map的形式 但沒有value值 -->
- <s:param value="#{'HIbernate教程','Struts2教程'}"></s:param>
- </s:append>
- <table border="1px" cellpadding="1px" cellspacing="1px">
- <caption>
- 圖書信息2
- </caption>
- <tr>
- <th>
- 圖書名稱
- </th>
- <th>
- 圖書作者
- </th>
- </tr>
- <s:iterator value="#newLM">
- <tr>
- <td>
- <s:property value="key" />
- </td>
- <td>
- <s:property value="value" />
- </td>
- </tr>
- </s:iterator>
- </table>
- <h5>
- merge標籤
- </h5>
- merge標籤的用法看起來非常像append標籤,但是有區別:
- <s:append var="ast">
- <s:param value="{'html','css','ajax'}"></s:param>
- <s:param value="{'java','jsp','servlet'}"></s:param>
- <s:param value="{'struts2','mysql','hibernate'}"></s:param>
- </s:append>
- <s:merge var="mst">
- <s:param value="{'html','css','ajax'}"></s:param>
- <s:param value="{'java','jsp','servlet'}"></s:param>
- <s:param value="{'struts2','mysql','hibernate'}"></s:param>
- </s:merge>
- <h3>
- append標籤拼接
- </h3>
- <s:iterator value="#ast">
- <s:property />
- </s:iterator>
- <h4>
- merge標籤拼接
- </h4>
- <s:iterator value="#mst">
- <s:property />
- </s:iterator>
- 以上看出:append標籤的拼接方式是: 第1個集合中的第一個元素 第1個集合中的第二個元素 第1個集合中的第三個元素
- 第2個集合中的第一個元素 第2個集合中的第二個元素 第2個集合中的第三個元素 第3個集合中的第一個元素 第3個集合中的第二個元素
- 第3個集合中的第三個元素 merge標籤的拼接方式是: 第1個集合中的第一個元素 第2個集合中的第一個元素 第3個集合中的第一個元素
- 第1個集合中的第二個元素 第2個集合中的第二個元素 第3個集合中的第二個元素 第1個集合中的第三個元素 第2個集合中的第三個元素
- 第3個集合中的第三個元素
- <h5>
- generator標籤
- </h5>
- 將制定的字符串按指定的分隔符分隔成多個字串. count:可選屬性,指定生成集合中元素的總數
- separator:必填屬性:指定解析字符串的分隔符 val:必填屬性:指定解析字符串
- converter:可選屬性,轉換器,該轉換器負責將集合中的每個字符串轉換成對象
- id:可選屬性,如果指明該屬性則生成的集合放入到pageContext屬性中 註釋:generator分隔的字符串
- ,如果在標籤體內,整個臨時生成的集合將位於ValueStack的頂端 .但標籤結束時,被移出ValueStack。
- <table border="1px">
- <tr>
- <th>
- 名稱
- </th>
- </tr>
- <s:generator val="'this,is,a,doctor'" separator=",">
- <!-- 由於在generator標籤體內,該集合位於ValueStack的棧頂 ,故此處迭代的就是臨時生成的集合 -->
- <s:iterator var="bname">
- <tr>
- <td>
- <s:property value="bname" />
- </td>
- </tr>
- </s:iterator>
- </s:generator>
- </table>
- <!-- 通過id標識此解析的集合存入到pageContext中 -->
- <s:generator separator="," val="'this,is,a,man'" id="bks"></s:generator>
- <h1>
- 標籤體外打印解析的字符串集合
- </h1>
- <s:iterator value="#attr.bks">
- <s:property />
- </s:iterator>
- <h1>
- subset標籤
- </h1>
- subset標籤用於取得集合的子集,該標籤的底層通過:org.apache.struts2.uitl.SubsetIteratorFilte類提供實現
- 屬性: count:可選屬性:代表子集中的元素個數,如果沒有指定代表源集合的全部元素
- source:可選屬性:指定源集合,如果沒有指定代表是valueStack的棧頂集合 start:可選屬性:從第幾元素開始截取
- decider:可選屬性:指定由開發者自己決定是否選中該元素。 注意事項:
- 在subset標籤內時,subset標籤生成的子集位於valueStack的棧頂,如果標籤結束,該標籤生成的子集
- 將被移出valueStack棧。
- <s:subset source="{'java','test','mybook','txs','lihui'}" start="1"
- count="3">
- <!-- 由於在subset標籤體內,該子集位於ValueStack的棧頂 ,故此處迭代的就是臨時生成的集合 -->
- <s:iterator>
- <s:property />
- </s:iterator>
- <!-- 注意1代表的是第二元素 -->
- </s:subset>
- <h5>
- 實現自己的Decider實例
- </h5>
- <s:bean name="edu.dc.MyDecider" id="mydecider"></s:bean>
- <h6>
- 通過自己定義的Decider實例來截取目標集合,生成子集
- </h6>
- <s:subset
- source="{'01Java入門','JSP入門','Servlet入門','02Java基礎案例','基於Java的經典案例'}"
- decider="#mydecider">
- <s:iterator>
- <s:property />
- </s:iterator>
- </s:subset>
- <h1>
- sort標籤
- </h1>
- 用於對指定集合元素進行排序,進行排序時,必須提供自己的排序規則,即實現自己的
- Comparator,自己的Comparator需要實現java.util.Comparator接口 屬性:
- comparator:必填屬性,指定進行排序的comparator的實例
- source:可選屬性:指定排序的集合,如果沒有指定代表是valueStack的棧頂集合 備註:
- 在sort標籤內時,sort標籤生成的子集位於valueStack的棧頂,如果標籤結束,該標籤生成的子集
- 將被移出valueStack棧。
- <s:bean var="mycomparator" name="edu.dc.MyComparator"></s:bean>
- <s:sort comparator="#mycomparator"
- source="{'JavaEE','css','JavaHTMl'}">
- <s:iterator>
- <s:property />
- </s:iterator>
- </s:sort>
- </body>
- </html>
- /**以上用到的Subset標籤用到的bean類如下*/
- package edu.dc;
- import org.apache.struts2.util.*;
- /** 自定定義Decider類,實現SubsetIteratorFilter.Decider */
- public class MyDecider implements SubsetIteratorFilter.Decider {
- /** 實現Decider接口中的decide方法,該方法決定集合中的元素是否被選入到子集中 */
- public boolean decide(Object arg0) throws Exception {
- System.out.println("----------------");
- /** 把arg0造型爲字符串 */
- String str = (String) arg0;
- /** 如果集合中包含java 那麼即可被選入到子集中 */
- System.out.println("----------------" + (str.indexOf("Java") > 0));
- return (str.indexOf("Java") > 0);
- }
- }
- /**以下是sort標籤實例中用到的備案實例*/
- package edu.dc;
- import java.util.Comparator;
- /** 需要實現Comparator接口 */
- public class MyComparator implements Comparator<String> {
- /**
- * 如果該方法返回一個大於0的整數,則第一個元素大於第二元素,如果爲0則相同 如果小於零,則第一個元素小於第二元素
- */
- public int compare(String o1, String o2) {
- /** 根據字符串的長度決定字符串的大小 */
- return (o1.length() - o2.length());
- }
- }