目录
一、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>
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"; } }
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; } }
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; } }
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即可。