【Web开发】Struts2标签使用——控制标签

标签: Struts2标签

Struts标签库分类

控制标签:用于执行基本的条件流转

1.if/else if/else标签

test属性控制该标签是否显示

<s:set name="dengji" value="85"/>
<s:if test="#dengji>=90">成绩优秀</s:if>
<s:elseif test="#dengji>=80">成绩良好</s:elseif>
<s:elseif test="#dengji>=60">成绩合格</s:elseif>
<s:else>成绩不合格</s:else>

2.iterator/append/merge/generator/subset/sort标签

(1).iterator标签 用于对集合类型的变量进行迭代输出

value:用来指定被迭代输出的集合
id:用来指定集合中元素的ID属性,配合property进行输出
status:用于指定该集合的status的别名,指定后会生成IteratorStatus实例对象,拥有以下方法:
int getCount(); 迭代元素个数
int getIndex(); 迭代元素当前索引
boolean getFirst(); 是否为第一个
boolean getEven(); 是否为偶
boolean getLast(); 是否最后一个
bolean getOdd(); 是否为奇
由于iteratorstatus对象并不是ognl的根对象因此访问需要加上 #

<s:iterator value="{'Java程序设计 案例教程','JSP实践教程','Struts2完全学习手册'}" id="bookname">
    <s:property value="bookname" /><br>
</s:iterator>

昨天的存储bookList也可以解决了:

<s:form action="addBookAction" namespace="/Book" method="addBook">
<s:iterator value="new int[3]" status="st">
    <s:textfield name="bookList[%{#st.index}].name" label="图书名称"></s:textfield>
    <s:textfield name="bookList[%{#st.index}].price" label="图书价格"></s:textfield>
    <s:textfield name="bookList[%{#st.index}].num" label="发行数量"></s:textfield> 
</s:iterator>
    <s:submit value="添加" />
</s:form>

iterator访问Map集合的方法:
注意自定义集合的value需要有#,或value=“map”,map为action内的map对象

<s:iterator value="#{'a':'1','b':'2'}" id="bookname">
    <s:property value="bookname"/> <s:property value="key" /> <s:property value="value"/><br>
</s:iterator>

iterator访问Map集合

(2).append/merge标签
将多个集合对象连接起来,从而组成一个新的集合
id:用于定义连接后新集合的名字
param:用于指定一个子集合
append生成的新集合按照集合添加顺序输出,而merge标签用于每个集合交互添加后输出

<s:append id="newList_append">
    <s:param value="{'1:1','1:3','1:2'}"></s:param>
    <s:param value="{'2:1','2:2','2:3'}"></s:param>
</s:append>
<s:merge id="newList_merge">
    <s:param value="{'1:1','1:3','1:2'}"></s:param>
    <s:param value="{'2:1','2:2','2:3'}"></s:param>
</s:merge>
<h3>迭代输出由append标签产生的新集合</h3>
<s:iterator value="#newList_append" status="st">
    <ul <s:if test="#st.odd" >style="color:blue;"</s:if>>
    <li><s:property/></li>
    </ul>
</s:iterator>
<h3>迭代输出由merge标签产生的新集合</h3>
<s:iterator value="#newList_merge" status="st">
    <ul <s:if test="#st.odd" >style="color:blue;"</s:if>>
    <li><s:property/></li>
    </ul>
</s:iterator>

append与merge输出顺序对比
3.generator标签
用于将一个字符串按照指定分隔符分隔成多个子串,可以通过iterator标签进行迭代输出。
count:可选属性,用于指定所生成集合中元素的总数
val:必选属性,用于指定被解析的字符串
separator:必选属性,用于指定分隔符
converter:可选属性,用于指定转换器,将集合中的每个字符转换成对象,转换器必须一个继承org.apache.struts2.util.IteratorGenerator.Converter的对象。

外部输出两种方式:

<s:generator val="'Java程序设计 案例教程,JSP实践教程,Struts2完全学习手册'" 
separator="," count="2" id="bookname">
</s:generator>
<s:iterator value="bookname" status="st">
    <li><s:property /></li>
</s:iterator>
<s:generator val="'Java程序设计 案例教程,JSP实践教程,Struts2完全学习手册'" 
separator="," count="2" id="bookname">
</s:generator>
<s:iterator value="#bookname" id="hello" status="st">
    <li><s:property value="hello"/></li>
</s:iterator>

内部输出就不需要写value了,当然写也是可以的,剩下的与上面相同

<s:generator val="'Java程序设计 案例教程,JSP实践教程,Struts2完全学习手册'" 
separator="," count="2" id="bookname">
<s:iterator status="st">
    <li><s:property /></li>
</s:iterator>
</s:generator>

经过测试,在内部输出后,该集合为空,用外部输出无返回值。

4.subset标签
用于从一个集合进行截取,从而产生一个新的子集合
count:可选属性,指定子集中元素的个数,默认取得源集合的所有元素
source:可选属性,指定源集合,如果不指定,默认取得valueStack栈顶的集合,一般都会指定
start:可选属性,指定从源集合的第几个元素开始截取,默认从第一个元素(即start=0)开始
decider:可选属性,由开发者自己决定是否选中该元素

<s:subset source="{'aaa','bbb','ccc','ddd'}" count="3" start="1">
<s:iterator status="st">
    <li><s:property /></li>
</s:iterator>
</s:subset>

5.sort标签
用于对指定的集合进行排序,但是排序规则要由开发者提供,即实现自己的Comparator实例
comparator:必选属性,用于指定实现排序规则的Comparator实例
source:可选属性,用于指定将要排序的集合。

MyComparator.java

package ch4;
import java.util.Comparator;
public class MyComparator implements Comparator{
    @Override
    public int compare(Object o1, Object o2) {
        // TODO Auto-generated method stub
        return o1.toString().length()-o2.toString().length();
    }   
}
<s:bean id="mycomparator" name="ch4.MyComparator"/>
<s:sort source="{'a','bbb','cc','dddd'}" comparator="#mycomparator">
<s:iterator status="st">
    <li><s:property /></li>
</s:iterator>
</s:sort>
版权声明:本文为tjj1998原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tjj1998/article/details/80548646

智能推荐

模拟按键 —— 鼠标

背景 之前写自动化脚本的时候总是遇到一些很尴尬的问题: 跑脚本时模拟鼠标按键时,光标是真实的跑到了那个位置的,也就是说跑脚本的时候会很影响电脑的正常使用,导致不得不开一个虚拟机专门跑。 另外因为光标只有一个所以很难实现多线程去同时操作多个窗口,当线程1 模拟鼠标但还没有结束时,线程2 已经开始执行模拟操作,这就导致了线程1 的模拟操作被终止了,被迫之下只能开多个虚拟机(但实在太占用性能🙄) 解决...

Hibernate学习总结(一)

一、Hibernate简介 一个持久层的ORM框架。ORM:Object Relational Mapping(对象关系映射)。指的是将一个Java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以操作数据库中的表。 二、Hibernate入门 1、创建一个项目,引入jar包 hibernate用到的jar包 2、创建表 3、创建实体类 4、创建映射(*****) 映射需要通过XML...

Linux系统NFS

文章目录 1. nfs简介 1.1 nfs特点 1.2 使用nfs的好处 1.3 nfs的体系组成 1.4 nfs的应用场景 2. nfs工作机制 2.1 RPC 2.2 NIS 2.3 nfs工作机制 3. exports文件的格式 4. nfs管理 5. 作业 5.1手动搭建一个nfs服务器 5.1.1开放/nfs/shared目录,供所有用户查阅资料 5.1.2 开放/nfs/upload目...

关于java中String,StringBuffer,StringBuilder的区别以及StringBuffer,StringBuilder的安全性问题

这里的结果就是正确的然后我们来看他的append方法 它在前边加了一个synchronized来修饰,相当于同时只能有一个线程来访问他,这样就不会产生上边的问题但同时他的效率也就比StringBuilder低,...

Django连接现有mysql数据库

1、打开cmd后cd到项目位置 2、建立项目 django-admin startproject test2 3、编辑项目中的配置文件, mysite/settings.py ,告诉Django你的数据库连接参数和数据库名。具体的说,要提供 DATABASE_NAME , DATABASE_ENGINE , DATAB...

猜你喜欢

ShareSDK新浪微博登录时报错error:redirect_uri_mismatch

今天用 ShareSDK 做第三方登录的时候碰到个问题,明明在微博平台的应用审核已经通过了,但是调用登录接口的时候一直报错,错误如下: 出现这个错误是因为在微博开放平台上没有设置回调地址,或者设置的回调地址与本地XML中的地址不一致。 在sharesdk.xml文件当中对于微博的设置: 其中RedirectUrl为设置的回调地址,这里的地址必须要与微博开发平台设置的地址相同,否则就会出现上面的错误...

python解析网络封包方法

2019独角兽企业重金招聘Python工程师标准>>> 在使用Python解析网络数据包时,使用网络字节序解析,参见下表。 C语言的数据类型和Python的数据类型对照表请参见下表。 接下来对封包与解包进行举例说明。 version type id content unsigned short unsigned short unsigned int unsigned int 封包...

python3:时间方法,异常处理,系统文件相关模块(os)

文章目录 时间方法 time模块 时间表示方法: time模块的方法 datetime模块 异常处理 触发异常 创建mydiv.py脚本,要求如下: 创建myerror.py脚本,要求如下: os模块 实现ls -R(os.walk) os.path pickle模块 记账脚本 时间方法 time模块 时间表示方法: 时间戳:自1970-1-1 0:00:00到某一时间点之间的秒数 UTC时间:世...

负载均衡群集——LVS+DR模型

一、实验组成 调度器 192.168.100:41 web1 192.168.100:42 web2 192.168.100.43 NFS共享服务器 192.168.100.44 二、实验拓扑 三、实验配置 3.1在调度器配置:192.168.100.41 配置虚拟IP地址(VIP) 调整/proc响应参数 对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭...

adb无线连接时appium找不到设备

问题描述 以前使用USB连接真机,运行appium时一直正常,连接参数如下: 最近为了方便,使用adb无线连接真机,adb版本为1.0.40,真机安卓版本10,连接后,通过adb devices能够查看到连接的设备: adb无线连接是正常的,但每次运行时appium都找不到无线连接的设备,陷入重启adb循环: 解决流程 1.因为是没找到设备,所以在appium连接参数中增加了"udid&...