天天看点

Struts2框架学习之五:通用标签详解

前言

struts2框架为我们提供了很多标签,这些标签总体上可以分为两类:通用标签和ui标签。而较常使用的又是通用标签,所以文章的内容也是围绕通用标签展开的。通用标签分为两类:数据标签和控制标签。数据标签用于访问值栈中数据,控制标签用于控制呈现页面时数据执行流程。如果需要使用struts 2框架的标签库,需要在页面的首部引入以下代码:<code>&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;</code>下面将分别对这两种标签进行说明。

数据标签

数据标签主要用于访问actioncontext和值栈中数据,数据标签包括:

property

set

push

param

bean

action

include

url

a

i18n

text

date

debug

1、property标签

property标签用于输出值栈中对象的属性值,value属性就是要输出的值。如果没有执行value属性,那么默认就会输出栈顶对象

property标签的属性包括:

名称

是否必需

说明

default

如果value属性是null,则输出default的值

value

进行求值的表达式

2、set标签

set标签是将一个值赋给指定范围的变量。如下前面的ognl表达式文章中就多次使用了set标签。set标签的属性包括:

name

变量的名字

指定一个表达式,将计算的结果赋给变量。如果没有执行value属性,默认将栈顶对象赋给变量

scope

变量的范围,有application、session、request、page和action(默认值)

注意的是,在使用默认scope的值,即action范围的时候,value属性值会保存在request和ognlcontext(ognl上下文)中。比如下面的例子:

action:

jsp:

最后的测试结果:

Struts2框架学习之五:通用标签详解

3、push标签

push标签的作用是将一个对象放入值栈中,所以push对象位于栈顶,但是push标签结束之后,栈顶的元素将会被删除,因此需要访问push的对象需要在push标签的内部访问。push标签只有属性value,这也是一个必需提供的属性。那么具体在开发中push标签有什么作用呢?答案是简化对属性的访问。比如需要访问一个user对象的name属性和age属性,正常在jsp页面使用struts 2标签库进行访问的方式是<code>#request.user.name</code>和<code>#request.user.age</code>(假设是request范围),而使用push标签,访问name属性的方式是:

4、param标签

param标签通常是作为其他标签的子标签,用于为其他标签提供参数。param标签有两个非必需属性name和value。其中的name属性是要设置参数的名字,value则是该参数的值。使用param标签有两种方式:<code>&lt;param name="username" value="zhangsan"/&gt;</code>和<code>&lt;param name="username"&gt;zhangsan&lt;/param&gt;</code>。在第一种方式中,value属性并不会作为name属性的值,而是表达式对待,因此如果zhangsan属性是空的话,将得到null ,所以需要把value改成<code>%{'zhangsan'}</code>。第二种访问方式是没有什么问题的。所以这种方式也是推荐的写法。

5、bean标签

bean标签相当于jsp中的usebean标签,bean标签通常用于实例化一个javabean对象,一个bean标签内部可以有多个param标签,用于为bean实例设置属性值(要求有set方法)。bean标签有两个属性:name和id。其中的name属性是要实例化的bean的完整类名,id用于指定一个名字,用于引用放入ognlcontext中的javabean对象。这里需要注意的是,出了bean标签,放入栈顶的实例(用bean标签创建的javabean对象会放入栈顶)会被移除。但是如果指定了id属性,在bean标签的外部就可以访问了。此时需要使用#符号。因此如果需要创建在bean实例可以在bean标签的外部也可以访问到,就需要指定id属性。

6、action标签

通过指定action的名字和可选的命名空间,action标签允许在jsp页面直接访问action。如果将action标签的executeresult属性设置为true,那么action对应的输出结果也会包含在本页面中。由于这种方式并不常用,而且在实际开发中使用的场合比较少,这里就不详细说明了。

7、include标签

该标签类似于jsp中<code>&lt;jsp:include&gt;&lt;/jsp:include&gt;</code>标签。在标签的内部可以包含多个param标签,用于向被包含的页面传递参数。include标签只有一个value属性,用于指定被包含的jsp或者servlet。比如下面的代码:

includetag.jsp

includejsp.jsp:

最后的访问includetag.jsp,可以看到如下的结果:

Struts2框架学习之五:通用标签详解

8、其他标签

其中的url标签用于创建一个url,在标签内部可以提供url附加的参数信息。i18n标签和text标签主要用于国际化的支持。i18n标签把一个资源包放入值栈中,text标签用于从资源包中获取消息。date标签主要用于格式化日期的输出。

控制标签

控制标签用于在呈现页面的时候控制程序的执行流程。常用的控制标签包括:

if/elseif/else

iterator

generator

1、if/elseif/else 标签

下面是这个标签使用的一个例子:

2、iterator标签

iterator标签用于迭代一个集合的元素,在迭代的过程中,会暂时把迭代的对象压入栈顶,这样在标签的内部可以访问对象的属性值了。访问结束之后,会把栈顶的迭代对象移除,并把下一次迭代的对象压入栈顶。这样一直到所有的对象迭代完毕。iterator标签有三个属性:id、value和status。id属性几乎不使用,value属性用于指定迭代的集合,status属性可以获取迭代中的一个状态信息(比如索引值、是否是奇数、偶数等),其所有的方法如下:

public int getcount():得到迭代元素的总数

public int getindex():得到当前迭代元素的索引

public boolean iseven():判断当前迭代的元素的顺序是否是偶数

public boolean isodd():判断当前迭代的元素的顺序是否是奇数

public boolean isfirst():判断当前迭代的元素是否是第一个元素

public boolean islast():判断当前迭代的元素是否是最后一个元素

比如下面的例子:

3、generator标签

generator标签主要是根绝分隔符对元素进行处理,该标签一般和iterator标签使用,在generator标签的内部可以使用iterator标签对处理之后的元素进行迭代,下面是一个例子:

generator标签中上述的separator属性和val属性是必需的,如果指定了id属性,那么将以id属性的值作为key,将生成的迭代器保存在pagecontext对象中。