1.概述
1.1.是一种功能强大的表达式, 一般和struts2标签一起使用,用来操作值栈
1.2.不是struts2的一部分,但经常一起使用
1.3.使用时需要导入jar包,struts2有提供
1.4.值栈的概念:
<1> struts2本身提供的一种存储机制,类似于域对象,可以存取值
<2> 一般在action中把数据存放至值栈,在前端页面获取
<3> 每次访问action都会创建action对象,每个action对象中都有且仅有一个值栈对象
<4> 值栈对象有多种获取方式,常用ActionContext类中的方法获取
<5> 内部结构:
root部分:list集合结构
context部分:map集合结构
2.基本操作
2.1 前端页面导入标签库
<%@ taglib uri="/struts-tags" prefix="s" %>
*入门案例:显示字符串长度:
<s:property value='"hahahahah".length()'/>
2.2 查看值栈结构和存储值
<s:debug/>
2.3 从值栈存取数据
(1). 存取字符串/对象
向值栈放入字符串/对象:
public class OGNL_one extends ActionSupport {
private User user=new User();
public User getUser() {
return user;
}
public String execute(){
user.setUaddr("add");
user.setUname("kin");
return "success";
}
}
前端用struts2+ognl表达式获取:
<s:property value="user.uname"/>
<s:property value="user.uaddr"/>
(2).存取list集合
向值栈放入list:
public class OGNL_one extends ActionSupport {
private List<User> list=new ArrayList<User>();
public List<User> getList() {
return list;
}
public String listSet(){
User user1=new User();
user1.setUname("甲");
user1.setUaddr("城东");
user1.setUtime("noon");
list.add(user1);
User user2=new User();
user2.setUname("乙");
user2.setUaddr("城西");
user2.setUtime("dawn");
list.add(user2);
return "success";
}
}
前端获取:
<!--
方法一:
枚举
-->
<s:property value="list[0].uname"/>
<s:property value="list[0].utime"/>
<s:property value="list[0].uaddr"/>
<br/>
<s:property value="list[1].uname"/>
<s:property value="list[1].utime"/>
<s:property value="list[1].uaddr"/>
<!-- ... -->
<br/>
<!--
方法二:
遍历list得到集合中每个user对象
-->
<s:iterator value="list">
<s:property value="uname"/>
<s:property value="utime"/>
<s:property value="uaddr"/>
<br/>
</s:iterator>
<!--
方法三:
遍历list集合,获取每一个user对象
将遍历得到的user放到值栈的context中,以var命名
用ognl表达式获取context中数据,使用特殊符号"#"
-->
<s:iterator value="list" var="u">
<s:property value="#u.uname"/>
<s:property value="#u.utime"/>
<s:property value="#u.uaddr"/>
<br/>
</s:iterator>
*struts2标签无法识别ognl表达式,直接在struts2表单标签中使用ognl表达式应在前加%注明
例:在struts2标签中用ognl表达式获取request域中的值
HttpServletRequest request=ServletActionContext.getRequest();
request.setAttribute("req","reqValue");
key的名称对应域的名称request
<s:textfield name="username" value="%{#request.req}"/>
(3).set、push方法
直接使用值栈对象里面的方法步骤:
I.获取值栈对象
II.调用set/push方法
//获取值栈对象
ActionContext context=ActionContext.getContext();
ValueStack stack=context.getValueStack();
//调用set方法
stack.set("test","testvalue");
//调用push方法
stack.push("WOWOWOWOW~");
前端获取:
set方法以名称-值的键值对方式存入值栈
前端根据名称获取值
<!--获取set方法设置值-->
<s:property value="test"/>
push方法设置值,没有名称
值栈放数据都存储在top数组里,根据数组获取值
<!--获取push方法设置值-->
<s:property value="[0].top"/>
*top原理为栈,元素先进后出
例如先后push数据A、B,前端获取[0].top,[1].top,结果为B,A