将对象直接存储到ValueStack / ActionContext的目的是什么?

时间:2015-02-26 23:18:42

标签: spring struts2 ognl valuestack actioncontext

根据我所研究的内容,我发现<s:set><s:push>或创建<s:bean>等标记可以直接插入引用ActionContextValueStack。这让我很困惑,因为为什么你不能只有一个专门存放一切的地方?可能只是将所有内容都放在ActionContext中,因为它基本上只是ServletContext

为了让它更加令人困惑,如果您想要访问ValueStack中的值,您必须使用Struts标记,例如<s:property>,但如果值只是{}存储在ActionContext中,您只需使用OGNL提供的#value前缀。

有人可以帮我解决这个问题吗?当我使用Spring时,我相信我需要的所有内容(请求,会话,applicationContext)都在ServletContext内,并且要在我的网页上访问这些值,我可以使用$前缀来访问其中的任何内容上下文。

1 个答案:

答案 0 :(得分:0)

每个地方都有自己的专用存储空间,您可以将对象放在某个调用上下文中以供以后使用/检索。无论运行什么上下文,框架都是相关联的。上下文是在其中使用Java或其他表达式语言(EL)(如OGNL)访问的范围内对象之间进行通信的方式。

在OGNL中,操作上下文是OGNL上下文,值堆栈是根。

  

框架将OGNL上下文设置为我们的ActionContext,并且   值栈是OGNL根对象。 (值堆栈是一组   几个对象,但对于OGNL它似乎是一个单一的对象。)沿   使用值栈,框架将其他对象放在   ActionContext,包括代表应用程序的地图,会话,   并请求上下文。这些对象在ActionContext中共存,   与价值堆栈(我们的OGNL根)一起。

ActionContextThreadLocal,因此您可以在一个帖子中使用它。从这个线程获取动作上下文/值栈的最好方法是使用静态方法。

ActionContxt ctx = ActionContext.getContext();
ValueStack vs = ctx.getValueStack();

拦截器也传递了一个参数,称为调用上下文,它是动作上下文。

值栈也有自己的上下文,验证有自己的上下文。所以,这些定义永远不会结束。