目录

一、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. 取消a标签或者onclick在移动端点击时的背景颜色

    一.取消a标签在移动端点击时的蓝色 -webkit-tap-highlight-color: rgba(, , , ); -webkit-user-select: none; -moz-user-fo ...

  2. BZOJ1180 [CROATIAN2009]OTOCI LCT

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1180 本题和BZOJ2843一样. BZOJ2843 极地旅行社 LCT 题意概括 有n座岛 每座 ...

  3. BZOJ1207 [HNOI2004]打鼹鼠 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1207 题目概括 n*n的方阵上,一开始你可以在任何地方. 你每秒可以移动一格,接下来有m只地鼠冒出 ...

  4. ATM+购物车商城

    模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还 ...

  5. 针对mysql delete删除表数据后占用空间不变小的问题

    开发环境 Yii1版本 MySQL PHP5.6.27 前言 物流规则匹配日志表记录订单匹配规则相关日志信息,方便管理员维护和查阅不匹配的订单,四个月时间,该日志表数据就有174G,当前,这么大的数据 ...

  6. bootstrap table使用总结

    使用bootstrap table可以很方便的开发后台表格,对数据进行异步更新,编辑.下面就来介绍一下bootstrap table的详细使用方法: 因为之前在官网也找了很久的教程,源码感觉隐藏的比较 ...

  7. 在python3下使用requests,xpath,urllib爬取不得姐网站相关视频爬虫源代码

    #coding=utf-8 from lxml import etreeimport requestsimport urllibimport os # 获取url的html等内容def getHtml ...

  8. metasploit常见服务的漏点扫描模块

    弱点扫描 根据信息收集结果搜索漏洞利用模块 结合外部漏洞扫描系统对大IP地址段进行批量扫描 可以考虑对单个ip,单个服务进行扫描 NVC 密码破解端口:5900use auxiliary/scanne ...

  9. 添加js,css 版本号?v= hash

    node_modules设置 a.打开 node_modules\gulp-rev\index.js 第144行 manifest[originalFile] = revisionedFile; 更新 ...

  10. 运行程序,解读this指向---case3

    片段1 var myObj = { fullname: "Hou Yi", getFullName: function(){ var self = this; console.lo ...