ValueStack 值栈(功能类似于域对象,存取值)
1. 每一个action 都有且仅有一个值栈,可在action中存值,jsp中取值
2. **获取值栈**:
**先得到 ActionContext,然后再 getValueStack();**
3. 内部结构分为2部分:
1. root 结构是list集合(常用)
2. context map集合
map集合中的key都是固定值,value放的都是对象的引用值
key有:Request,session,application,parameters,attr
value: Request,session,ServletContext,传递参数,获取域对象中的值(优先获取最小范围的域)
4. 使用struts2 标签 <s:debug> 查看值栈结构(在action返回值配置的jsp中设置)
**1. 在action中没有做任何操作,栈顶元素就是该action的引用**
5. 向值栈中 **存放** 数据方式:
1. 获取值栈对象,调用值栈的set(String name,String value)方法, 值栈会生成一个HashMap对象存这个数据,然后再将hashmap引用放入值栈的list集合中
2. 获取值栈对象,调用值栈的push(Object value)方法,然后生成该对象的引用放入值栈的list集合中
3. **在action中定义变量/声明对象并new,生成变量/对象的get()方法**
这样就把这个数据存到了action里面,减少了空间浪费
6. 从值栈中** 获取数据**
在jsp中使用Ognl+Struts2标签 获取数据
<s:property value="username"/>
到action中找到名称一致的属性(username),然后调用该属性的get方法,就得到了
对象的值获取:
<s:property value="user.username"/>
先到action中找到对象(user)的get方法,然后再调用对象里面的属性(username)的get方法,来获取到值
List集合数据 <s:property value = list[0].username /> list中的第一个对象
<s:property value = list[1].username /> list中的第二个对象
或者配合struts标签 <s:iterator value="list">
<s:property value="username">
</s:iterator>
就是先获取到list集合,遍历,每次都得到了user对象,所以直接取值username就可以了
7. EL表达式+Jstl标签,也可以做到 在jsp中获取值栈数据(性能低,不建议)
>原因:底层增强了request.getAttribute()方法,如果从request域中无法取到值,那就从值栈中取值,把值栈的值放到request域中,这样EL表达式就可以取出来了
8. Ognl表达式与struts 标签
1. ognl 的 # 使用: 通常用于取 值栈中context里的值
>context里主要就是域对象(request,session,servletContext),也就是说取 域对象的值,需要加上# 符号
2. 在struts**表单** 标签中 需要 在ognl表达式前 使用 $ , 否则 无法识别ognl表达式