在早期的web开发中,jsp视图控制和显示技术主要依靠java脚本实现的,这样一来,jsp页面嵌入了大量的java脚本代码,维护起来极为困难。从jsp1.1规范后,JSP增加了自定义标签库的支持,标签库是一种组件技术,通过标签库,可以将复杂的java脚本代码封装在组件中,开发者只需要使用简单的java代码就可以实现复杂的java脚本功能,提高了开发者的开发效率。
Struts2标签库的分类
主要分为以下三类:
- UI标签(用户界面标签):主要是用于生成HTML元素的标签,UI标签又可以分为表单标签(生成Form元素)和非表单标签(生成tree、tab页等)
- 非UI标签:主要用于数据访问,逻辑控制。 非UI标签可以分为流程控制标签(用于实现分支、循环等流程控制)和数据访问标签(主要包括用户输出ValueStack中的值,完成国际化等功能)
- Ajax标签:用于支持Ajax效果
Struts2标签使用前的准备
我们可以在struts2-core-2.1.8.1.jar压缩文件的META-INF目录下找到
struts-tags.tld文件,这个文件定义了Struts2的标签。
(1) 要在jsp页面中使用Struts2标签,先要指明标志的引入。通过jsp代码的顶部加入以下的代码:
<%@ taglib prefix="s"uri="/struts-tags" %>
(2) 在web.xml中声明要使用的标签
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
Struts2标签的使用
a. 控制标签
Struts2的非UI标签包括控制标签和数据标签,主要用于完成流程控制,以及对ValueStack的控制,数据标签主要用于访问ValueStack中的数据; 控制标签可以完成流程输出控制,例如分支、循环等的操作,也可以对集合的合并、排列等。
控制标签有:
1、if:用于控制选择器输出的标签;
2、else if: 与if标签结合使用,用于控制选择输出的标签;
3、else:与if标签结合使用,用于控制选择输出的标签;
4、append:将多个集合拼接成一个新的集合;
5、generator:字符解析器,用于将一个字符串解析成一个集合;
6、Iterator:这是一个迭代器,用于将集合迭代输出;
7、merge:用于多个集合拼接陈一个新的集合。但与appernd的拼接方式有所不同。
8、sort:用于对集合进行排序;
9、Subset:截取集合的部分元素,形成新的子集;
If/elseif/else这三个标签都是用于进行分支控制的,他们都是用于根据一个Boolean表达式的值,来确定是否计算、输出标签体的内容。
Iterator标签:
用于对集合进行迭代,这里集合包含List、Set数组,也可对Map类型的对象进行迭代输出。Vlue、id、Status三个属性都是可选属性,如果没有指定value属性,则使用ValueStack栈顶的集合。
例如:
<s:iteratorvalue="#roleList">
<trclass="TableDetail1 template">
<td>${name} </td>
<td>${description} </td>
<td>
<s:aaction="role_delete?id=%{id}" οnclick="returnconfirm('确定要删除吗?')">删除</s:a>
<s:aaction="role_editUI?id=%{id}">修改</s:a>
<s:aaction="role_setPrivilegeUI?id=%{id}">设置权限</s:a>
</td>
</tr>
</s:iterator>
如果为<s:iterator>标签指定status属性,即每次迭代时都会有一个IteratorStatus实例,该实例的方法有:
Int getCount():返回当前迭代了几个元素;
Int getIndex():返回当前元素的索引;
Boolean isEven(): 当前元素的索引是否是偶数;
Boolean isFirst():当前元素是否是第一个元素;
Boolean isLast():当前元素是否是最后一个元素;
Boolean isOdd():当前元素的索引是否是奇数;
Sort标签 指定集合元素进行排序,进行排序时是=时,必须提供自己的排序规则,即实现自己的comparetor,自己的Comparetor需要实现java.util.Comparetor接口,属性有:
. Comparetor:该属性指定进行排序的comparetor实例。
. Source:该属性指定排序的集合。如果不指定该属性,则对ValueStack栈顶的集合进行排序。
集合合并标签:append和merge,将多个集合合并成一个集合
注:merge属性和append相同,结果的组织不一样
字符串分割标签:generator,将一个字符串按照指定分隔符分割成一个字符串数组
b. 数据标签
用于提供各种数据范文相关的功能,包含显示一个Action里的属性,以及生成国际化输出等功能。
- 设置变量标签 set
将一个值赋给指定范围内变量。Set标签在某些情况下比较有用,例如在页面中多次引用一个复杂的表达式,我们可以将这个表达式赋给一个变量,然后直接引用该变量,带来的好处:
- 提升了性能,
- 提供了代码的可读性
- 栈顶置值标签push
将某个值置于值栈的顶部,标签结束后,将从值栈中移除。
- javabean创建标签bean
用于创建javabean的实例,如果设置了var值,则存于StackContext中,标签结束后自动移除
例如:
<s:beanname="com.aptech.entity.Student"var="stu">
<s:paramname="sid">1</s:param>
<s:paramname="sname">张三</s:param>
<s:paramname="sbirthday">2009-9-9</s:param>
</s:bean>
- 资源包含标签include
用于将一个html、jsp或servlet包含到当前页面中,使用param传递参数
- URL生成标签
生成URL地址,可以通过param标签传递请求参数,如果参数为中文,自动编码
- 数据输出标签property
用于输出值栈(Stack Context)中的对象的属性值,使用value指定要输出的值,如果输出值栈中的值,不用#,如果省略value,表示取出值栈的栈顶对象输出。
c. Ajax标签
需要在jsp页面中添加以下引用:
<%@ taglib prefix="sx"uri="/struts-dojo-tags"%>
d. 表单标签
表单标签的name和value属性,name属性除了为html表单元素指定名称之外,它还映射到action的属性。
在大多数情况下,name属性映射到一个简单的javaBean属性,例如,name属性为userName,在表单提交后,Struts2框架会调用Action的setUserName()方法来设置属性。 如果希望在表单元素中显示Action属性的数据,为value属性指定表达式"%{userName}",这时会调用Action的getUserName()方法,并在表单中显示返回的数据。 之后,可以编辑这个值,然后重新提交他。
form标签
- 通常情况下,当前输出表单的请求和提交表单的请求属于同一个命名空间,例如请求:/ItcastOAsys/user_loginUI.action输出的表单,命名空间会被假设为ItcastOAsys,因此在使用form标签时,可以不使用namespace属性,如下:
<s:formaction="user_login" focusElement="loginNameInput">
</s:form>
如果输出表单的请求和提交表单的请求属于不同的名称空间,可以通过namespace属性指定处理表单提交的action所属的名称空间。
- 如果通过action的一个非execute方法输出表单,然后将表单提交给action默认的execute方法执行,那么form标签的action属性可以忽略。
- Method 和enctype是HTML form标签的属性
- form标签的validate属性设为true,将自动生成客户端的JavaScript验证代码
textarea标签:输出一个HTML多行文本输入控件
reset标签: 输出一个重置的按钮,与form标签一起使用,用来提供表单的重置
………
Struts2的非表单标签包括下列标签:component、 a、actionnerror、actionmessage、filederror