struts2中的值栈

一看到值栈我们应该想到的关于值栈的问题

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栈同时保存了对象栈的内容,而且是同步更新的.

-----------------------------------------------------------------------------------------------------------------

我们再看看值栈的内存结构示意图:


说明:

为什么会有两个root

通过OgnlContext可以得到所有内容,所以会有两份,方便以后通过ognl表达式来取值

2 valuestack中的rootognl中的_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");//keymap作为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这个类?

就是struts2servlet通信的接口,如果在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,而且一次请求响应结束后,值栈生命周期就会结束,所以保证了值栈的安全性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值