关于struts2中直接操作作用域和操作值栈的对比以及值栈的理解

 注:参考文章:https://www.cnblogs.com/bamaw/p/7259232.html

 自从初学struts2框架以来,时常和值栈打交道。

值栈究竟是什么,对于我们使用者来说值栈是一个非常方便的东西,很形象的可以称其为“数据中转站”。

为什么会有这种叫法呢,因为我们用struts2框架对数据进行操作时,我们会向值栈存入一些数据,再从值栈中取出一些数据并进行操作。

但是,在struts2框架这个重量级框架中,其实我们的数据都是会一式三分,总会有一份放入作用域中,所以为什么我们不直接操作作用域呢?这样不是更加容易上手吗?

对于框架而言,我们要使用他,我们就需要遵守他的标准,我们既然使用了struts2框架,我们就需要遵守他的规范。在struts2框架中,我们可以在Action中通过定义同名成员变量来自动的获取存在值栈中的值,这样我们就很方便的省去了操作作用域的一段代码。

而每个Action实例都会对应一个值栈(一个请求对应一个ValueStack对象),也就是说,我们在接受一个action请求的时候,我们会通过核心过滤器首先创建一个ActionContext对象,伴随着创建一个ValueStack对象(具体流程可以自行参看源码),由OgnlValueStack实现类实现。这样看来action实例和值栈几乎是生命周期同步的,即一个请求对应一个action对应一个值栈。

那么,拓展一下,我们在接受请求时创建的值栈是放在哪里的呢?

不难联想到,应该是放在request中的。struts2框架会把值栈对象保存在“struts.valueStack”的请求属性中,也就是说,值栈对象是request的一个属性。

所以我们创建值栈对象时候的手段就会多样化一些,当然最常用的还是:

ActionContext.getContext().getValueStack();

下面两种仅需要了解:

ServletActionContext.getRequest().getAttribute("struts.valueStack");

ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

当然,很明显这两种方法是与Servlet耦合的,所以不推荐使用。

文章主要用于梳理自身知识,如有侵权联系删除。


猜你喜欢

转载自blog.csdn.net/admin_gc/article/details/80470249