文章目录
Struts2 标签是干什么的
Struts2 自己定义的标记库,专门用于访问 ValueStack,查看 ValueStack 中的内容。
使用 Struts 标签之前,在 JSP 中需要添加相关的指令来导入标签库:
<%@ taglib uri="/struts-tags" prefix="s" %>
Struts2 标签可以使用在哪里
Struts2 标签都是结合 OGNL 表达式一起使用的。
Struts2 标签只能用于 JSP 文件中,不可以在 XML 和 HTML 文件中使用。
Struts2 标签中不能使用 EL 表达式。
常用的标签
s:property
<s:property value="name"/>
value 属性值是 ognl 表达式,该标签的底层是执行如下的代码:
String name = Ognl.getValue("name", root).toString();
out.print(name);
<s:property/>
标签表示到 ValueStack 中的 root 对象获取 name 属性值,并输出到页面中。
s:iterator
<s:iterator value="projects" var="pro">
“projects” 是 ognl 表达式,底层是执行下面的代码来获取到对应的属性值:
List projectList = (List)Ognl.getValue("projects",root);// root是CompoundRoot对象,其实就是一个集合对象,数据的存取遵循“栈”规则
OGNL 引擎从 root 的栈顶开始查找含有 projects 属性的对象,找到后就不会继续往下查找,然后调对象的 getProjects()
方法获取到对应的属性值,其实就是一个集合对象。
接着开始遍历集合 projects,循环取出集合中的元素。将取出的元素(Project 对象)压入 root 栈顶,同时以 pro 为 key 值存放在 context 对象中(这是 ValueStack 的另一个属性,是 Map 结构),那么要访问 context 中的这个元素,ognl 表达式的格式为 #pro
。不仅如此,还会以 pro 为属性名将取出的元素绑定到 PageContex 对象中。
当取出集合中的第二个元素时会将之前压入 root 栈顶的对象先弹出再压入 root 的栈顶,同时又以 pro 为 key 值将第二个元素存入 context 中,那么之前的就会被覆盖掉。
这些数据状态可以通过 <s:debug/>
标签来记录获知!!
我们一起来分析下面的标签语句:
<s:iterator status="stus" value="projects" var="pro">
<s:property value="#stus.count"/>
<s:property value="name"/>
<s:property value="#pro.name"/>
${pro.name}
${name}
</s:iterator>
属性 status 用来指定一个状态对象,该对象有以下的属性:
index:被遍历元素的下标
count:统计遍历的次数
first:
even(奇数):
odd(偶数):
其中的 status 属性就是用来指定状态对象的,其值就是 ognl 表达式,可以找到存储在 context 对象中的状态对象,所以访问状态对象的相关属性,需要加上 #
,例如:#stus.count
。
其中的 value 属性用来指定被遍历的集合对象,其值就是 ognl 表达式,通过该表达式可以获取到被遍历的集合对象,实际是到 ValueStack 对象中的 root 对象中查找。
其中的 var="pro"
,表示迭代遍历的时候会以 pro 为绑定名将遍历出来的对象绑定到 PageContext 对象和 ValueStack 的 context 对象中。
其中的 <s:property>
标签的 value 属性值是 #stus.count
,表示到 ValueStack 对象中的 context 对象查找属性 stus,找到后再获取 count 属性值,标签 <s:property/>
就是将最终获取到值输出到页面中。
其中的 <s:property>
标签的 value 属性值是 name
,表示到 ValueStack 对象中的 root 对象查找属性 name,找到后获取 name 的值并输出到页面中。遍历处理的 Project 对象都会压入 root 栈顶,所以可以到 root 对象中获取 Project 对象的 name 属性值。
其中的 <s:property>
标签的 value 属性值是 #pro.name
,表示到 ValueStack 对象中的 context 对象查找属性 pro,找到后再获取 name 属性值,标签 <s:property/>
就是将最终获取到值输出到页面中。
其中的 ${pro.name}
el 表达式是去 PageContext 对象中找到绑定名为 pro 的对象,找到后获取该对象的 name 属性值,并输出到页面中。
其中的 ${name}
el 表达式是取 ValueStack 的 root 对象中查找 name 属性,找到后将属性值输出到页面中。这个特性是因为 Struts2 对 el 表达式进行了改进才得以实现的。
s:select
<s:select value="list" listKey="id" listValue="name" headerKey="-1" headerValue="填写新地址">
</s:select>
这个struts2标签很有意思,最后生成1个下拉选择框,是根据list这个集合迭代生成各个Option对象,这个Option对象的value属性值等于集合取出来的对象的id属性值,Option对象的text属性值等于集合取出来的对象的name属性值,并且这个下拉选择框的头1个Option对象的value属性值等于headerKey的值,text属性值等于headerValue的值。