在早期的web开发中,jsp视图控制和显示技术主要依靠java脚本实现的,这样一来,jsp页面嵌入了大量的java脚本代码,维护起来极为困难。从jsp1.1规范后,JSP增加了自定义标签库的支持,标签库是一种组件技术,通过标签库,可以将复杂的java脚本代码封装在组件中,开发者只需要使用简单的java代码就可以实现复杂的java脚本功能,提高了开发者的开发效率。
Struts2标签库的分类
主要分为以下三类:
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}" onclick="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标签在某些情况下比较有用,例如在页面中多次引用一个复杂的表达式,我们可以将这个表达式赋给一个变量,然后直接引用该变量,带来的好处:
将某个值置于值栈的顶部,标签结束后,将从值栈中移除。
用于创建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>
用于将一个html、jsp或servlet包含到当前页面中,使用param传递参数
生成URL地址,可以通过param标签传递请求参数,如果参数为中文,自动编码
用于输出值栈(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标签
<s:formaction="user_login" focusElement="loginNameInput">
</s:form>
如果输出表单的请求和提交表单的请求属于不同的名称空间,可以通过namespace属性指定处理表单提交的action所属的名称空间。
textarea标签:输出一个HTML多行文本输入控件
reset标签: 输出一个重置的按钮,与form标签一起使用,用来提供表单的重置
………
Struts2的非表单标签包括下列标签:component、 a、actionnerror、actionmessage、filederror