值栈
1.What:
Struts提供的一个域,对应ValueStack类型,作用在于存储数据,实现action到jsp的数据交互。故其重点为存入数据和读出数据。
作用:管理一次请求有效的数据
优点:与视图层(view层)解耦和。通常我们使用的视图层多为jsp,但视图层并不只有jsp可以实现,还有诸如freemaker和velocity等其他技术,若某一项目前期使用的是jsp+el+jstl标签,若后期访问量和并发不断增多,想要提高web的效率和访问速度,可能会使用以上两种模板技术来进行迭代,但由于jsp多和el、jstl标签配合使用,而以上两种技术又不支持el、jstl,就是更换技术很麻烦,但他们都支持值栈和struts标签,故达到了解耦和的效果。
2.使用:
• 在action中向值栈存入数据。
需要ognl找到对应位置,将数据存入
• 在view层中从值栈中获取数据
需要ognl找到对应位置之后将数据取出。
3.获取方式:
语法:
ValueStackvs = ActionContext.getContext().getValueStack(); //获取值栈
vs.setValue(“ognl”, object); //向ognl指定位置取值
vs.findValue(“ognl”); //想ognl制定的位置存值
注意:其中使用的ognl相关不是原生的ognl,而是经过struts2封装过后的ognl
4.内部存储结构
(1)综述:
(2)context区域:本质上,是一个map
Key value
Request map1 等价于request作用域底层的map
Session map2 等价于session作用域底层的map
Application map3 等价于application作用域底层的map
等价的意思为:数据严格同步
作用:可以通过valuestack统一对三大作用域进行操作
代码示例:
public String vs1(){
ValueStackvs = ActionContext.getContext().getValueStack();
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("username", "zhnagsan");
String username = (String)vs.findValue("#session.username");
System.out.println("username:"+username);
vs.setValue("#request.passwd", "123456");
HttpServletRequest request = ServletActionContext.getRequest();
String passwd = (String)request.getAttribute("passwd");
System.out.println("passwd:"+passwd);
return "vsok";
}
(3)Root区域:
此处多放置当前action的对象以及struts标签处理的结果
5.思考:
Valuestack是一次请求有效,为什么可以管理session和application作用域???
原来,值栈并不是直接管理session,而是间接的通过session来管理session.这句话可能有语病,但要表达的意思是对的.值栈相当于一个存放数据的空间,假设其本身就是一个java类,里面有的那些request,session,等,其实只是拿了一个引用,通过这个引用使用session来管理session,这样,值栈的生命周期结束了,也仅仅是代表这个值栈失去了对session的引用,除非再它持有这个引用时,调用session的销毁方法,否则这个值栈的生命周期与session并无任何关系。