目录

一、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即可。

更多阅读:

struts2:数据标签

struts2:表单标签

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

struts2:非表单标签

struts2:标签库图示,控制标签的更多相关文章

  1. jstl--->Core 核心标签库->流程控制

    jstl--->Core 核心标签库->流程控制 -->if.choose.when.otherwise  <c:if>条件判断 语法1:没有本体内容  <c:if ...

  2. JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  3. javaweb学习总结(二十八)——JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  4. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

    学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签.  jsp标签的分 ...

  5. javaWeb学习总结(9)- JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  6. JSTL、JSTL核心标签库——流程处理标签

    JSTL环境 JSTL是另一个标准规范,并非在JSP的规范中,所以必须另外下载JSTL实现. 要使用JSTL标签库,必须在JSP网页上使用taglib指示元素定义前置名称与uri参考.例如,引入JST ...

  7. jsp的标签库和自定义标签

    1.jstl标签库 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...

  8. ThinkPHP内置标签库原理(Cx标签库)

    任何一个模板引擎的功能都不可能是为你量身定制的,具有一个良好的可扩展 机制也是模板引擎的另外一个考量,Smarty采用的是插件方法来实现扩展,ThinkTemplate由于采用了标签库技术,比Smar ...

  9. JavaWeb学习记录(十九)——jstl自定义标签库之传统标签

    一.传统标签 (1)JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法. public void setPageContext(PageCo ...

随机推荐

  1. Kettle学习之Spoon简单使用

    kettle学习之Spoon使用 2018-08-04 10:40:01 首先介绍两个博客入门: https://blog.csdn.net/zzq900503/article/details/785 ...

  2. BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...

  3. Sea Battle CodeForces - 729D

    题意: 有n个格子,a条船,每条船占b个格子.事先已经射击了k个格子,且这k次射击不会射到船上,求再射击几次可以射到某一条船的某一部分 思路: 观察样例可以发现,如果五个0,船的长度是3,那么这五个0 ...

  4. HDU 5391 Zball in Tina Town【威尔逊定理】

    <题目链接> Zball in Tina Town Problem Description Tina Town is a friendly place. People there care ...

  5. 2018即将过去,立个flag

    过去的2018 自己有没有值得有意义的地方呢? 没有, 自己有没有认识新的异性朋友呢? 没有, 自己都在忙啥呢? 敲代码,然后发现敲坏了一个键盘,换了HHKB,一个字舒服,还有就是通宵把一部电视剧看完 ...

  6. 13,EasyNetQ-错误条件

    在本节中,我们将看看任何消息系统中可能出现的各种错误情况,并查看EasyNetQ如何处理它们. 1,我的订阅服务死亡 你已经写了一个订阅了我的NewCustomerMessage的windows服务. ...

  7. win7 资源资源管理器访问FTP站点

    Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\ftp] @="URL:File Transfer Protocol" ...

  8. [CF98E]Help Shrek and Donkey(纳什均衡)

    https://www.cnblogs.com/MashiroSky/p/6576398.html #include<cstdio> #include<algorithm> # ...

  9. oracle 变量

    插入 日期时间 循环插入 declare total date:) ; begin .. LOOP insert into DQ_DATE(date_time) values ( total ); t ...

  10. linux上 安装软件

    一.rpm包安装方式步骤:  1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd soft.version.rpm所 ...