现在的位置: 首页 > 综合 > 正文

Struts2的标签技术之控制标签

2018年05月20日 ⁄ 综合 ⁄ 共 7314字 ⁄ 字号 评论关闭

1:if,elsefi, else标签

     简单示例:

   

 <%
       int length = 15;
       request.setAttribute("len", length);
    %>
    <s:if test="#request['len'] >= 20">
        输入的值大于等于20
    </s:if>
    <s:elseif test="#request['len'] >= 15">
          输入的值大于等于15
    </s:elseif>
    <s:else>
         输入的值小于15
    </s:else>

输出情况:

  输入的值大于等于15

2:iterator标签

      *用来处理循环,可以用它遍历数组,Set和List等集合对象,这个标签还支持在ActionContext中保持一个保存遍历状态的对象,通过这个变量可以得到当前循环的各种信息。

      *它在遍历一组对象的时候,它把正在循环的对象放在值栈的栈顶,所以可以直接使用这个对象的方法或者属性。

      *属性信息

           *value:用来指明访问的是哪个对象。

           *status:这个属性在ActionContext中保存一个对象,用来返回当前循环的各种信息,可以返回的信息如下:

                 *count:集合含有多少个对象

                 *index:正在循环的这一项的索引

                 *even:当前遍历到的对象是不是处于列表的偶数索引位置

                 *odd:当前遍历到的对象是不是处于列表的奇数索引位置

                 *first:正在循环的是不是第一个

                 *last:正在循环的是不是最后一个

                 *begin, end,step:指明了如果使用索引来进行循环时的开始、结束和步长。

                 *var:变量名称,用来引用存放到值栈的被循环的对象

   

           简单示例1:实现类似于for循环的功能

     <s:iterator var="i" begin="1" end="10" step="1">
         <s:property value="#i"/>
     </s:iterator>

          简单示例2:实现类似于while循环的功能

             

<%
        List strList = new ArrayList();
        for(int i = 0; i < 10; i++) {
        	   strList.add("str" + i);
        }
        request.setAttribute("strList", strList);
    %>
     <s:iterator var="str" value="#request['strList']">
         <s:property value="#str"/>
     </s:iterator>

输出结果:

    str0 str1 str2 str3 str4 str5 str6 str7 str8 str9

      简单示例3:访问复杂对象

       

 <%
        List userList = new ArrayList();
    
        User user1 = new User();
        user1.setAge(20);
        user1.setName("zhangsan");
        
        User user2 = new User();
        user2.setAge(30);
        user2.setName("lisi");
        
        userList.add(user1);
        userList.add(user2);
   
        request.setAttribute("users", userList);
        
    %>
     <s:iterator var="user" value="#request.users">
         user.name=<s:property value="name"/>,
         user.age=<s:property value="age"/><br/>
     </s:iterator>

      输出结果:

             

user.name=zhangsan, user.age=20
user.name=lisi, user.age=30

        简单示例4:使用status属性

          如果想输出当前循环的索引,或者是想要把循环输出的数据用表格来展示,并按照奇数行和偶数行来设置不同的背景色,也就是用户熟悉的波浪纹或者斑马纹的效果。

      就要使用status属性。<s:property>引用status属性名称的时候前面要加#号

     

  <%
        List userList = new ArrayList();
    
        User user1 = new User();
        user1.setAge(20);
        user1.setName("zhangsan");
        
        User user2 = new User();
        user2.setAge(30);
        user2.setName("lisi");
        
        userList.add(user1);
        userList.add(user2);
   
        request.setAttribute("users", userList);
        
    %>
     <s:iterator var="user" value="#request.users" status="state">
                           索引=<s:property value="#state.index"/>,
         user.name=<s:property value="name"/>,
         user.age=<s:property value="age"/><br/>
     </s:iterator>

      输出结果:

      

索引=0, user.name=zhangsan, user.age=20
索引=1, user.name=lisi, user.age=30

        实现斑马纹与波浪纹效果:

    

 <%
        List userList = new ArrayList();
    
        User user1 = new User();
        user1.setAge(20);
        user1.setName("zhangsan");
        
        User user2 = new User();
        user2.setAge(30);
        user2.setName("lisi");
        
        User user3 = new User();
        user3.setAge(30);
        user3.setName("wangwu");
        
        User user4 = new User();
        user4.setAge(30);
        user4.setName("maliu");
        
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        userList.add(user4);
       
        request.setAttribute("users", userList);
        
    %>
     <table border="1">
          <tr>
              <td colspan=4 align="center">用户列表</td>
          </tr>
          <tr>
              <td>索引</td>
              <td>用户姓名</td>
              <td>用户年龄</td>
              <td>操作</td>
          </tr>
           <s:iterator var="user" value="#request.users" status="state">
          <tr
             <s:if test="#state.even">
                 bgcolor="#EFF8FF"
             </s:if>
             <s:else>
                 bgcolor="#B4CFF1"
             </s:else>
             >
             <td><s:property value="#state.index"/></td>
             <td><s:property value="name"/></td>
             <td><s:property value="age" /></td>
             <td><a href="">修改</a>    <a href="">删除</a></td>
          </tr>
     </s:iterator>
     </table>

输出结果:

   

3:append与param便签

     *append标签用于把几个已经存在的集合组合成一个大集合,param标签与它连用,用来指定组合哪些集合

    简单示例:

    

 <s:set var="list1" value="{1, 2, 3}" />
   <s:set var="list2" value="{4, 5, 6}" />
   <s:append var="list3">
         <s:param value="#list1" />
         <s:param value="#list2" />
   </s:append>
   <s:iterator value="#list3">
         <s:property/>
   </s:iterator>

输出结果: 

    1 2 3 4 5 6

param标签的value属性指定了被组合的集合

4:generator标签

       *功能是用来切分字符串,并把切分的结果组成一个集合

       *属性

             *val:指定被切分的字符串

             *separator:指定切分字符串用的分隔符,必须指定,比如要用","来切分字符串"a, b, c, d",最终的结果为包含a, b, c, d四个字符串的集合。

             *count: 返回集合的最大长度

             *converter: 用于设置自定义的Converter,必须是org.apache.Struts2.util.IteratorGenerator.Converter接口的实现类

             *var:指定变量名称,用来访问放到值栈中的集合。

         简单示例1:

  <s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" separator=",">
		 <s:iterator>
		     <s:property /><br/>
		 </s:iterator>
     </s:generator>

         输出结果:

          aaa
          bbb
          ccc
         ddd
         eee

  

           简单示例2:

 Generate an iterator with count attribute<br>
<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="3" separator=",">
 <s:iterator>
     <s:property /><br/>
 </s:iterator>
</s:generator>

  

     输出结果:

    Generate an iterator with count attribute
    aaa
    bbb
    ccc

  count=3表示只取集合中的三个元素,即只有3个元素是有效的。

5:merge标签

     *用来把几个已经存在的集合组合成一个大集合,与append标签的作用类似,只是原来集合中出现的各个元素出现在大集合中的顺序不同。

     

<s:set value="{1, 2, 3}" var="list1"/>
   <s:set value="{4, 5, 6}" var="list2"/>
   <s:merge var="list3">
       <s:param value="#list1" />
       <s:param value="#list2" />
   </s:merge>
   <s:iterator value="#list3"> 
      <s:property/>
   </s:iterator>

输出结果为:

   1 4 2 5 3 6

6:sort标签

     *利用设置的比较器,来对指定的集合进行排序

     *主要属性

           *comparator: 用来指定对集合排序使用的比较器的实例

           *source: 需要排序的集合

           *var:变量名称,把集合排序后的结果存放到pagecontext中的key值

       实例1:包含基本数据类型的集合排序示例

            *首先准备比较器,实现java.util.Comparator接口,实现对整形数据进行升序排序

                  

package com.capinfotech.util;

import java.util.Comparator;

public class IntegerComparator implements Comparator<Integer> {

	@Override
	public int compare(Integer o1, Integer o2) {
		int a = Integer.parseInt(o1.toString());
		int b = Integer.parseInt(o2.toString());
		if(a > b) {
			return 1;
		} else if(a < b) {
			return -1;
		}
		return 0;
	}
}

页面:

 <s:set value="{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}" var="list1" />
   <s:bean name="com.capinfotech.util.IntegerComparator" id="integerComparator" />
   
   <s:sort comparator="integerComparator" source="#list1">
        <s:iterator>
            <s:property/>
        </s:iterator>
   </s:sort>

输出结果:

    1 2 3 4 5 6 7 8 9 10

     实例2:包含复杂数据类型的集合排序示例

       对包含user的数据集合排序,首先定义一个排序器,根据年龄来排序:

   

package com.capinfotech.util;

import java.util.Comparator;

import com.capinfotech.model.User;

public class UserComparator implements Comparator<User> {

	@Override
	public int compare(User user1, User user2) {
		if(user1.getAge().intValue() > user2.getAge().intValue()) {
			return 1;
		} else if(user1.getAge().intValue() < user2.getAge().intValue()) {
			return -1;
		}
		return 0;
	}

}

页面:

 <%
   List userList = new ArrayList();
   
   User user1 = new User();
   user1.setAge(40);
   user1.setName("zhangsan");
   
   User user2 = new User();
   user2.setAge(30);
   user2.setName("lisi");
   
   User user3 = new User();
   user3.setAge(20);
   user3.setName("wangwu");
   
   User user4 = new User();
   user4.setAge(10);
   user4.setName("maliu");
   
   userList.add(user1);
   userList.add(user2);
   userList.add(user3);
   userList.add(user4);
  
   request.setAttribute("users", userList);
   
   %>
   <s:bean name="com.capinfotech.util.UserComparator" id="userComparator" />
   
   <s:sort comparator="userComparator" source="#request.users">
        <s:iterator>
            <s:property/><br>
        </s:iterator>
   </s:sort>

输出结果:

  name:maliu, age:10
name:wangwu, age:20
name:lisi, age:30
name:zhangsan, age:40

6:subset标签

       用于获取指定集合的子集合

      属性:

        *count: 用于指定子集合中元素的个数

        *decider:用于指定实现过滤条件的对象,这个对象会按照过滤条件--检测源集合中的元素是否应该被放入到子集合中,指定过滤条件的类需要实现

         org.apache.Struts2.util.SubsetIteratorFilter.Decider接口

        *var:变量名称,就是将子集合保存在当前页的上下文pageContext中所指定的key值,以后可以通过该key值来访问。

        *source:用于指定源集合

         *start:用于指定从原集合的第几个元素开始截取,0代表第一个元素

  

简单示例1:

     

   <s:set value="{1, 2, 3, 4, 5}" var="list" />
   <s:subset source="#list" count="2" start="2">
       <s:iterator>
           <s:property/>
       </s:iterator>
   </s:subset>

输出结果:

   3 4

简单示例2,使用decider来截取

    *首先定义一个decider,

   

package com.capinfotech.util;

import org.apache.struts2.util.SubsetIteratorFilter.Decider;

public class StringLengthDecider implements Decider {

	@Override
	public boolean decide(Object element) throws Exception {
		String value = element.toString();
		if(value.length() == 1) {  //如果字符串的长度为1,返回true
			return true;
		}
		return false;
	}

}

  *页面:

<s:bean name="com.capinfotech.util.StringLengthDecider" var="stringLengthDecider"/>
   <s:set value="{'1', '2', '33', '4', '55', '6'}" var="list" />
   <s:subset source="#list"  start="1" decider="stringLengthDecider">
       <s:iterator>
           <s:property/>
       </s:iterator>
   </s:subset>

输出结果:

  2 4 6 

       

抱歉!评论已关闭.