struts2数据存储通过值栈方式,数据获取ognl+struts2标签
1.值栈valueStack
ValueStack值栈是struts2提供接口规范,也提供了一个接口实现OgnlValueStack
- Action的生命周期:
创建:每次访问都创建Action
销毁:响应结束Action销毁 - 值栈的生命周期:(类似与request) (重点)
值栈生命周期与Action同步
2.值栈对象何时创建?ValueStack 和 ActionContext是什么关系
- 每次访问都会创建值栈对象
- ActionContext是Action的上下文对象,该对象内部维护着值栈对象的引用
3.获取值栈的方式
通过ACtionContext获得值栈对象(重点):
ActionContext actionContext = ActionContext.getContext();
ValueStack valueStack=actionContext.getValueStack();通过request域对象获得值栈对象(了解):
ValueStack valueStack = (ValueStack)request.getAttribute(“struts.valueStack”);
4.手动向值栈存值
- 向Root栈存储数据
//获得Root栈
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
CompoundRoot root = valueStack.getRoot();
//压栈
root.push("xxxx"); //压到list的头部 add(0, "xxxx");
//取值栈顶的信息 (list的头部 角标为0位置)
Object peek = root.peek(); //return get(0);
//弹栈
Object pop = root.pop(); //return remove(0);
2.向context栈存储数据
//获得context栈
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
//获得值栈内部的context栈
Map<String, Object> map = valueStack.getContext();
//存储数据
map.put("aaa", "AAA");
valueStack对象直接操作值栈的API(重点)
//都是存储到root栈的api
valueStack.push()
valueStack.set()
//获取值,从栈顶以此匹配map的key或者对象的属性名 只要匹配成功 就不在向下匹配 返回匹配成功的值
valueStack.findValue(key/propertyName);
5.struts2框架会将哪些数据自动保存到值栈中(重点)
struts2标签<s:debug>
可以在页面中查询值栈的全部内容
- 自动将哪些数据存储到root栈
将当前访问的Action对象自动压栈
将当前模型对象自动压栈
目的:方便页面上使用ognl表达式取值 根据propertyName/key取值 - 自动将那些数据存储到context栈(了解)
request对象
response对象
session域
application域
….
6. 如何取值栈的数据 (Ognl+struts2标签)(重点)
- 取出普通数据
<s:property value="ognl表达式"/>
<h1>取出模型对象的name</h1>
<s:property value="name"/>
<h1>取出user实体的name</h1>
<s:property value="user.name"/>
<h1>取出集合userList中的name</h1>
<s:property value="userList[0].name"/>
- 取出集合数据(遍历)
该标签自动将集合中的每一个元素临时在Root栈顶存储一份
<s:iterator value="userList">
<s:property value="name"/> == <s:property value="age"/> <br/>
</s:iterator>
<h1>遍历userList 方法1</h1>
<s:iterator value="userList">
<s:property value="name"/> == <s:property value="age"/> <br/>
</s:iterator>
<h1>遍历userList 方法2 临时的变量名称var</h1>
<!-- 将集合中的元素以指定的名称(var指定的变量名称) 在context存储一份-->
<s:iterator value="userList" var="user">
<!-- #代表从context栈取值 -->
<s:property value="#user.name"/> ==<s:property value="#user.age"/> <br/>
</s:iterator>
- s:if标签
<h1>if判断</h1>
<s:if test="num>5">
大于5
</s:if>
<s:elseif test="num==5">
等于5
</s:elseif>
<s:else>
小于5
</s:else>
7.EL也能访问值栈中的数据原因
${}取值 底层从域中取值 调用request.getAttribute();
原因:request对象的getAttribute()方法被增强