一看到值栈我们应该想到的关于值栈的问题
0什么是值栈,为什么使用值栈
1 .值栈的内存结构
2.值栈的生命周期
3.如何获取值栈
4.如何向值栈中存数据,取数据
5.因为数据在值栈中,如何保存数据安全性
下面我们就根据这几个问题来看看值栈:
0.什么是值栈
在servlet中,一般处理数据我们会把数据放到request域,session,application域中,通过el表达式取值即可
在struts2中如何处理这些数据呢,这就用到了值栈.值栈的作用:保存数据,采用ognl表达式显示
1.值栈的内存结构:
(ValueStack是一个接口 OgnlValueStack为接口的实现类)context root为重点
我们先看看值栈的内存结构
这里有两处重要,第一处是root块,我们把它叫做对象栈;
下一处是context,我们把它叫做map栈;
我们看map栈可以观察到,map栈中又出现了_root,而它对象栈,那我们可以认为map栈同时保存了对象栈的内容,而且是同步更新的.
-----------------------------------------------------------------------------------------------------------------
我们再看看值栈的内存结构示意图:
说明:
1 为什么会有两个root
通过OgnlContext可以得到所有内容,所以会有两份,方便以后通过ognl表达式来取值
2 valuestack中的root和ognl中的_root 应该保持数据的同步
2值栈的生命周期
值栈的生命周期就是一次请求和响应,这个不多说.
3.如何获取值栈
第一种:ActionContext.getContext().getValueStack();
第二种:ServletActionContext.getValueStack(ServletActionContext.getRequest());
第三种:ServletActionContext.getRequest().getAttribute("struts.ValueStack");
一次请求只有一个valuestack
4.如何向值栈中存数据,取数据
值栈分为对象栈和map栈,那么我们就分开来说对象栈和map栈.
对象栈:
存数据:
ValueStack valuestack = ActionContext.getValueStack();
valueStack.getRoot().add("jain");//将值加到list最后
valueStack.getRoot().add(0,"jain");//将值加到list顶部
ActionContext.getContext().getValueStack().push("jian");//将值加到list顶部
ActionContext.getContext().getValueStack().set("key","value");//把key和map作为map对象放入到栈顶
ActionContext.getContext().getValueStack().setValue("key","value");
//把对象栈中改变属性的值,所以,当请求的action在对象栈的时候,action中的属性直接暴露在对象栈中,并且可以随意改变该属性的值(必须有getset方法)
取数据:
获得栈顶元素的值
valueStack.getRoot().get(0);
valueStack.getRoot().peek();
valueStack.pop();//移除栈顶元素
ActionContext.getContext().getValueStack().get("name");//获得对象栈中name元素的值
map栈:
可以将值放入域中,或者直接放入map栈中:
将数据放入map(request session application page)
为什么struts会有servletActionContext这个类?
就是struts2与servlet通信的接口,如果在Action的方法中准备两个参数req rep 就是导致耦合性很高,不好单元测试,action为了与servlet交互,并且还要与servlet容器松耦合,所以采用了servletActionContext这种方式与servlet交互
将值放入在域中:
ServletActionCOntext.getRequest().setAttribute("aa","aaa");
ServletActionContext.getRequest().getSession().setAttribute("bb","bbb");
ServletActionContext.getServletContext().setAttribute("cc","ccc");
将值直接放入map栈中
valueStack.getCOntext.put("aaa","aaaa");
ActionContext.getContext.put("as","asa");(常用)
5.因为数据在值栈中,如何保存数据安全性
查看我的博客中有一篇文章为当用户通过url请求时,struts2需要做的事情中介绍到当用户发送request请求时,struts2会把valuestack放入当前用户线程的map中,而且一次请求响应结束后,值栈生命周期就会结束,所以保证了值栈的安全性