- 浏览: 308896 次
最新评论
-
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
nucleus:
为什么都是没有图的。。。。。。。求图片啊
《研磨struts2》第七章 值栈和OGNL 之 7.4 ActionContext和ServletActionContext -
hunanjun000:
《研磨struts2》第四章 Action 之 4.5 Action的其它重要知识
8.3 控制标签
控制标签关注程序的运行流程,比如用if/else来进行分支控制,用iterator来进行循环控制。接下来就来学习Struts2的控制标签。
8.3.1 if、elseif与else标签
1:if标签的功能:
类似于Java程序中的if,用来表达分支判断。
else标签的功能:
类似于Java程序中的else。
elseif标签的功能:
类似于Java程序中的else if。
2:属性:
if标签和elseif标签都只有一个test属性,它本身是一个OGNL表达式,运算结果为一个boolean值,表示是否符合条件,必须设置。
else标签没有属性。
3:示例:
由于大家对于Java中的if-else是非常熟悉的,因此这里只需要看看,用标签如何来表达即可,示例如下:
8.3.2 iterator标签
1:功能:
iterator标签用来处理循环,可以用它遍历数组、Set和List等集合对象。这个标签还支持在ActionContext中保持一个保存遍历状态的对象,通过这个变量可以得到当前循环的各种信息。
iterator标签在遍历一组对象的时候,它把正在循环的对象放在值栈的栈顶,所以可以直接引用这个对象的方法或属性,后面给出示例。
2:属性:
iterator标签的主要属性:
- value:用来指明到底循环的是谁,这个属性的值是OGNL表达式,用来访问ActionContext和值栈中需要被循环的对象。
- status:这个属性在ActionContext中保存一个对象,用来返回当前循环的各种信息,可以返回的信息有:
l count:集合含有多少个对象。
l index:正在循环的这一项的索引。
l even:当前遍历到的对象是不是处于列表的偶数索引位置。
l odd:当前遍历到的对象是不是处于列表的奇数索引位置。
l first:正在循环的是不是第一个。
l last:正在循环的是不是最后一个。
- begin、end、step:指明了如果使用索引来进行循环时的开始、结束和步长。
- var:变量名称,用来引用存放到值栈的被循环的对象。
3:示例:
其实在Java中处理循环的时候,主要用的是for循环和while循环,do-while循环的应用相对少一些。接下来用iterator标签来实现类似于Java中循环的功能。
(1)实现类似于for循环的功能
假如现在要求完全使用标签,来实现循环输出1到10的值,该如何实现呢?
很明显,使用iterator标签的begin、end、step和var属性就可以了,示例代码如下:
上面的实现很类似于如下的Java代码:
有朋友可能会说
(2)实现类似于while循环的功能
假如要循环输出一个List的值,那么就需要使用到var和value属性了,示例如下:
- <%@ page import="java.util.*"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <%
- //准备点循环用的数据
- List<String> list = new ArrayList<String>();
- for(int i=1;i<=10;i++){
- list.add("str="+i);
- }
- request.setAttribute("list",list);
- %>
- <s:iterator var="v" value="#request['list']">
- <s:property value="#v"/>
- </s:iterator>
上面的实现很类似于如下的Java代码:
(3)访问复杂的对象
如果List里面放的是复杂对象呢,比如前面用过的UserModel,里面有两个属性:userId、name。页面上该如何循环显示呢?
示例代码如下:
- <%@ page import="java.util.*"%>
- <%@page import="cn.javass.ognl.vo.UserModel" %>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <%
- //准备需要循环的数据
- List<UserModel> list = new ArrayList<UserModel>();
- UserModel um1 = new UserModel();
- um1.setUserId("userId1");
- um1.setName("张三");
- list.add(um1);
- UserModel um2 = new UserModel();
- um2.setUserId("userId2");
- um2.setName("李四");
- list.add(um2);
- request.setAttribute("users",list);
- %>
- <s:iterator value="#request.users">
- userId=<s:property value="userId"/>,
- name=<s:property value="name"/><br>
- </s:iterator>
分析一下上面的代码,iterator标签的value属性指明了要循环谁,里面的OGNL表达式"#request.users"表明了要访问request的属性中名称为users的属性的值。
接下来iterator标签在循环的时候,把当前正在循环的对象放到值栈的栈顶,比如循环第一次的时候,它就会把List中的第一个对象放到值栈的栈顶,这时候,访问这个对象的getName方法,就可以直接用简单的“name”就可以了。
(4)使用status属性
如果还想输出当前循环的索引,或者是想要把循环输出的数据用表格来展示,并按照奇数行和偶数行来设置不同的背景色,也就是我们熟悉的波浪纹或者是斑马纹背景,该如何实现呢?
这当然需要使用iterator标签的status属性,把一个保存循环状态的对象放到ActionContext中,然后在iterator标签内的property标签中,就可以引用这个保存循环状态的对象了。先来示例输出当前循环的索引,示例如下:
注意,<s:property>引用status属性名称的时候前面要加#号,status这个对象可以使用的属性在前面的属性列表中写明了,#state.index就表示在循环内引用循环状态信息中的索引,每次循环完一个对象,state的内部状态都会相应变化。
如果要实现波浪纹或斑马纹背景的表格,该如何实现呢?
首先需要多添加点数据,才好看出效果,其次把循环的数据放置到表格中去,然后通过循环的状态对象来判断是奇数行还是偶数行,为这些行设置不同的背景颜色就可以了。示例代码如下:
- <%@ page import="java.util.*"%>
- <%@page import="cn.javass.ognl.vo.UserModel" %>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <%
- //准备需要循环的数据
- List<UserModel> list = new ArrayList<UserModel>();
- UserModel um1 = new UserModel();
- um1.setUserId("userId1");
- um1.setName("张三");
- list.add(um1);
- UserModel um2 = new UserModel();
- um2.setUserId("userId2");
- um2.setName("李四");
- list.add(um2);
- UserModel um3 = new UserModel();
- um3.setUserId("userId3");
- um3.setName("王五");
- list.add(um3);
- UserModel um4 = new UserModel();
- um4.setUserId("userId4");
- um4.setName("马六");
- list.add(um4);
- request.setAttribute("users",list);
- %>
- <table border=1>
- <tr>
- <td colspan="4" align="center">用户列表</td>
- </tr>
- <tr>
- <td>索引</td>
- <td>用户编号</td>
- <td>用户姓名</td>
- <td>操作</td>
- </tr>
- <s:iterator value="#request.users" status="state">
- <tr
- <s:if test="#state.even">
- bgcolor="#EFF8FF"
- </s:if>
- <s:else>
- bgcolor="#B4CFF1"
- </s:else>
- >
- <td><s:property value="#state.index"/></td>
- <td><s:property value="userId"/></td>
- <td><s:property value="name"/></td>
- <td><a href="">修改</a> <a href="">删除</a></td>
- </tr>
- </s:iterator>
- </table>
运行效果如下图
图8.9 示例iterator标签
是不是看起来有点做列表页面的感觉,这就对了,以后用Struts2开发,一定少不了使用iterator标签的。
8.3.3 append与param标签
1:功能:
append标签用于把几个已经存在的集合组合成一个大集合,param标签跟它连用,用来指定组合哪些集合。
2:属性:
append标签的主要属性:
- var:用来指定把组合后的大集合放到值栈里的变量名称。
3:示例:
简单的示例如下:
首先用set标签来指定两个集合,对于<s:set value="{1,2,3}" var="list1"/>来说,var属性指定了这个集合被放进值栈的名字为list1,而value属性的值为{1,2,3},本身是OGNL表达式,表示直接创建一个集合,里面有1、2、3三个值。
然后,使用append标签来把list1和list2组合成一个大的集合,<s:append var="list3">中的var属性指定了组合后的大集合放进值栈的名字为list3,而param标签的value属性指定了被组合的集合。
最后,用iterator标签来遍历并输出合并后的集合。
8.3.4generator标签
1:功能:
generator标签用来切分字符串,并把切分的结果组成一个集合。
2:属性:
generator标签的主要属性:
- val:指定被切分的字符串,必须指定。
- separator:指定切分字符串用的分隔符,必须指定。比如要用“,”来切分字符串“a,b,c,d”,最终的结果为包含a、b、c、d四个字符串的集合。
- count:返回集合的最大长度。
- converter:用于设置自定义的Converter,必须是org.apache.struts2.util.IteratorGenerator.Converter接口的实现类。
- var:指定变量名称,用来访问放到值栈中的集合。
3:示例:
来个简单的示例,把一个字符串分解成集合,然后循环输出。示例代码如下:
上面的示例中,先使用generator标签将val的值,也就是字符串"'a,b,c,d'"用separator的值,也就是","来进行切分,把切分后的结果放入值栈,引用的名称为var属性的值arr。最后用iterator标签输出刚刚切分创建的集合。
如果把iterator标签嵌套在generator标签内,就可以不用指定iterator标签的value属性,而直接使用generator标签拆分字符串的结果了。
8.3.5merge标签
1:功能:
merge标签用来把几个已经存在的集合组合成一个大集合,与append标签的作用类似,只是原来集合中出现的各个元素出现在大集合中的顺序不同。
2:属性:
merge标签的主要属性:
- var:用来指定把组合后的大集合放到值栈里的变量名称。
3:示例:
沿用前面的例子,稍稍修改一下,示例如下:
去运行测试一下,结果页面如下:
图8.10 示例merge标签
通过上面的示例可以看出,使用merge标签的时候,先出现原来各个集合中的第一个元素,然后是原来各个集合中的第二个元素,以此类推,所以结果为“1,4,2,5,3,6”。
而以前在使用append标签的时候,原来集合中的元素出现在大集合中的顺序为第一个集合的所有元素都出现之后,再出现第二个集合的所有元素,结果为“1,2,3,4,5,6”。
这就看出merge标签和append标签的区别来了。
8.3.6sort标签
1:功能:
利用设置的比较器,来对指定的集合进行排序。
2:属性:
sort标签的主要属性:
- comparator:用来指定对集合排序使用的比较器的实例
- source:需要排序的集合
- var:变量名称,把集合排序后的结果存放到page context中的key值
3:包含基本数据类型的集合排序示例:
还是通过示例来看sort的使用,先来示范对包含基本数据类型的集合的排序。
(1)先来准备比较器,就是实现java.util.Comparator接口的类,实现对整型数据进行升序排序,示例如下:
(2)在页面上直接准备集合数据,然后排序并输出,示例如下:
注意,在sort标签的comparator属性里面,配置的是比较器的实例,这个实例怎么得到呢?因此在前面使用bean标签创建了一个比较器的实例,然后在comparator属性里面指定就可以了。
(3)运行测试一下,界面输出:“3,4,5”,是排好序了的。当然,你也可以修改比较器的实现,来实现其它的比较方式,比如降序排列等等。
有朋友会说,这是对基本类型的处理,要是复杂对象怎么排序呢?
4:包含复杂数据类型的集合排序示例:
(1)先来准备要排序的对象,简单点,就使用UserModel吧,给他添加toString方法,后面排序输出的时候会用,示例如下:
- public class UserModel {
- private String userId;
- private String name;
- public String getUserId() {
- return userId;
- }
- public void setUserId(String userId) {
- this.userId = userId;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String toString(){
- return "userId="+userId+",name="+name;
- }
- }
(2)来准备比较器实现,很简单,按照用户编号来进行降序排列吧,示例如下:
(3)在页面上直接准备集合数据,然后排序并输出,示例如下:
- <%@page import="cn.javass.tag.vo.UserModel"%>
- <%@page import="java.util.*"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <%
- List<UserModel> list = new ArrayList<UserModel>();
- UserModel um1 = new UserModel();
- um1.setUserId("user1");
- um1.setName("张三");
- list.add(um1);
- UserModel um2 = new UserModel();
- um2.setUserId("user2");
- um2.setName("李四");
- list.add(um2);
- UserModel um3 = new UserModel();
- um3.setUserId("user3");
- um3.setName("王五");
- list.add(um3);
- request.setAttribute("list",list);
- %>
- <s:bean id="myComparator" name="cn.javass.tag.MyComparator" />
- <s:sort comparator="#myComparator" source="#request['list']">
- <s:iterator>
- <s:property/>
- </s:iterator>
- </s:sort>
(4)运行测试一下,界面输出:“userId=user3,name=王五 userId=user2,name=李四 userId=user1,name=张三”,是按照用户编号降序排好序了的。
8.3.7subset标签
1:功能:
用于获取指定集合的子集合。
2:属性:
subset标签的主要属性:
- count:用于指定子集中元素的个数。
- decider:用于指定实现过滤条件的对象,这个对象会按照过滤条件一一检测源集合中的元素是否应该被放到子集合中,指定过滤条件的类需要实现org.apache.struts2.util.SubsetIteratorFilter.Decider接口。
- var:变量名称,就是将子集合保存在当前页的上下文pageContext中所指定的key值,以后可以通过这个key值来访问。
- source:用于指定源集合。
- start:用于指定从源集合的第几个元素开始截取,注意:0代表第一个元素。
3:示例简单截取:
先来个简单的示例,准备一个集合,然后从第2个开始截取,一共截取2个元素,然后把子集合输出出来,示例如下:
运行测试一下,界面应该输出如下:“3 4”。因为从原集合索引为2的位置开始截取,索引是从0开始,2就是第3个位置了。
4:decider属性示例:
先写一个Decider,假如实现如下功能:用于检测源集合中的每一个元素转换为字符串后,长度是否为1,是1则通过,否则这个元素不会进入子集合。示例代码如下:
在页面上先准备一个集合,然后使用这个Decider来实现截取判断,示例如下:
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <s:bean name="cn.javass.tag.StringLengthDecider" var="decider1"/>
- <s:set var="list" value="{'1','2','33','4','55','6'}"></s:set>
- <s:subset source="#list" start="1" count="2" decider="#decider1">
- <s:iterator>
- <s:property />
- </s:iterator>
- </s:subset>
在上面的代码中,首先使用bean标签创建了一个StringLengthDecider的实例,并把这个实例放到值栈上。然后用set标签创建了一个集合,也把这个集合放到值栈上。
然后使用subset标签,其source属性指定了源集合为值栈中名称为“list”的集合;其start属性为1说明了从索引1开始,即源集合的第一个元素’1’不会进入子集合;其count属性的值为2说明了子集合中最多有2个元素;其decider属性指定了字符串长度等于1的元素才能进入子集合。
综合以上各项条件,最终运行得到的结果应该是:“2 4”。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4079.html】
欢迎访问http://sishuok.com获取更多内容
发表评论
-
研磨struts2 目录贴
2012-08-24 12:12 163331.1 《研磨struts2》 第一章 Struts2 ... -
跟着cc学设计 之 研磨设计模式 视频教程 出炉了
2012-08-15 07:16 2研磨设计模式——跟着CC学设计系列精品课程,上线了! ... -
研磨struts2 目录
2012-07-30 21:15 2471.1 《研磨struts2》 第一章 Strut ... -
研磨struts2 目录
2012-07-30 16:54 361.1 《研磨struts2》 第一章 Stru ... -
《研磨struts2》A.2 struts.properties的配置 之 A.2.1 概述
2012-07-09 12:10 3055A.2.1 概述 如果我们希望覆盖在 ... -
《研磨struts2》附录A Struts2的配置 之 A.1 struts.xml的配置
2012-07-09 12:10 2710A.1 struts.xml的配置 A.1.1 ... -
《研磨struts2》第二十一章 零配置 之 21.3 通过注解来实现零配置
2012-07-06 08:07 291121.3 通过注解来实现零配置 21.3.1 ... -
《研磨struts2》第二十一章 零配置 之 21.2 约定大于配置
2012-07-05 10:44 245821.2 约定大于配置 21.2.1 约定 ... -
《研磨struts2》第二十一章 零配置 之 21.1 概述
2012-07-05 10:44 231321.1 概述 21.1.1 零配置概述 在 ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.3 整合Struts2与SiteMesh
2012-07-04 08:15 2072在Struts2中使用SiteMesh ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.2 单独使用SiteMesh
2012-07-03 08:00 209120.2 单独使用SiteMesh 20. ... -
《研磨struts2》第二十章 整合SiteMesh 之 20.1 调整应用的风格
2012-07-03 07:59 185520.1 调整应用的风 ... -
《研磨struts2》19.2 使用execAndWait拦截器模拟进度条 之 19.2.1 模拟长时间运行的Action
2012-07-02 12:24 213719.2.1模拟长时间运行的Action ... -
《研磨struts2》第十九章 进度条 之 19.1 使用“进度条”告知用户进度
2012-07-02 12:23 214119.1 使用“进度条”告知用户进度 ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.3 Struts2结合JFreeChart
2012-06-28 12:12 199918.3 Struts2结合JFreeChart ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.2 Struts2插件概述
2012-06-28 12:11 2022Struts2并没有求大求全,企图把所有 ... -
《研磨struts2》第十八章 结合JFreeChart 之 18.1 JFreeChart使用
2012-06-20 15:48 227818.1 JFreeChart使用 18.1.1概 ... -
研磨struts2(1-10章)电子书下载
2012-06-19 07:30 6058研磨struts2的博客文章 私塾在线学习网 《研 ... -
《研磨struts2》第十七章 防止重复提交 之 17.3 更强大的tokenSession拦截器
2012-06-18 13:46 206917.3 更强大的tokenSession拦截器 ... -
《研磨struts2》第十七章 防止重复提交 之 17.2 使用标签
2012-06-18 13:45 233317.2 使用<s:token/>标签 ...
相关推荐
Struts2 是一款流行的 Java Web 开发框架,它极大地简化了视图与控制器的交互。在 Struts2 中,Taglib(标签库)是用于增强 JSP 页面功能的关键...因此,熟悉 Struts2 的 Taglib 是 Java Web 开发者必备的技能之一。
- 引入Struts2标签库:在JSP页面头部添加`<%@ taglib prefix="s" uri="/struts-tags"%>`。 - 在Action中定义相关属性和方法。 - 在JSP页面中使用标签,如`s:textfield name="username"`绑定Action的username属性...
Struts2 标签库详解 Struts2 提供了一个强大的标签库,用于简化 Web 应用程序的开发过程。这些标签可以分为两类:通用标签和 UI 标签。下面,我们将详细介绍 Struts2 标签库的使用。 4.1 通用标签 通用标签用来...
在Struts2中,自定义标签通常由Action类和结果页面共同完成,提供了一种声明式编程的方式,降低了视图与控制层的耦合度。 二、自定义标签的优点 1. 提高代码可读性:自定义标签将复杂的业务逻辑封装起来,使得HTML...
Struts2.0 Taglib标签库是Struts2框架中的核心组成部分,它提供了一组丰富的JSP标签,简化了视图层的开发,使得开发者可以更加专注于业务逻辑,而不用过多地处理HTML和Java代码的混杂。这些标签主要分为以下几大类:...
1. **下载Pager Taglib**:可以从Struts2的官方仓库或者第三方软件源获取Pager Taglib的jar包。确保下载的是与当前Struts2版本兼容的版本。 2. **添加依赖**:将下载的jar包添加到项目的类路径中。如果是Maven项目...
Struts 2 标签的使用注意事项 Struts 2 是一个基于MVC架构的Java Web应用程序框架,它提供了一系列的标签来简化Web开发。然而,在使用Struts 2标签时,需要注意一些重要的事项。 首先,在使用Struts 2标签之前,...
struts taglib使用示例 struts taglib使用示例 struts taglib使用示例struts taglib使用示例 struts taglib使用示例
在使用Struts2标签库前,需要在JSP页面中引入相应的标签库,通常使用`<%@taglib>`指令,如`<%@taglib uri="/struts-tags" prefix="s"%>`。对于Servlet2.3之前的版本,可能还需要在web.xml中配置标签库的定义,但...
- **控制标签**:如`s:if`, `s:else`, `s:choose`等,用于条件判断和流程控制。 - **数据展示标签**:如`s:textfield`, `s:textarea`, `s:checkbox`, `s:radio`等,用于创建表单元素并绑定到Action的属性。 - **...
在Struts2中,标签库是其核心组件之一,极大地简化了视图层的开发,使得开发者可以更加专注于业务逻辑而不是繁琐的HTML代码。本篇文章将深入探讨Struts2的标签库,并通过具体案例进行讲解。 首先,Struts2标签库...
struts-taglib-1.3.10.jar struts-taglib.jar taglib.jar
在Struts2中,标签库是其核心特性之一,它提供了一系列预定义的JSP标签,用于简化视图层的编码,提高代码的可读性和可维护性。下面我们将详细探讨Struts2标签的使用方法以及EL(Expression Language)表达式。 1. *...
Struts2 标签库及国际化的使用案例 Struts2 框架提供了强大的标签库和国际化功能,本实验旨在掌握 Struts 2 标签库和国际化功能的使用,并实现用户注册页面的国际化显示。 一、Struts2 标签库 Struts2 框架提供了...
Struts2的标签库不仅限于核心库,还可以通过插件机制添加第三方标签库,如Struts2-dojo-plugin、Struts2-jquery-plugin等,这些插件提供了丰富的UI组件,如日期选择器、下拉树等。 总结,Struts2标签库是其强大功能...
struts2 标签 Taglib (Struts2标签库)
Struts2是一个强大的MVC框架,它允许开发者创建复杂、可扩展的Web应用程序。在Struts2中,自定义标签的实现是...通过Struts2的自定义标签,开发者能够更加灵活地控制视图层的呈现,同时保持与模型和控制器的松耦合。