Struts2之控制标签
Struts2的控制标签,主要用于完成流程控制,以及对ValueStack中的控制,控制标签可以完成输出流程的控制,例如循环、分支等操作,也可以完成对集合的合并、排序等操作。
1.常用的控制标签有:if、elseif、else、iterator、append、merge、generator、subset、sort等。
下面分别对这些控制标签进行介绍,并介绍如何使用这些控制标签:
(1).if、elseif、else标签:if标签用来控制基本的条件处理流程,通常和else标签或者elseif标签连用。
其参数、属性为:
名字 | 是否必须 | 默认值 | 可否使用表达式 | 类型 | 描述 |
---|---|---|---|---|---|
id |
否 |
是 |
String |
用来表示该元素,对于UI和Form标签来说直接转变为HTML id属性 |
|
test |
是 |
是 |
Boolean | 用来决定是否显示标签内部内容的表达式 |
示例:首先,新建一个Struts2项目,项目名为BiaoQian,在项目里头新建一个if.jsp文件,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'if.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><s:if test="%{false}">我是if控制标签!</s:if><s:elseif test="%{true}">我是elseif控制标签!</s:elseif><s:else>我是else控制标签!</s:else></body>
</html>
把项目部署到Tomcat服务器上,开启Tomcat服务器,运行后效果 如下:
示例解析:这个例子是通过if、elseif、else控制标签连用的,跟Java语法下的if、else if、else是十分相似的,上面这个例子中,使用if控制标签的test属性来判断是否为true,为true的话就执行if控制标签的内容,为false的话就去判断elseif控制标签的test属性,为true的话就执行elseif控制标签的内容,为false的话就去直接去执行else控制标签里的内容了,这里明显为true,所以显示的就为elseif控制标签里的内容了!
注:大家可以改下test的属性值,自己试下,这里就简单介绍了!
(2).iterator标签:用于迭代一个集合,可以是Collection,Map,Enumeration,Iterator,array。迭代过程会把每一个对象暂时压入值栈,这样标签的内部就可以直接访问对象的属性和方法,标签完毕后,值栈内容被删除。
其参数,属性为:
名字 | 是否必须 | 默认值 | 可否使用表达式 | 类型 | 描述 |
---|---|---|---|---|---|
id |
否 |
是 |
String |
Id,用来表示该元素 | |
status |
否 |
否 |
是 |
Boolean |
如果指定,在循环的过程中会保留一个IteratorStatus类型的变量,该变量用来查询当前迭代的状态 |
value |
否 |
是 |
String |
被迭代的对象 |
IteratorStatus实例包含以下几个方法:
int getConut() 返回当前迭代了几个元素。
int geIndex() 返回当前元素的索引。
boolean isEven() 返回当前迭代的索引是否是偶数。
boolean isOdd() 返回当前迭代的索引是否是奇数。
boolean isFirst() 返回当前迭代的索引是否是第一个元素。
boolean isLast() 返回当前迭代的索引是否是最后一个元素。
示例:在上面那个BiaoQian的项目底下,新建一个iterator.jsp文件,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'iterator.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><table border="1" width="100"><s:iterator value="{'端午节','中秋节','七夕节','重阳节'}" id="name" status="st"><tr <s:if test="#st.odd">style="background-color: #FFCCFF"</s:if>><td><s:property value="#st.count"/><s:property value="name"/></td></tr></s:iterator></table><s:debug></s:debug></body>
</html>
运行效果如下:
示例解析:iterator.jsp页面中我们使用iterator控制标签来迭代一个集合,该标签的value值即为我们所迭代的集合,该标签的id指定为name,可供下面的其它标签引用,指定了status为st,使得在循环的过程中会保留一个IteratorStatus类型的变量,该变量用来查询当前迭代的状态,然后又用了一个if控制标签,if标签的test值为#st.odd,因为我们使用了iterator标签来迭代,把这个IteratorStatus类型的变量st放在了值栈里头,就使用#st.odd来指定if标签的test属性,odd又是IteratorStatus的方法,返回当前迭代的集合的索引是否是奇数,即如果迭代的集合中的索引为奇数的话,就把迭代到的索引对应的内容样式的背景颜色改为粉红色,使用<s:property value="#st.count"/>来获取当前迭代了几个元素,使用<s:property value="name"/>来获取到上面指定的iterator标签的集合,是通过iterator标签的id属性值来获得的。
注:大家可以根据需要改相应的代码!
这里在扩展一下,有些同学喜欢把一些集合的内容写成单个字母,比如我有个同学经常把项目名,类名全部定义为单个字母,我说他不规范,他一直不改,但是他挺厉害的,我们省蓝桥杯一等奖获得者(班上的学霸,心目中的大牛),这里不废话了,这个问题就是我这个好同学犯的,为了避免大家会出现这个错误,就扩展一下,其实看报错信息就可以知道如何解决了:
我们把上述iterator.jsp文件的主要代码改为下面所示,这里只附上body标记后的代码:
<body><table border="1" width="100"><s:iterator value="{'a','b','c','d','e','f','g'}" id="name" status="st"><tr <s:if test="#st.odd">style="background-color: #FFCCFF"</s:if>><td><s:property value="#st.count"/><s:property value="name"/></td></tr></s:iterator></table><s:debug></s:debug></body>
然后我们再运行一次,发现界面报错,如下图所示:
在31行出错,其实我们还看漏了:
在控制台下也报错了,跟上面报错的信息差不多,这是什么错误呢?java.lang.classCastException异常,提示信息是这个异常,详细信息为java.lang.Character类型不能转换成java.lang.String类型,即字符类型不能转换为String类型,所以报这错,原因是你在迭代的集合value值里赋给的是 'a','b','c'等等的字母,会把这些字母看成一系列的字符,所以不能转换为String类型,你可以多加一个字母,即不要单个字母,这样系统就不会把多个字母把它识别为字符,而把它识别为字符串类型,修改后如下图所示:
(3).append标签:用于将多个集合对象拼接起来,组成一个新的集合,通过这种拼接,从而允许通过一个<s:iterator/>标签就完成多个集合的迭代。
在append标签内部,使用param标签指定集合。通常和iterator标签一起使用!
其参数,属性为
名字 | 是否必须 | 默认值 | 可否使用表达式 | 类型 | 描述 |
---|---|---|---|---|---|
id |
否 |
是 |
String |
用来保存结果,iterator的对象在valuecontext中的名字 |
append标签指定一个id属性,如果指定了该属性,那么组合后的迭代器将保存到OgnlContext中,可以通过该属性的值来引用组合后的迭代器。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'append.jsp' starting page</title>
</head><body><table border="1" width="200"><s:append id="newList"><s:paramvalue="{'I love java','I love java web','I love android','I love linux'}" /><s:param value="{'I love my father','I love my mother'}" /></s:append><s:iterator value="#newList" status="st"><tr <s:if test="#st.even">style="background-color: #FFCC55"</s:if>><td><s:property value="#st.count" /> <s:property /></td></tr></s:iterator></table></body>
</html>
package com.gk;import java.util.ArrayList;
import java.util.List;import com.opensymphony.xwork2.ActionSupport;public class AppendIteratorTagAction extends ActionSupport {private List myList1;private List myList2;private List myList3;public List getMyList1() {return myList1;}public void setMyList1(List myList1) {this.myList1 = myList1;}public List getMyList2() {return myList2;}public void setMyList2(List myList2) {this.myList2 = myList2;}public List getMyList3() {return myList3;}public void setMyList3(List myList3) {this.myList3 = myList3;}public String execute(){myList1=new ArrayList();myList1.add("xg");myList1.add("Lc");myList2=new ArrayList();myList2.add("Hello");myList2.add("World");myList3=new ArrayList();myList3.add("HeHe");myList3.add("HaHa");return "done";}}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><constant name="struts.enable.DynamicMethodInvocation" value="true"></constant><constant name="struts.devMode" value="true"></constant><package name="append" namespace="/" extends="struts-default"><action name="append" class="com.gk.AppendIteratorTagAction"><result name="done">/index.jsp</result></action></package>
</struts>
最后再打开index.jsp文件,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head></head><body><s:append id="myAppendIterator"><s:param value="%{myList1}"/><s:param value="%{myList2}"/><s:param value="%{myList3}"/></s:append><s:iterator value="%{#myAppendIterator}"><s:property/></s:iterator></body>
</html>
运行效果如下:
我们在BiaoQian项目下新建一个merge.jsp文件,使用的action类还是为AppendIteratorTagAction,配置文件只需配置多一个action,这里,分别附上struts.xml文件和merge.jsp文件的代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><constant name="struts.enable.DynamicMethodInvocation" value="true"></constant><constant name="struts.devMode" value="true"></constant><package name="append" namespace="/" extends="struts-default"><action name="append" class="com.gk.AppendIteratorTagAction"><result name="done">/index.jsp</result></action><action name="merge" class="com.gk.AppendIteratorTagAction"><result name="done">/merge.jsp</result></action></package>
</struts>
merge.jsp文件代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head></head><body><s:merge id="myMergeIterator"><s:param value="%{myList1}"/><s:param value="%{myList2}"/><s:param value="%{myList3}"/></s:merge><s:iterator value="%{#myMergeIterator}"><s:property/></s:iterator></body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'generator.jsp' starting page</title>
</head><body>
<table border="0"><!-- 使用generator标签将一个字符串 解析转换成一个集合--><s:generator separator="*" val="'Java*Android*Struts2*Linux'"><!-- 在generator标签内,该集合位于ValueStack的栈顶。故此处迭代就是临时生成的集合 --><s:iterator status="st"><!-- 根据当前迭代项索引的奇偶来决定是否使用css样式,这里是判断索引为奇数的就把背景颜色改为蓝色 --><tr <s:if test="#st.odd">style="background-color: blue"</s:if>><td><s:property/></td></tr></s:iterator></s:generator></table>
</body>
</html>
输入地址:http://localhost:8083/BiaoQian/generator.jsp 后,效果如下:
package com.gk;import org.apache.struts2.util.SubsetIteratorFilter.Decider;public class SubsetDecider implements Decider {@Overridepublic boolean decide(Object arg0) throws Exception {return arg0.toString().length()>4;}}
再新建一个subset.jsp文件,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'subset.jsp' starting page</title>
</head><body><s:bean var="myDecider" name="com.gk.SubsetDecider"/>没有设置decider属性:<br/><s:subset source="{'Java','Android','Linux','C'}" start="2" count="4"><s:iterator><s:property/></s:iterator></s:subset><br/>设置decider属性:<br/><s:subset source="{'Java','Android','Linux','C'}" decider="#myDecider"><s:iterator><s:property/></s:iterator></s:subset></body>
</html>
在地址栏输入http://localhost:8083/BiaoQian/subset.jsp 地址,运行效果如下:
<pre class="java" name="code">package com.gk;import java.util.Comparator;public class SortComparator implements Comparator<String> {@Overridepublic int compare(String s1, String s2) {return s2.length()-s1.length();
}
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'sort.jsp' starting page</title></head><body><!-- 使用bean标签定义一个Comparator实例 --><s:bean name="com.gk.SortComparator" id="sort"></s:bean><table><!-- 使用自定义的排序规则对目标集合进行排序 --><s:sort source="{'aad','cccc','bc'}" comparator="#sort"><!-- 迭代输出集合 --><s:iterator><tr><td><s:property/></td></tr></s:iterator></s:sort></table></body>
</html>
输入地址:http://localhost:8083/BiaoQian/sort.jsp ,运行效果如下:
Struts2之控制标签相关推荐
- struts2登录注册示例_Struts 2控制标签示例教程
struts2登录注册示例 We learned about Struts 2 Data tags in the last post, today we will look into the cont ...
- struts2控制标签(一)选择标签,iterator标签,append标签
选择标签就不用说了 iterator迭代器标签主要是对集合进行迭代操作,集合可以是List,Map,Set和数组等 id:指定集合元素的ID value: 指定迭代输出的集合,该集合可以试OGNL表达 ...
- Struts2中UI标签之表单标签介绍
1.在Struts2中UI标签的表单标签分为两种:form标签本身和单个表单标签. 2.Struts2表单标签包括:form.textfield.password.radio.checkbox.che ...
- struts2:数据标签
目录 数据标签 1. a标签 2. set标签 3. push标签 4. bean/param标签 5. date标签 6. include标签 7. url标签 8. property标签 9. d ...
- Struts2的OGNL标签详解
一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...
- struts2中使用标签操作静态方法等
2019独角兽企业重金招聘Python工程师标准>>> 有的时候对<%%>特别敏感,不想用jsp的<% %>来调用java类中的静态方法,这时候我们可以用st ...
- Struts2 分割字符串标签s:generator
Struts2 分割字符串标签s:generator有些时候会从后台返回一个字符串,可以通过Strut2的标签s:generator进行分割.generator标签,该标签可以将指定字符串按指定分隔符 ...
- html标签库jar包,struts2的s标签库jar包
这是struts2的s标签库jar包下载,Struts2的一些核心组件,帮助Struts2核心控制器更好的完成对web框架的设计,是使用Struts2不可缺少的组件,如果没有这个文件可能会造成一些软件 ...
- JSP自定义标签_控制标签体是否执行
自定义标签,在类中控制该自定义标签是否显示: import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.Tag; i ...
最新文章
- Delphi 与 DirectX 之 DelphiX(35): TDIB.Saturation();
- vs2010调用matlab2010b,VS2010调用matlab2010b引擎
- 代码实现中文命名实体识别(包括多种模型:HMM,CRF,BiLSTM,BiLSTM+CRF)
- pythoni屏幕连点_【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)
- vs使用了未初始化的局部变量怎么解决_C程序为什么要初始化?
- java+session+存在哪_JAVA中Session
- 编程之美 set 8 区间重合判断
- 搭建Android开发环境
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)
- 错误:Failed to start component [StandardEngine[Catalina].StandardHost[local
- 原来闭包也可以这么简单
- Garbled Circuits介绍 - 1 引言
- 505错误:Invalid bound statement (not found): com.pc.dao.BookMapper.queryAllBook错误解决
- Spring Cloud Bus-用法和意义
- Android 10 添加 lunch
- 彻底删除MySQL57服务
- 基于Python PYQT5的GUI亚丁号辅助登陆界面
- Quartus-II 13 安装
- instagram分享_Facebook,Twitter,Instagram,Google等使用的字体和颜色
- MMD导入Unity利用MMD4Mecanim转化MMD模型
热门文章
- datasnap 的HTTP 调用返回JSON
- Python与数据库[2] - 关系对象映射/ORM[4] - sqlalchemy 的显式 ORM 访问方式
- Spring MVC静态资源实例
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题1---cvNamedWindow调用报错的问题...
- HTTP缓存解释为何页面响应的数据和服务端的不一致
- Java反射机制(Reflection)
- 大话图像处理之入门篇
- 4022-基于链表的简单选择排序(C++,附思路)
- PTA21、K好数 (10 分)
- PTA13、随机生成密码 (10 分)