原创:Struts2控制标签解析

truts2的控制标签,主要用于完成流程控制,以及对ValueStack的控制。数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程的控制,例如循环,分支等操作,也可以完成对集合的合并,排序等操作。
 
Java代码
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>   
  2. <!--  引入struts2的标签库 -->   
  3. <%@ taglib uri="/struts-tags" prefix="s"%>   
  4. <%   
  5.     String path = request.getContextPath();   
  6.     String basePath = request.getScheme() + "://"  
  7.             + request.getServerName() + ":" + request.getServerPort()   
  8.             + path + "/";   
  9. %>   
  10.   
  11. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
  12. <html>   
  13.     <head>   
  14.         <base href="<%=basePath%>">   
  15.   
  16.     </head>   
  17.   
  18.     <body>   
  19.         <h1>   
  20.             Struts2控制标签案例   
  21.         </h1>   
  22.         <!--     
  23.       <h3>OGNL中的集合操作</h3>   
  24.       <h5>OGNL直接生成List类型的集合</h5>   
  25.          
  26.          语法格式:{e1,e2,e3,e4,.......}   
  27.          以上的语法中就直接生成了一个List类型的集合,该集合中包含的元素有:e1,e2,e3,e4,   
  28.          如果需要更多的集合元素,则元素之间可以使用英文逗号分隔.   
  29.           
  30.   
  31.        <h5>OGNL直接生成Map类型的集合</h5>   
  32.           
  33.        语法格式:# {key:value,key1:value1,key2:value2,.....}   
  34.        以上的语法中就直接生成了一个Map类型的集合,该Mapd对象中的每个key-value对象之间用英文的冒号隔开   
  35.        ,多个元素之间用逗号分隔。   
  36.           
  37.   
  38.        <h5>OGNL提供的对集合的操作符</h5>   
  39.           
  40.           OGNL提供了两个元素符:in 和not in   
  41.             in代表的是:判断某个元素是否在指定的集合中   
  42.             not in代表的是:某个元素是否不在指定的集合中   
  43.           除此之外:OGNL还允许通过某个规则取得集合的子集。取得子集的操作符有:   
  44.           1、? : 取出所有符合选择逻辑的元素   
  45.           2、^ : 取出符合选择逻辑的第一个元素   
  46.           3、$ : 取出符合选择逻辑的最后一个元素   
  47.           
  48.   
  49.           
  50.        <h4>控制标签</h4>   
  51.           
  52.          Struts2的控制标签,主要用于完成流程控制,以及对ValueStack的控制。   
  53.          数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程的控制,例如循环,分支等操作   
  54.          也可以完成对集合的合并,排序等操作。常见的控制标签有:   
  55.          if :用于控制选择输出的标签   
  56.          elseif:与if标签结合使用,用于控制选择输出的标签   
  57.          else :与if标签结合使用,用于控制选择输出的标签   
  58.          iterator:是一个迭代器,用于将集合迭代输出   
  59.          sort:用于对集合排序   
  60.          append:用于将多个集合拼接成一个新的集合   
  61.          generator:是一个字符串解析器,用于将一个字符串解析成一个新的集合   
  62.          merge:用于将多个集合拼接成一个新的集合,但与append的拼接方式有所有不同   
  63.          subset:用于截取集合的部分元素,形成一个新的集合   
  64.             
  65.           
  66.   
  67.        -->   
  68.         <h5>   
  69.             if/elseif/else标签   
  70.         </h5>   
  71.            
  72.             这三个标签都是用于进行分支控制的,它们都是根据一个Boolean表达式的值,来决定是否计算、输出 标签体的内容   
  73.             test:为boolean表达式 如果为真执行标签体 否则不执行   
  74.             <s:set name="score" value="80"></s:set>   
  75.                
  76.   
  77.   
  78.             <s:if test="%{#attr.score>60}">   
  79.                               成绩及格了.....   
  80.             </s:if>   
  81.             <s:elseif test="%{#attr.score>35}">   
  82.                                       成绩实在是太烂了....   
  83.           </s:elseif>   
  84.   
  85.             <s:else>   
  86.                                     成绩以及惨不忍睹.......   
  87.           </s:else>   
  88.   
  89.                
  90.   
  91.             上面的if/elseif/else标签组合使用与Java语言中的if/else if/else条件控制结构相似   
  92.             <s:debug></s:debug>   
  93.            
  94.   
  95.   
  96.         <h4>   
  97.             Iterator标签的使用   
  98.         </h4>   
  99.   
  100.            
  101.             Iterator标签主要用于对集合进行迭代,这里的集合包含List、Set和数组,也可以对Map类型的对象 进行迭代输出   
  102.             可以指定3个属性: value :这是一个可选属性,value属性指定的就是被迭代的集合,被迭代的集合通常   
  103.             使用OGNL表达式指定。如果没有指定value属性,则使用ValueStack栈顶的集合   
  104.             id:这是可选属性,该属性指定了集合里的元素的ID   
  105.             status:可选属性,该属性指定了迭代时的IteratorStatus实例,通过该实例即可以判定当前 迭代的元素的属性。   
  106.             例如:是否是最后一个元素,以及当前迭代元素的索引等。 IteratorStatus实例包含以下几个方法: int  
  107.             getCount()返回当前迭代了几个元素 int getIndex();返回当前元素的索引 boolean  
  108.             isEven();返回当前迭代的索引是否是偶数 boolean isFirst();返回当前迭代的索引是否是第一个元素 boolean  
  109.             isLast();返回当前迭代的索引是否是最后一个元素 boolean isOdd();返回当前迭代的索引是否是奇数   
  110.   
  111.             var:当前迭代的元素 begin:开始的位置 end:结束的位置 step:跨度   
  112.   
  113.             <table border="1px" cellpadding="0" cellspacing="0">   
  114.   
  115.                 <caption>   
  116.                     图书名称信息   
  117.                 </caption>   
  118.                 <tr>   
  119.                     <th>   
  120.                         图书的名称   
  121.                     </th>   
  122.                 </tr>   
  123.   
  124.                 <s:iterator var="name"  
  125.                     value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}" status="st">   
  126.   
  127.                     <s:if test="#st.odd">   
  128.                         <tr style="background-color: red;">   
  129.                             <td>   
  130.                                 <s:property value="name" />   
  131.                             </td>   
  132.                         </tr>   
  133.                     </s:if>   
  134.                     <s:else>   
  135.                         <tr style="background-color: green;">   
  136.                             <td>   
  137.                                 <s:property value="name" />   
  138.                             </td>   
  139.                         </tr>   
  140.                     </s:else>   
  141.   
  142.   
  143.                 </s:iterator>   
  144.   
  145.             </table>   
  146.   
  147.   
  148.                
  149.   
  150.             作业实现表格各行换色   
  151.                
  152.   
  153.   
  154.                
  155.   
  156.   
  157.             <table border="1px" cellpadding="0" cellspacing="0">   
  158.   
  159.                 <caption>   
  160.                     图书信息   
  161.                 </caption>   
  162.                 <tr>   
  163.                     <th>   
  164.                         图书的名称   
  165.                     </th>   
  166.                     <th>   
  167.                         图书的作者   
  168.                     </th>   
  169.                 </tr>   
  170.   
  171.                 <s:iterator var="name"  
  172.                     value="#{'HTML入门':'redarmy','Java基础':'lihui','CSS入门':'baobao','JavaWeb实战':'yq'}">   
  173.                     <tr>   
  174.                         <td>   
  175.                             <s:property value="key" />   
  176.                         </td>   
  177.                         <td>   
  178.                             <s:property value="value" />   
  179.                         </td>   
  180.                     </tr>   
  181.                 </s:iterator>   
  182.   
  183.             </table>   
  184.            
  185.   
  186.   
  187.         <h5>   
  188.             append标签的使用   
  189.         </h5>   
  190.   
  191.            
  192.             append标签用于将多个对象拼接起来,形成一个新的集合   
  193.   
  194.             <h5>   
  195.                 List集合拼接   
  196.             </h5>   
  197.             <s:append var="newList">   
  198.                 <s:param value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}"></s:param>   
  199.                 <s:param value="{'HIbernate教程','Struts2教程'}"></s:param>   
  200.             </s:append>   
  201.   
  202.             <table border="1px" cellpadding="1px" cellspacing="1px">   
  203.                 <caption>   
  204.                     图书信息2  
  205.                 </caption>   
  206.                 <tr>   
  207.                     <th>   
  208.                         图书名称   
  209.                     </th>   
  210.                 </tr>   
  211.   
  212.                 <s:iterator value="#newList">   
  213.   
  214.                     <tr>   
  215.                         <td>   
  216.                             <s:property />   
  217.                         </td>   
  218.   
  219.                     </tr>   
  220.                 </s:iterator>   
  221.   
  222.             </table>   
  223.   
  224.                
  225.   
  226.             <h5>   
  227.                 Map集合的拼接   
  228.             </h5>   
  229.   
  230.             <s:append var="newMap">   
  231.                 <s:param   
  232.                     value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param>   
  233.                 <s:param value="#{'HIbernate教程':'李刚','Struts2教程':'redarmy'}"></s:param>   
  234.             </s:append>   
  235.   
  236.             <table border="1px" cellpadding="1px" cellspacing="1px">   
  237.                 <caption>   
  238.                     图书信息2  
  239.                 </caption>   
  240.                 <tr>   
  241.                     <th>   
  242.                         图书名称   
  243.                     </th>   
  244.                     <th>   
  245.                         图书作者   
  246.                     </th>   
  247.                 </tr>   
  248.   
  249.                 <s:iterator value="#newMap">   
  250.   
  251.                     <tr>   
  252.                         <td>   
  253.                             <s:property value="key" />   
  254.                         </td>   
  255.                         <td>   
  256.                             <s:property value="value" />   
  257.                         </td>   
  258.   
  259.                     </tr>   
  260.                 </s:iterator>   
  261.   
  262.             </table>   
  263.   
  264.   
  265.   
  266.                
  267.   
  268.   
  269.             <h5>   
  270.                 map List集合的拼接   
  271.             </h5>   
  272.   
  273.   
  274.             <s:append var="newLM">   
  275.                 <s:param   
  276.                     value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param>   
  277.                 <!-- List方式要写成Map的形式 但没有value值 -->   
  278.                 <s:param value="#{'HIbernate教程','Struts2教程'}"></s:param>   
  279.             </s:append>   
  280.   
  281.             <table border="1px" cellpadding="1px" cellspacing="1px">   
  282.                 <caption>   
  283.                     图书信息2  
  284.                 </caption>   
  285.                 <tr>   
  286.                     <th>   
  287.                         图书名称   
  288.                     </th>   
  289.                     <th>   
  290.                         图书作者   
  291.                     </th>   
  292.                 </tr>   
  293.   
  294.                 <s:iterator value="#newLM">   
  295.   
  296.                     <tr>   
  297.                         <td>   
  298.                             <s:property value="key" />   
  299.                         </td>   
  300.                         <td>   
  301.                             <s:property value="value" />   
  302.                         </td>   
  303.   
  304.                     </tr>   
  305.                 </s:iterator>   
  306.   
  307.             </table>   
  308.                
  309.   
  310.   
  311.   
  312.             <h5>   
  313.                 merge标签   
  314.             </h5>   
  315.                
  316.                 merge标签的用法看起来非常像append标签,但是有区别:   
  317.                 <s:append var="ast">   
  318.                     <s:param value="{'html','css','ajax'}"></s:param>   
  319.                     <s:param value="{'java','jsp','servlet'}"></s:param>   
  320.                     <s:param value="{'struts2','mysql','hibernate'}"></s:param>   
  321.                 </s:append>   
  322.   
  323.   
  324.                 <s:merge var="mst">   
  325.                     <s:param value="{'html','css','ajax'}"></s:param>   
  326.                     <s:param value="{'java','jsp','servlet'}"></s:param>   
  327.                     <s:param value="{'struts2','mysql','hibernate'}"></s:param>   
  328.                 </s:merge>   
  329.                 <h3>   
  330.                     append标签拼接   
  331.                 </h3>   
  332.                 <s:iterator value="#ast">   
  333.                     <s:property />   
  334.                        
  335.   
  336.                 </s:iterator>   
  337.                 <h4>   
  338.                     merge标签拼接   
  339.                 </h4>   
  340.                 <s:iterator value="#mst">   
  341.                     <s:property />   
  342.                        
  343.   
  344.                 </s:iterator>   
  345.   
  346.                    
  347.   
  348.                 以上看出:append标签的拼接方式是: 第1个集合中的第一个元素 第1个集合中的第二个元素 第1个集合中的第三个元素   
  349.                 第2个集合中的第一个元素 第2个集合中的第二个元素 第2个集合中的第三个元素 第3个集合中的第一个元素 第3个集合中的第二个元素   
  350.                 第3个集合中的第三个元素 merge标签的拼接方式是: 第1个集合中的第一个元素 第2个集合中的第一个元素 第3个集合中的第一个元素   
  351.                 第1个集合中的第二个元素 第2个集合中的第二个元素 第3个集合中的第二个元素 第1个集合中的第三个元素 第2个集合中的第三个元素   
  352.                 第3个集合中的第三个元素   
  353.   
  354.                
  355.   
  356.            
  357.   
  358.   
  359.         <h5>   
  360.             generator标签   
  361.         </h5>   
  362.            
  363.             将制定的字符串按指定的分隔符分隔成多个字串. count:可选属性,指定生成集合中元素的总数   
  364.             separator:必填属性:指定解析字符串的分隔符 val:必填属性:指定解析字符串   
  365.             converter:可选属性,转换器,该转换器负责将集合中的每个字符串转换成对象   
  366.             id:可选属性,如果指明该属性则生成的集合放入到pageContext属性中 注释:generator分隔的字符串   
  367.             ,如果在标签体内,整个临时生成的集合将位于ValueStack的顶端 .但标签结束时,被移出ValueStack。   
  368.                
  369.   
  370.                
  371.   
  372.             <table border="1px">   
  373.                 <tr>   
  374.                     <th>   
  375.                         名称   
  376.                     </th>   
  377.                 </tr>   
  378.                 <s:generator val="'this,is,a,doctor'" separator=",">   
  379.                     <!-- 由于在generator标签体内,该集合位于ValueStack的栈顶 ,故此处迭代的就是临时生成的集合 -->   
  380.                     <s:iterator var="bname">   
  381.                         <tr>   
  382.                             <td>   
  383.                                 <s:property value="bname" />   
  384.                             </td>   
  385.                         </tr>   
  386.                     </s:iterator>   
  387.                        
  388.   
  389.   
  390.   
  391.                 </s:generator>   
  392.             </table>   
  393.             <!-- 通过id标识此解析的集合存入到pageContext中 -->   
  394.             <s:generator separator="," val="'this,is,a,man'" id="bks"></s:generator>   
  395.                
  396.   
  397.             <h1>   
  398.                 标签体外打印解析的字符串集合   
  399.             </h1>   
  400.   
  401.             <s:iterator value="#attr.bks">   
  402.                 <s:property />   
  403.                    
  404.   
  405.             </s:iterator>   
  406.            
  407.   
  408.   
  409.   
  410.         <h1>   
  411.             subset标签   
  412.         </h1>   
  413.            
  414.             subset标签用于取得集合的子集,该标签的底层通过:org.apache.struts2.uitl.SubsetIteratorFilte类提供实现   
  415.             属性: count:可选属性:代表子集中的元素个数,如果没有指定代表源集合的全部元素   
  416.             source:可选属性:指定源集合,如果没有指定代表是valueStack的栈顶集合 start:可选属性:从第几元素开始截取   
  417.             decider:可选属性:指定由开发者自己决定是否选中该元素。 注意事项:   
  418.             在subset标签内时,subset标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集   
  419.             将被移出valueStack栈。   
  420.   
  421.   
  422.             <s:subset source="{'java','test','mybook','txs','lihui'}" start="1"  
  423.                 count="3">   
  424.                 <!-- 由于在subset标签体内,该子集位于ValueStack的栈顶 ,故此处迭代的就是临时生成的集合 -->   
  425.                 <s:iterator>   
  426.                     <s:property />   
  427.                        
  428.   
  429.                 </s:iterator>   
  430.                 <!-- 注意1代表的是第二元素 -->   
  431.             </s:subset>   
  432.   
  433.                
  434.   
  435.                
  436.   
  437.                
  438.   
  439.             <h5>   
  440.                 实现自己的Decider实例   
  441.             </h5>   
  442.             <s:bean name="edu.dc.MyDecider" id="mydecider"></s:bean>   
  443.             <h6>   
  444.                 通过自己定义的Decider实例来截取目标集合,生成子集   
  445.             </h6>   
  446.             <s:subset   
  447.                 source="{'01Java入门','JSP入门','Servlet入门','02Java基础案例','基于Java的经典案例'}"  
  448.                 decider="#mydecider">   
  449.                 <s:iterator>   
  450.                     <s:property />   
  451.                        
  452.   
  453.                 </s:iterator>   
  454.             </s:subset>   
  455.   
  456.             <h1>   
  457.                 sort标签   
  458.             </h1>   
  459.                
  460.                 用于对指定集合元素进行排序,进行排序时,必须提供自己的排序规则,即实现自己的   
  461.                 Comparator,自己的Comparator需要实现java.util.Comparator接口 属性:   
  462.                 comparator:必填属性,指定进行排序的comparator的实例   
  463.                 source:可选属性:指定排序的集合,如果没有指定代表是valueStack的栈顶集合 备注:   
  464.                 在sort标签内时,sort标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集   
  465.                 将被移出valueStack栈。   
  466.   
  467.                 <s:bean var="mycomparator" name="edu.dc.MyComparator"></s:bean>   
  468.                 <s:sort comparator="#mycomparator"  
  469.                     source="{'JavaEE','css','JavaHTMl'}">   
  470.                     <s:iterator>   
  471.                         <s:property />   
  472.                            
  473.   
  474.                     </s:iterator>   
  475.   
  476.                 </s:sort>   
  477.                
  478.   
  479.   
  480.   
  481.            
  482.   
  483.     </body>   
  484. </html>   
  485.   
  486. /**以上用到的Subset标签用到的bean类如下*/  
  487. package edu.dc;   
  488.   
  489. import org.apache.struts2.util.*;   
  490.   
  491. /** 自定定义Decider类,实现SubsetIteratorFilter.Decider */  
  492. public class MyDecider implements SubsetIteratorFilter.Decider {   
  493.   
  494.     /** 实现Decider接口中的decide方法,该方法决定集合中的元素是否被选入到子集中 */  
  495.     public boolean decide(Object arg0) throws Exception {   
  496.         System.out.println("----------------");   
  497.         /** 把arg0造型为字符串 */  
  498.         String str = (String) arg0;   
  499.         /** 如果集合中包含java 那么即可被选入到子集中 */  
  500.         System.out.println("----------------" + (str.indexOf("Java") > 0));   
  501.         return (str.indexOf("Java") > 0);   
  502.     }   
  503.   
  504. }   
  505.   
  506. /**以下是sort标签实例中用到的备案实例*/  
  507.   
  508. package edu.dc;   
  509.   
  510. import java.util.Comparator;   
  511.   
  512. /** 需要实现Comparator接口 */  
  513. public class MyComparator implements Comparator<String> {   
  514.     /**  
  515.      * 如果该方法返回一个大于0的整数,则第一个元素大于第二元素,如果为0则相同 如果小于零,则第一个元素小于第二元素  
  516.      */  
  517.     public int compare(String o1, String o2) {   
  518.         /** 根据字符串的长度决定字符串的大小 */  
  519.         return (o1.length() - o2.length());   
  520.     }   
  521.   
  522. }  
[java] view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <!--  引入struts2的标签库 -->  
  3. <%@ taglib uri="/struts-tags" prefix="s"%>  
  4. <%  
  5.     String path = request.getContextPath();  
  6.     String basePath = request.getScheme() + "://"  
  7.             + request.getServerName() + ":" + request.getServerPort()  
  8.             + path + "/";  
  9. %>  
  10.   
  11. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  12. <html>  
  13.     <head>  
  14.         <base href="<%=basePath%>">  
  15.   
  16.     </head>  
  17.   
  18.     <body>  
  19.         <h1>  
  20.             Struts2控制标签案例  
  21.         </h1>  
  22.         <!--    
  23.       <h3>OGNL中的集合操作</h3>  
  24.       <h5>OGNL直接生成List类型的集合</h5>  
  25.         
  26.          语法格式:{e1,e2,e3,e4,.......}  
  27.          以上的语法中就直接生成了一个List类型的集合,该集合中包含的元素有:e1,e2,e3,e4,  
  28.          如果需要更多的集合元素,则元素之间可以使用英文逗号分隔.  
  29.          
  30.   
  31.        <h5>OGNL直接生成Map类型的集合</h5>  
  32.          
  33.        语法格式:# {key:value,key1:value1,key2:value2,.....}  
  34.        以上的语法中就直接生成了一个Map类型的集合,该Mapd对象中的每个key-value对象之间用英文的冒号隔开  
  35.        ,多个元素之间用逗号分隔。  
  36.          
  37.   
  38.        <h5>OGNL提供的对集合的操作符</h5>  
  39.          
  40.           OGNL提供了两个元素符:in 和not in  
  41.             in代表的是:判断某个元素是否在指定的集合中  
  42.             not in代表的是:某个元素是否不在指定的集合中  
  43.           除此之外:OGNL还允许通过某个规则取得集合的子集。取得子集的操作符有:  
  44.           1、? : 取出所有符合选择逻辑的元素  
  45.           2、^ : 取出符合选择逻辑的第一个元素  
  46.           3、$ : 取出符合选择逻辑的最后一个元素  
  47.          
  48.   
  49.          
  50.        <h4>控制标签</h4>  
  51.          
  52.          Struts2的控制标签,主要用于完成流程控制,以及对ValueStack的控制。  
  53.          数据标签主要用于访问ValueStack中的数据;控制标签可以完成输出流程的控制,例如循环,分支等操作  
  54.          也可以完成对集合的合并,排序等操作。常见的控制标签有:  
  55.          if :用于控制选择输出的标签  
  56.          elseif:与if标签结合使用,用于控制选择输出的标签  
  57.          else :与if标签结合使用,用于控制选择输出的标签  
  58.          iterator:是一个迭代器,用于将集合迭代输出  
  59.          sort:用于对集合排序  
  60.          append:用于将多个集合拼接成一个新的集合  
  61.          generator:是一个字符串解析器,用于将一个字符串解析成一个新的集合  
  62.          merge:用于将多个集合拼接成一个新的集合,但与append的拼接方式有所有不同  
  63.          subset:用于截取集合的部分元素,形成一个新的集合  
  64.            
  65.          
  66.   
  67.        -->  
  68.         <h5>  
  69.             if/elseif/else标签  
  70.         </h5>  
  71.           
  72.             这三个标签都是用于进行分支控制的,它们都是根据一个Boolean表达式的值,来决定是否计算、输出 标签体的内容  
  73.             test:为boolean表达式 如果为真执行标签体 否则不执行  
  74.             <s:set name="score" value="80"></s:set>  
  75.               
  76.   
  77.   
  78.             <s:if test="%{#attr.score>60}">  
  79.                               成绩及格了.....  
  80.             </s:if>  
  81.             <s:elseif test="%{#attr.score>35}">  
  82.                                       成绩实在是太烂了....  
  83.           </s:elseif>  
  84.   
  85.             <s:else>  
  86.                                     成绩以及惨不忍睹.......  
  87.           </s:else>  
  88.   
  89.               
  90.   
  91.             上面的if/elseif/else标签组合使用与Java语言中的if/else if/else条件控制结构相似  
  92.             <s:debug></s:debug>  
  93.           
  94.   
  95.   
  96.         <h4>  
  97.             Iterator标签的使用  
  98.         </h4>  
  99.   
  100.           
  101.             Iterator标签主要用于对集合进行迭代,这里的集合包含List、Set和数组,也可以对Map类型的对象 进行迭代输出  
  102.             可以指定3个属性: value :这是一个可选属性,value属性指定的就是被迭代的集合,被迭代的集合通常  
  103.             使用OGNL表达式指定。如果没有指定value属性,则使用ValueStack栈顶的集合  
  104.             id:这是可选属性,该属性指定了集合里的元素的ID  
  105.             status:可选属性,该属性指定了迭代时的IteratorStatus实例,通过该实例即可以判定当前 迭代的元素的属性。  
  106.             例如:是否是最后一个元素,以及当前迭代元素的索引等。 IteratorStatus实例包含以下几个方法: int  
  107.             getCount()返回当前迭代了几个元素 int getIndex();返回当前元素的索引 boolean  
  108.             isEven();返回当前迭代的索引是否是偶数 boolean isFirst();返回当前迭代的索引是否是第一个元素 boolean  
  109.             isLast();返回当前迭代的索引是否是最后一个元素 boolean isOdd();返回当前迭代的索引是否是奇数  
  110.   
  111.             var:当前迭代的元素 begin:开始的位置 end:结束的位置 step:跨度  
  112.   
  113.             <table border="1px" cellpadding="0" cellspacing="0">  
  114.   
  115.                 <caption>  
  116.                     图书名称信息  
  117.                 </caption>  
  118.                 <tr>  
  119.                     <th>  
  120.                         图书的名称  
  121.                     </th>  
  122.                 </tr>  
  123.   
  124.                 <s:iterator var="name"  
  125.                     value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}" status="st">  
  126.   
  127.                     <s:if test="#st.odd">  
  128.                         <tr style="background-color: red;">  
  129.                             <td>  
  130.                                 <s:property value="name" />  
  131.                             </td>  
  132.                         </tr>  
  133.                     </s:if>  
  134.                     <s:else>  
  135.                         <tr style="background-color: green;">  
  136.                             <td>  
  137.                                 <s:property value="name" />  
  138.                             </td>  
  139.                         </tr>  
  140.                     </s:else>  
  141.   
  142.   
  143.                 </s:iterator>  
  144.   
  145.             </table>  
  146.   
  147.   
  148.               
  149.   
  150.             作业实现表格各行换色  
  151.               
  152.   
  153.   
  154.               
  155.   
  156.   
  157.             <table border="1px" cellpadding="0" cellspacing="0">  
  158.   
  159.                 <caption>  
  160.                     图书信息  
  161.                 </caption>  
  162.                 <tr>  
  163.                     <th>  
  164.                         图书的名称  
  165.                     </th>  
  166.                     <th>  
  167.                         图书的作者  
  168.                     </th>  
  169.                 </tr>  
  170.   
  171.                 <s:iterator var="name"  
  172.                     value="#{'HTML入门':'redarmy','Java基础':'lihui','CSS入门':'baobao','JavaWeb实战':'yq'}">  
  173.                     <tr>  
  174.                         <td>  
  175.                             <s:property value="key" />  
  176.                         </td>  
  177.                         <td>  
  178.                             <s:property value="value" />  
  179.                         </td>  
  180.                     </tr>  
  181.                 </s:iterator>  
  182.   
  183.             </table>  
  184.           
  185.   
  186.   
  187.         <h5>  
  188.             append标签的使用  
  189.         </h5>  
  190.   
  191.           
  192.             append标签用于将多个对象拼接起来,形成一个新的集合  
  193.   
  194.             <h5>  
  195.                 List集合拼接  
  196.             </h5>  
  197.             <s:append var="newList">  
  198.                 <s:param value="{'HTML入门','Java基础','CSS入门','JavaWeb实战'}"></s:param>  
  199.                 <s:param value="{'HIbernate教程','Struts2教程'}"></s:param>  
  200.             </s:append>  
  201.   
  202.             <table border="1px" cellpadding="1px" cellspacing="1px">  
  203.                 <caption>  
  204.                     图书信息2  
  205.                 </caption>  
  206.                 <tr>  
  207.                     <th>  
  208.                         图书名称  
  209.                     </th>  
  210.                 </tr>  
  211.   
  212.                 <s:iterator value="#newList">  
  213.   
  214.                     <tr>  
  215.                         <td>  
  216.                             <s:property />  
  217.                         </td>  
  218.   
  219.                     </tr>  
  220.                 </s:iterator>  
  221.   
  222.             </table>  
  223.   
  224.               
  225.   
  226.             <h5>  
  227.                 Map集合的拼接  
  228.             </h5>  
  229.   
  230.             <s:append var="newMap">  
  231.                 <s:param  
  232.                     value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param>  
  233.                 <s:param value="#{'HIbernate教程':'李刚','Struts2教程':'redarmy'}"></s:param>  
  234.             </s:append>  
  235.   
  236.             <table border="1px" cellpadding="1px" cellspacing="1px">  
  237.                 <caption>  
  238.                     图书信息2  
  239.                 </caption>  
  240.                 <tr>  
  241.                     <th>  
  242.                         图书名称  
  243.                     </th>  
  244.                     <th>  
  245.                         图书作者  
  246.                     </th>  
  247.                 </tr>  
  248.   
  249.                 <s:iterator value="#newMap">  
  250.   
  251.                     <tr>  
  252.                         <td>  
  253.                             <s:property value="key" />  
  254.                         </td>  
  255.                         <td>  
  256.                             <s:property value="value" />  
  257.                         </td>  
  258.   
  259.                     </tr>  
  260.                 </s:iterator>  
  261.   
  262.             </table>  
  263.   
  264.   
  265.   
  266.               
  267.   
  268.   
  269.             <h5>  
  270.                 map List集合的拼接  
  271.             </h5>  
  272.   
  273.   
  274.             <s:append var="newLM">  
  275.                 <s:param  
  276.                     value="#{'HTML入门':'redarmy','Java基础':'baobao','CSS入门':'李慧','JavaWeb实战':'yq'}"></s:param>  
  277.                 <!-- List方式要写成Map的形式 但没有value值 -->  
  278.                 <s:param value="#{'HIbernate教程','Struts2教程'}"></s:param>  
  279.             </s:append>  
  280.   
  281.             <table border="1px" cellpadding="1px" cellspacing="1px">  
  282.                 <caption>  
  283.                     图书信息2  
  284.                 </caption>  
  285.                 <tr>  
  286.                     <th>  
  287.                         图书名称  
  288.                     </th>  
  289.                     <th>  
  290.                         图书作者  
  291.                     </th>  
  292.                 </tr>  
  293.   
  294.                 <s:iterator value="#newLM">  
  295.   
  296.                     <tr>  
  297.                         <td>  
  298.                             <s:property value="key" />  
  299.                         </td>  
  300.                         <td>  
  301.                             <s:property value="value" />  
  302.                         </td>  
  303.   
  304.                     </tr>  
  305.                 </s:iterator>  
  306.   
  307.             </table>  
  308.               
  309.   
  310.   
  311.   
  312.             <h5>  
  313.                 merge标签  
  314.             </h5>  
  315.               
  316.                 merge标签的用法看起来非常像append标签,但是有区别:  
  317.                 <s:append var="ast">  
  318.                     <s:param value="{'html','css','ajax'}"></s:param>  
  319.                     <s:param value="{'java','jsp','servlet'}"></s:param>  
  320.                     <s:param value="{'struts2','mysql','hibernate'}"></s:param>  
  321.                 </s:append>  
  322.   
  323.   
  324.                 <s:merge var="mst">  
  325.                     <s:param value="{'html','css','ajax'}"></s:param>  
  326.                     <s:param value="{'java','jsp','servlet'}"></s:param>  
  327.                     <s:param value="{'struts2','mysql','hibernate'}"></s:param>  
  328.                 </s:merge>  
  329.                 <h3>  
  330.                     append标签拼接  
  331.                 </h3>  
  332.                 <s:iterator value="#ast">  
  333.                     <s:property />  
  334.                       
  335.   
  336.                 </s:iterator>  
  337.                 <h4>  
  338.                     merge标签拼接  
  339.                 </h4>  
  340.                 <s:iterator value="#mst">  
  341.                     <s:property />  
  342.                       
  343.   
  344.                 </s:iterator>  
  345.   
  346.                   
  347.   
  348.                 以上看出:append标签的拼接方式是: 第1个集合中的第一个元素 第1个集合中的第二个元素 第1个集合中的第三个元素  
  349.                 第2个集合中的第一个元素 第2个集合中的第二个元素 第2个集合中的第三个元素 第3个集合中的第一个元素 第3个集合中的第二个元素  
  350.                 第3个集合中的第三个元素 merge标签的拼接方式是: 第1个集合中的第一个元素 第2个集合中的第一个元素 第3个集合中的第一个元素  
  351.                 第1个集合中的第二个元素 第2个集合中的第二个元素 第3个集合中的第二个元素 第1个集合中的第三个元素 第2个集合中的第三个元素  
  352.                 第3个集合中的第三个元素  
  353.   
  354.               
  355.   
  356.           
  357.   
  358.   
  359.         <h5>  
  360.             generator标签  
  361.         </h5>  
  362.           
  363.             将制定的字符串按指定的分隔符分隔成多个字串. count:可选属性,指定生成集合中元素的总数  
  364.             separator:必填属性:指定解析字符串的分隔符 val:必填属性:指定解析字符串  
  365.             converter:可选属性,转换器,该转换器负责将集合中的每个字符串转换成对象  
  366.             id:可选属性,如果指明该属性则生成的集合放入到pageContext属性中 注释:generator分隔的字符串  
  367.             ,如果在标签体内,整个临时生成的集合将位于ValueStack的顶端 .但标签结束时,被移出ValueStack。  
  368.               
  369.   
  370.               
  371.   
  372.             <table border="1px">  
  373.                 <tr>  
  374.                     <th>  
  375.                         名称  
  376.                     </th>  
  377.                 </tr>  
  378.                 <s:generator val="'this,is,a,doctor'" separator=",">  
  379.                     <!-- 由于在generator标签体内,该集合位于ValueStack的栈顶 ,故此处迭代的就是临时生成的集合 -->  
  380.                     <s:iterator var="bname">  
  381.                         <tr>  
  382.                             <td>  
  383.                                 <s:property value="bname" />  
  384.                             </td>  
  385.                         </tr>  
  386.                     </s:iterator>  
  387.                       
  388.   
  389.   
  390.   
  391.                 </s:generator>  
  392.             </table>  
  393.             <!-- 通过id标识此解析的集合存入到pageContext中 -->  
  394.             <s:generator separator="," val="'this,is,a,man'" id="bks"></s:generator>  
  395.               
  396.   
  397.             <h1>  
  398.                 标签体外打印解析的字符串集合  
  399.             </h1>  
  400.   
  401.             <s:iterator value="#attr.bks">  
  402.                 <s:property />  
  403.                   
  404.   
  405.             </s:iterator>  
  406.           
  407.   
  408.   
  409.   
  410.         <h1>  
  411.             subset标签  
  412.         </h1>  
  413.           
  414.             subset标签用于取得集合的子集,该标签的底层通过:org.apache.struts2.uitl.SubsetIteratorFilte类提供实现  
  415.             属性: count:可选属性:代表子集中的元素个数,如果没有指定代表源集合的全部元素  
  416.             source:可选属性:指定源集合,如果没有指定代表是valueStack的栈顶集合 start:可选属性:从第几元素开始截取  
  417.             decider:可选属性:指定由开发者自己决定是否选中该元素。 注意事项:  
  418.             在subset标签内时,subset标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集  
  419.             将被移出valueStack栈。  
  420.   
  421.   
  422.             <s:subset source="{'java','test','mybook','txs','lihui'}" start="1"  
  423.                 count="3">  
  424.                 <!-- 由于在subset标签体内,该子集位于ValueStack的栈顶 ,故此处迭代的就是临时生成的集合 -->  
  425.                 <s:iterator>  
  426.                     <s:property />  
  427.                       
  428.   
  429.                 </s:iterator>  
  430.                 <!-- 注意1代表的是第二元素 -->  
  431.             </s:subset>  
  432.   
  433.               
  434.   
  435.               
  436.   
  437.               
  438.   
  439.             <h5>  
  440.                 实现自己的Decider实例  
  441.             </h5>  
  442.             <s:bean name="edu.dc.MyDecider" id="mydecider"></s:bean>  
  443.             <h6>  
  444.                 通过自己定义的Decider实例来截取目标集合,生成子集  
  445.             </h6>  
  446.             <s:subset  
  447.                 source="{'01Java入门','JSP入门','Servlet入门','02Java基础案例','基于Java的经典案例'}"  
  448.                 decider="#mydecider">  
  449.                 <s:iterator>  
  450.                     <s:property />  
  451.                       
  452.   
  453.                 </s:iterator>  
  454.             </s:subset>  
  455.   
  456.             <h1>  
  457.                 sort标签  
  458.             </h1>  
  459.               
  460.                 用于对指定集合元素进行排序,进行排序时,必须提供自己的排序规则,即实现自己的  
  461.                 Comparator,自己的Comparator需要实现java.util.Comparator接口 属性:  
  462.                 comparator:必填属性,指定进行排序的comparator的实例  
  463.                 source:可选属性:指定排序的集合,如果没有指定代表是valueStack的栈顶集合 备注:  
  464.                 在sort标签内时,sort标签生成的子集位于valueStack的栈顶,如果标签结束,该标签生成的子集  
  465.                 将被移出valueStack栈。  
  466.   
  467.                 <s:bean var="mycomparator" name="edu.dc.MyComparator"></s:bean>  
  468.                 <s:sort comparator="#mycomparator"  
  469.                     source="{'JavaEE','css','JavaHTMl'}">  
  470.                     <s:iterator>  
  471.                         <s:property />  
  472.                           
  473.   
  474.                     </s:iterator>  
  475.   
  476.                 </s:sort>  
  477.               
  478.   
  479.   
  480.   
  481.           
  482.   
  483.     </body>  
  484. </html>  
  485.   
  486. /**以上用到的Subset标签用到的bean类如下*/  
  487. package edu.dc;  
  488.   
  489. import org.apache.struts2.util.*;  
  490.   
  491. /** 自定定义Decider类,实现SubsetIteratorFilter.Decider */  
  492. public class MyDecider implements SubsetIteratorFilter.Decider {  
  493.   
  494.     /** 实现Decider接口中的decide方法,该方法决定集合中的元素是否被选入到子集中 */  
  495.     public boolean decide(Object arg0) throws Exception {  
  496.         System.out.println("----------------");  
  497.         /** 把arg0造型为字符串 */  
  498.         String str = (String) arg0;  
  499.         /** 如果集合中包含java 那么即可被选入到子集中 */  
  500.         System.out.println("----------------" + (str.indexOf("Java") > 0));  
  501.         return (str.indexOf("Java") > 0);  
  502.     }  
  503.   
  504. }  
  505.   
  506. /**以下是sort标签实例中用到的备案实例*/  
  507.   
  508. package edu.dc;  
  509.   
  510. import java.util.Comparator;  
  511.   
  512. /** 需要实现Comparator接口 */  
  513. public class MyComparator implements Comparator<String> {  
  514.     /** 
  515.      * 如果该方法返回一个大于0的整数,则第一个元素大于第二元素,如果为0则相同 如果小于零,则第一个元素小于第二元素 
  516.      */  
  517.     public int compare(String o1, String o2) {  
  518.         /** 根据字符串的长度决定字符串的大小 */  
  519.         return (o1.length() - o2.length());  
  520.     }  
  521.   

你可能感兴趣的:(java,struts2)