struts2:标签库图示,控制标签

目录

一、struts2标签库图示
二、控制标签
1. 条件判断标签(if/elseif/else)
2. 迭代标签(iterator)
  2.1 遍历List
  2.2 遍历Map
  2.3 遍历List(Action中的属性,List包含Bean)
  2.4 遍历Map(Action中的属性,Map包含Bean)
3. 集合标签(append/merge/subset/sort)
  3.1 append标签
  3.2 merge标签
  3.3 subset标签
  3.4 sort标签
4. 分隔标签(generator)
三、完整代码

一、struts2标签库图示

二、控制标签

1. 条件判断标签(if/elseif/else)

    <%
    Random rnd = new Random();
    int age = rnd.nextInt(100);
    pageContext.setAttribute("age", age);
    %>
    <s:if test="#attr.age>60"> 
        老年人 
    </s:if>
    <s:elseif test="#attr.age>35"> 
        中年人 
    </s:elseif>
    <s:elseif test="#attr.age>15"> 
        青年人 
    </s:elseif>
    <s:else> 
        少年 
    </s:else>

输出(随机):

青年人

2. 迭代标签(iterator)

用于循环数组,集合和Map。属性:

  • value:数组,集合或Map
  • var:当前元素
  • status:当前元素的状态
  • index,count,even,odd,first,last

2.1 遍历List

    <TABLE border="1" width="300">
    <s:iterator value="{'C++入门经典', 'Java编程思想', 'Ajax权威指南', 'Ruby元编程', 'C#高级编程'}" var="book" status="it">
        <TR <s:if test="#it.odd"> style="background-color:#bbbbbb" </s:if>>
            <TD><s:property value="book" /><BR/></TD>
        </TR>
        <s:if test="#it.last">
            <TR <s:if test="#it.even"> style="background-color:#bbbbbb" </s:if>>
                <TD><s:property value="#it.count" />本书 </TD>
            </TR>
        </s:if>
    </s:iterator>
    </TABLE>

输出:

2.2 遍历Map

<s:iterator value="#{1: '中国', 2: '美国', 3: '日本'}" var="cur">
    <s:property value="#cur.key"/>
    <s:property value="#cur.value"/><br/>
</s:iterator>

输出:

1     中国
2     美国
3     日本

2.3 遍历List(Action中的属性,List包含Bean)

    <s:iterator value="listJavaBean" var="studentJavaBean"> 
        姓名:<s:property value="#studentJavaBean.name" />
        年龄:<s:property value="#studentJavaBean.age" /><BR/>
    </s:iterator>

输出:

姓名:张三        年龄:6
姓名:李四        年龄:4
姓名:赵五        年龄:5
姓名:王三三 年龄:5
姓名:李天一        年龄:0

2.4 遍历Map(Action中的属性,Map包含Bean)

    <s:iterator value="listMapJavaBean" var="studentJavaBean"> 
        id:  <s:property value="#studentJavaBean.key" />
        姓名:<s:property value="#studentJavaBean.value.name" />
        年龄:<s:property value="#studentJavaBean.value.age" /><BR/>
    </s:iterator>

输出:

id: 3         姓名:赵五        年龄:7
id: 2         姓名:李四        年龄:1
id: 1         姓名:张三        年龄:1
id: 5         姓名:李天一     年龄:3
id: 4         姓名:王三三     年龄:4

3. 集合标签(append/merge/subset/sort)

3.1 append标签

    <s:append var="books1">
        <s:param value="#{'C++入门经典':'清华出版社','Java编程思想':'清华出版社'}"/>
        <s:param value="#{'Ajax权威指南','Ruby元编程','C#高级编程'}" />
    </s:append>
    <s:iterator value="books1">
        <s:property value="key" />|<s:property value="value" /><BR/>
    </s:iterator>

输出:

C++入门经典|清华出版社
Java编程思想|清华出版社
Ajax权威指南|
Ruby元编程|
C#高级编程|

3.2 merge标签

    <s:merge var="books2">
        <s:param value="#{'C++入门经典','Java编程思想'}"/>
        <s:param value="#{'Ajax权威指南':'电子出版社','Ruby元编程':'电子出版社','C#高级编程':'清华出版社'}" />
    </s:merge>
    <s:iterator value="books2">
        <s:property value="key" />|<s:property value="value" /><BR/>
    </s:iterator>

输出:

C++入门经典|
Ajax权威指南|电子出版社
Java编程思想|
Ruby元编程|电子出版社
C#高级编程|清华出版社

注意:merge用法和append相同, 合并的结果元素相同,但顺序可能不一样。

3.3 subset标签

从集合中取出一个子集。属性:

  • source: 集合
  • start: 起始索引
  • count: 子集中元素个数

3.3.1 访问自定义变量,subset示范

<s:subset source="{'中国', '美国', '印度', '德国', '泰国', '新加坡'}" start="1" count="3">
    <s:iterator>
        <s:property />
    </s:iterator>
</s:subset>

输出:

美国    印度     德国

3.3.2 访问Action中的属性(List包含Bean),subset示范

    <s:subset source="listST1" var="newSubList" count="2" start="0">
        <s:iterator var="stBean" value="#attr.newSubList">
            <s:property value="#stBean.name" />
        </s:iterator>
    </s:subset>

输出:

张三    李四

3.4 sort标签

    <s:bean var="sortRef" name="com.clzhang.ssh.demo8.SortAge"></s:bean>
    <s:sort source="listST1" var="newSortList" comparator="#sortRef">
        <s:iterator var="stBean" value="#attr.newSortList"> 
            姓名:<s:property value="#stBean.name" />
            年龄:<s:property value="#stBean.age" /><BR/>
        </s:iterator>
    </s:sort>

输出:

姓名:张三            年龄:3
姓名:李天一         年龄:7
姓名:赵五            年龄:7
姓名:李四            年龄:8
姓名:王三三         年龄:9 

4. 分隔标签(generator)

将一个字符串按照指定分隔符分割成一个字符串数组。属性:

  • separator: 分隔符
  • val(value): 字符串
  • count:字符串數組中元素個數(可选)

4.1 在标签内部使用generator

    <TABLE width="300" border="1">
    <s:generator val="'C++入门经典,Java编程思想,Ajax权威指南,Ruby元编程,C#高级编程'" separator=",">
        <s:iterator status="bs">
            <TR <s:if test="#bs.odd">style="background-color:#bbb"</s:if>>
                <TD><s:property /></TD>
            </TR>
        </s:iterator>
    </s:generator>
    </TABLE>

输出:

4.2 在标签外部使用generator

    <s:generator val="'C++入门经典,Java编程思想,Ajax权威指南,Ruby元编程,C#高级编程'" separator="," var="books"></s:generator>
    <TABLE border="1" width="300">
    <s:iterator value="#books" status="bs">
        <TR <s:if test="#bs.odd">style="background-color:#bbb"</s:if>>
            <TD><s:property /></TD>
        </TR>
    </s:iterator>
    </TABLE>

输出同上

三、完整代码

1. labelOfControl.jsp(显示页面)

<%@ page language="java" import="java.util.*,com.clzhang.ssh.demo8.SortAge" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>struts2控制标签示范</TITLE>
<STYLE type="text/css">
<!--
.STYLE1 {font-size: 14px}
.STYLE3 {color: #FF0000}
-->
</STYLE>
</HEAD>
<BODY>
    <P class="STYLE1"><STRONG>一. 条件判断标签(if/elseif/else):</STRONG></P>
    <P class="STYLE1">1.访问自定义变量的值</P>
    <%
    Random rnd = new Random();
    int age = rnd.nextInt(100);
    pageContext.setAttribute("age", age);
    %>
    <s:if test="#attr.age>60"> 
        老年人 
    </s:if>
    <s:elseif test="#attr.age>35"> 
        中年人 
    </s:elseif>
    <s:elseif test="#attr.age>15"> 
        青年人 
    </s:elseif>
    <s:else> 
        少年 
    </s:else>
    <P class="STYLE1">2.访问Action实例中的属性</P>
    <s:if test="cityId==1">北京</s:if>
    <s:elseif test="cityId==2">上海</s:elseif>
    <s:else>辽宁</s:else>
    <BR>
    <P class="STYLE1"><SPAN class="STYLE3">注意:</SPAN>在这里if中使用的是#age,因为set标签在Stack Context中定义了一个age属性;而cityId是在Action中定义的,所以不需要“#”。</P>
    <P class="STYLE1"><STRONG>二. 迭代标签(iterator):</STRONG></P>
    <P class="STYLE1">1.访问自定义变量的值(List)</P>
    <TABLE border="1" width="300">
    <s:iterator value="{'C++入门经典', 'Java编程思想', 'Ajax权威指南', 'Ruby元编程', 'C#高级编程'}" var="book" status="it">
        <TR <s:if test="#it.odd"> style="background-color:#bbbbbb" </s:if>>
            <TD><s:property value="book" /><BR/></TD>
        </TR>
        <s:if test="#it.last">
            <TR <s:if test="#it.even"> style="background-color:#bbbbbb" </s:if>>
                <TD><s:property value="#it.count" />本书 </TD>
            </TR>
        </s:if>
    </s:iterator>
    </TABLE>
    <P class="STYLE1">2.访问自定义变量的值(Map)</P>
    <s:iterator value="#{1: '中国', 2: '美国', 3: '日本'}" var="cur">
        <s:property value="#cur.key"/>
        <s:property value="#cur.value"/><br/>
    </s:iterator>    
    <P class="STYLE1">3.访问Action实例中的属性,String[]</P>
    <s:iterator value="studentList" var="studentName">
        <s:property value="studentName" /><BR/>
    </s:iterator>
    <P class="STYLE1">4.访问Action实例中的属性,List包含的Bean,访问的第一种方式</P>
    <s:iterator value="listJavaBean"> 
        姓名:<s:property value="name" />
        年龄:<s:property value="age" /><BR/>
    </s:iterator>
    <P class="STYLE1">5.访问Action实例中的属性,List包含的Bean,访问的第二种方式</P>
    <s:iterator value="listJavaBean" var="studentJavaBean"> 
        姓名:<s:property value="#studentJavaBean.name" />
        年龄:<s:property value="#studentJavaBean.age" /><BR/>
    </s:iterator>
    <P class="STYLE1">6.访问Action实例中的属性,Map包含的String</P>
    <s:iterator value="listMapString" var="studentJavaBean"> 
        键:<s:property value="#studentJavaBean.key" />
        值:<s:property value="#studentJavaBean.value" /><BR/>
    </s:iterator>
    <P class="STYLE1">7.访问Action实例中的属性,Map包含的Bean</P>
    <s:iterator value="listMapJavaBean" var="studentJavaBean"> 
        id:  <s:property value="#studentJavaBean.key" />
        姓名:<s:property value="#studentJavaBean.value.name" />
        年龄:<s:property value="#studentJavaBean.value.age" /><BR/>
    </s:iterator>
    <P class="STYLE1"><SPAN class="STYLE3">提示:</SPAN>当使用了status属性后,除了使了上面的event、odd、count、last用于判断奇偶,个数和判断是否为最后一个方法外还可使用index用于得到迭代元素的索引。</P>
    <P class="STYLE1"><STRONG>三. 集合标签(append/merge/subset/sort):</STRONG></P>
    <s:append var="books1">
        <s:param value="#{'C++入门经典':'清华出版社','Java编程思想':'清华出版社'}"/>
        <s:param value="#{'Ajax权威指南','Ruby元编程','C#高级编程'}" />
    </s:append>
    <s:merge var="books2">
        <s:param value="#{'C++入门经典','Java编程思想'}"/>
        <s:param value="#{'Ajax权威指南':'电子出版社','Ruby元编程':'电子出版社','C#高级编程':'清华出版社'}" />
    </s:merge>
    <P class="STYLE1">1.append标签合并的结果</P>
    <s:iterator value="books1">
        <s:property value="key" />|<s:property value="value" /><BR/>
    </s:iterator>
    <P class="STYLE1">2.merge标签合并结果</P>
    <s:iterator value="books2">
        <s:property value="key" />|<s:property value="value" /><BR/>
    </s:iterator>
    <P class="STYLE1">3.访问Action实例中的属性,merge标签合并结果</P>
    <s:merge var="newAppendList">
        <s:param value="listST1"></s:param>
        <s:param value="listST2"></s:param>
    </s:merge>
    <s:iterator var="stBean" value="newAppendList"> 
        姓名:<s:property value="#stBean.name" />
        年龄:<s:property value="#stBean.age" /><BR/>
    </s:iterator>
    <P class="STYLE1">4.访问自定义变量,subset结果</P>
    <s:subset source="{'中国', '美国', '印度', '德国', '泰国', '新加坡'}" start="1" count="3">
        <s:iterator>
            <s:property />
        </s:iterator>
    </s:subset>
    <P class="STYLE1">5.访问Action实例中的属性,subset结果</P>
    <s:subset source="listST1" var="newSubList" count="2" start="0">
        <s:iterator var="stBean" value="#attr.newSubList">
            <s:property value="#stBean.name" />
        </s:iterator>
    </s:subset>
    <P class="STYLE1">6.访问Action实例中的属性,sort结果</P>
    <s:bean var="sortRef" name="com.clzhang.ssh.demo8.SortAge"></s:bean>
    <s:sort source="listST1" var="newSortList" comparator="#sortRef">
        <s:iterator var="stBean" value="#attr.newSortList"> 
            姓名:<s:property value="#stBean.name" />
            年龄:<s:property value="#stBean.age" /><BR/>
        </s:iterator>
    </s:sort>
    <P class="STYLE1"><SPAN class="STYLE3">提示:</SPAN><BR>
        1.merge后的值,与append相比,只是顺序不同(各取第一个值,各取第二个值......);<BR>
        2.由于subset的var是放在page页面级的变量,所以要使用attr将page级中的newSubList获取出来再进行遍历。<BR>
        3.sort同样如此。 </P>
    <P class="STYLE1"><STRONG>四. 分隔标签(generator):</STRONG></P>
    <P class="STYLE1">1.在标签内部使用</P>
    <TABLE width="300" border="1">
    <s:generator val="'C++入门经典,Java编程思想,Ajax权威指南,Ruby元编程,C#高级编程'" separator=",">
        <s:iterator status="bs">
            <TR <s:if test="#bs.odd">style="background-color:#bbb"</s:if>>
                <TD><s:property /></TD>
            </TR>
        </s:iterator>
    </s:generator>
    </TABLE>
    <P class="STYLE1">2.在标签外部使用</P>
    <s:generator val="'C++入门经典,Java编程思想,Ajax权威指南,Ruby元编程,C#高级编程'" separator="," var="books"></s:generator>
    <TABLE border="1" width="300">
    <s:iterator value="#books" status="bs">
        <TR <s:if test="#bs.odd">style="background-color:#bbb"</s:if>>
            <TD><s:property /></TD>
        </TR>
    </s:iterator>
    </TABLE>
    <P class="STYLE1"><SPAN class="STYLE3">提示:</SPAN>使用generator标签时,sparator属性是必须的。除了这些属性处还有可选属性count,它用于指定集合元素的总数;可选元素converter用于指定转换器。 </P>    

</BODY>
</HTML>
View Code

2. LabelOfControlAction.java(控制类)

package com.clzhang.ssh.demo8;

import java.util.*;

import com.opensymphony.xwork2.ActionSupport;

/**
 * struts2控制标签类
 * @author Administrator
 *
 */
public class LabelOfControlAction  extends ActionSupport{
    public static final long serialVersionUID = 1;
    
    // 下面的这些值,是提供给前台显示页面使用的,都具有setter/getter
    private int cityId;
    private String[] studentList = new String[3];
    private List<StudentInfo> listJavaBean = new ArrayList<StudentInfo>();
    private LinkedHashMap<String, String> listMapString = new LinkedHashMap<String, String>();
    private Map<String, StudentInfo> listMapJavaBean = new HashMap<String, StudentInfo>();
    private List<StudentInfo> listST1 = new ArrayList<StudentInfo>();
    private List<StudentInfo> listST2 = new ArrayList<StudentInfo>();
    
    // 存放测试数据
    private List<String> lstString = new ArrayList<String>();
    
    public LabelOfControlAction() {
        lstString.add("张三");
        lstString.add("李四");
        lstString.add("赵五");
        lstString.add("王三三");
        lstString.add("李天一");
    }

    public int getCityId() {
        return cityId;
    }
    public void setCityId(int cityId) {
        this.cityId = cityId;
    }

    public String[] getStudentList() {
        return studentList;
    }
    public void setStudentList(String[] studentList) {
        this.studentList = studentList;
    }

    public List<StudentInfo> getListJavaBean() {
        return listJavaBean;
    }
    public void setListJavaBean(List<StudentInfo> listJavaBean) {
        this.listJavaBean = listJavaBean;
    }

    public LinkedHashMap<String, String> getListMapString() {
        return listMapString;
    }
    public void setListMapString(LinkedHashMap<String, String> listMapString) {
        this.listMapString = listMapString;
    }
    
    public Map<String, StudentInfo> getListMapJavaBean() {
        return listMapJavaBean;
    }
    public void setListMapJavaBean(Map<String, StudentInfo> listMapJavaBean) {
        this.listMapJavaBean = listMapJavaBean;
    }

    public List<StudentInfo> getListST1() {
        return listST1;
    }
    public void setListST1(List<StudentInfo> listST1) {
        this.listST1 = listST1;
    }

    public List<StudentInfo> getListST2() {
        return listST2;
    }
    public void setListST2(List<StudentInfo> listST2) {
        this.listST2 = listST2;
    }

    public String execute() {
        // 下面是设置一些值的代码,用于在前台显示
        
        // int
        this.setCityId(2);
        
        // String[]
        for(int i=0; i<studentList.length; i++) {
            studentList[i] = lstString.get(i);
        }
        
        // List包含Bean
        for(String str: lstString) {
            StudentInfo studentInfo1 = new StudentInfo();
            studentInfo1.setName(str);
            studentInfo1.setAge((int)(Math.random()*10));

            listJavaBean.add(studentInfo1);
        }
        
        // Map包含String
        int count = 1;
        for(String str: lstString) {
            listMapString.put(""+count++, str+count);
        }
        
        // Map包含Bean
        count = 1;
        for(String str: lstString) {
            StudentInfo studentInfo1 = new StudentInfo();
            studentInfo1.setName(str);
            studentInfo1.setAge((int)(Math.random()*10));

            listMapJavaBean.put(""+count++, studentInfo1);
        }
        
        // 集合append/merge/subset/sort等使用
        for(String str: lstString) {
            StudentInfo studentInfo1 = new StudentInfo();
            studentInfo1.setName(str);
            studentInfo1.setAge((int)(Math.random()*10));

            listST1.add(studentInfo1);
            listST2.add(studentInfo1);
        }

        return "showLC";
    }
}
View Code

3. StudentInfo.java(实体类)

package com.clzhang.ssh.demo8;

public class StudentInfo {
    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
View Code

4. SortAge.java(排序类)

package com.clzhang.ssh.demo8;

import java.util.Comparator;

@SuppressWarnings("rawtypes")
public class SortAge implements Comparator {
    public int compare(Object arg0, Object arg1) {
        if (((StudentInfo) arg0).getAge() > ((StudentInfo) arg1).getAge())
            return 1;
        else
            return -1;
    }
}
View Code

5. 还需要在struts.xml中加入:

        <action name="labelC" class="com.clzhang.ssh.demo8.LabelOfControlAction">
            <result name="showLC">/ssh/demo8/labelOfControl.jsp</result>
        </action>

6. 然后打开IE,输入地址:http://127.0.0.1:8080/st/labelC.action即可。

更多阅读:

struts2:数据标签

struts2:表单标签

struts2:表单标签续(datetimepicker标签)

struts2:非表单标签

原文地址:https://www.cnblogs.com/nayitian/p/3470842.html