根据我所研究的内容,我发现<s:set>
,<s:push>
或创建<s:bean>
等标记可以直接插入引用ActionContext
或ValueStack
。这让我很困惑,因为为什么你不能只有一个专门存放一切的地方?可能只是将所有内容都放在ActionContext
中,因为它基本上只是ServletContext
。
为了让它更加令人困惑,如果您想要访问ValueStack
中的值,您必须使用Struts标记,例如<s:property>
,但如果值只是{}存储在ActionContext
中,您只需使用OGNL提供的#value
前缀。
有人可以帮我解决这个问题吗?当我使用Spring时,我相信我需要的所有内容(请求,会话,applicationContext)都在ServletContext
内,并且要在我的网页上访问这些值,我可以使用$
前缀来访问其中的任何内容上下文。
答案 0 :(得分:0)
每个地方都有自己的专用存储空间,您可以将对象放在某个调用上下文中以供以后使用/检索。无论运行什么上下文,框架都是相关联的。上下文是在其中使用Java或其他表达式语言(EL)(如OGNL)访问的范围内对象之间进行通信的方式。
在OGNL中,操作上下文是OGNL上下文,值堆栈是根。
框架将OGNL上下文设置为我们的ActionContext,并且 值栈是OGNL根对象。 (值堆栈是一组 几个对象,但对于OGNL它似乎是一个单一的对象。)沿 使用值栈,框架将其他对象放在 ActionContext,包括代表应用程序的地图,会话, 并请求上下文。这些对象在ActionContext中共存, 与价值堆栈(我们的OGNL根)一起。
ActionContext
是ThreadLocal
,因此您可以在一个帖子中使用它。从这个线程获取动作上下文/值栈的最好方法是使用静态方法。
ActionContxt ctx = ActionContext.getContext();
ValueStack vs = ctx.getValueStack();
拦截器也传递了一个参数,称为调用上下文,它是动作上下文。
值栈也有自己的上下文,验证有自己的上下文。所以,这些定义永远不会结束。