Struts2 标签是干什么的Struts2 标签可以使用在哪里常用的标签
s:propertys:iterators:selects:if
Struts2 标签的官方在线说明文档:https://struts.apache.org/tag-developers/tag-reference.html Struts2 标签是干什么的
Struts2 自己定义的标记库,专门用于访问 ValueStack,查看 ValueStack 中的内容。
使用 Struts 标签之前,在 JSP 中需要添加相关的指令来导入标签库:
<%@ taglib uri="/struts-tags" prefix="s" %>
Struts2 标签可以使用在哪里Struts2 标签都是结合 OGNL 表达式一起使用的。
Struts2 标签只能用于 JSP 文件中,不可以在 XML 和 HTML 文件中使用。
Struts2 标签中不能使用 EL 表达式。
常用的标签 s:propertyvalue 属性值是 ognl 表达式,该标签的底层是执行如下的代码:
String name = Ognl.getValue("name", context, root).toString();out.print(name);
ognl 表达式中以 # 开头,表示访问 ValueStack 中的 context 对象,获取 name 属性值,并输出到页面中。
如果省略 value 属性,则默认将 root 栈顶的第一个对象取出,直接输出到页面中。
JSP 的代码如下:
<%@ page import="java.util.*" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="/struts-tags" prefix="s" %>
访问 JSP 文件得到如下的结果:
value 属性值中还可以进行字符串拼接:
先从 ValueStack 对象中获取 name 的属性值,然后和字符串“java”拼接,最后输出到页面中。
value 属性值中可以调用方法:
先从 ValueStack 对象中获取 arry 的属性值,其实是一个字符串数组,接着获取下标索引为 1 的元素,接着调用该元素对象的 toUpperCase() 方法,最后将结果值输出到页面中。
s:iterator“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 中,那么之前的就会被覆盖掉。
这些数据状态可以通过
我们一起来分析下面的标签语句:
属性 status 用来指定一个状态对象,该对象有以下的属性:
index:被遍历元素的下标
count:统计遍历的次数
first:
even(奇数):
odd(偶数):
其中的 status 属性就是用来指定状态对象的,其值就是 ognl 表达式,可以找到存储在 context 对象中的状态对象,所以访问状态对象的相关属性,需要加上 #,例如:#stus.count。
其中的 value 属性用来指定被遍历的集合对象,其值就是 ognl 表达式,通过该表达式可以获取到被遍历的集合对象,实际是到 ValueStack 对象中的 root 对象中查找。
其中的 var="pro",表示迭代遍历的时候会以 pro 为绑定名将遍历出来的对象绑定到 PageContext 对象和 ValueStack 的 context 对象中。
其中的
其中的
其中的
其中的 ${pro.name} el 表达式是去 PageContext 对象中找到绑定名为 pro 的对象,找到后获取该对象的 name 属性值,并输出到页面中。
其中的 ${name} el 表达式是取 ValueStack 的 root 对象中查找 name 属性,找到后将属性值输出到页面中。这个特性是因为 Struts2 对 el 表达式进行了改进才得以实现的。
Action 对象有属性 projects,这个属性值是一个集合对象,从集合遍历出来的 project 对象会压入 ValueStack 的 root 对象中,所以可以通过 el 表达式直接获取 project 对象的属性值。
上述的 el 表达式也可以替换成
这个struts2标签很有意思,最后生成1个下拉选择框,是根据list这个集合迭代生成各个Option对象,这个Option对象的value属性值等于集合取出来的对象的id属性值,Option对象的text属性值等于集合取出来的对象的name属性值,并且这个下拉选择框的头1个Option对象的value属性值等于headerKey的值,text属性值等于headerValue的值。
s:if 这个标签对应于 jstl 的
Struts2 的
属性 test 的值是 ognl 表达式,表达式 page > 1 会先获取 page 的值,然后和 1 进行比较,成立则返回 true,test="true" 则会将
对应的 jstl 的