根据我所做的研究,我发现诸如<s:set>、<s:push>或通过创建<s:bean>之类的标签能够直接插入对ActionContext或ValueStack的引用。这让我很困惑,因为为什么你就不能有一个专门的地方来存储所有的东西呢?可能只是将所有内容都放在ActionContext中,因为它基本上充当了一个ServletContext。
更令人困惑的是,如果您想访问ValueStack中的值,则必须使用<s:property>等Struts标记,但如果值只是存储在ActionContext中,则只需使用OGNL提供的#value前缀即可。
有人能帮我把这个弄清楚吗?当我使用Spring时,我相信我需要的一切(请求、会话、applicationContext)都在ServletContext中,要在我的网页上访问这些值,我可以只使用$前缀来访问上下文中的任何内容。
发布于 2015-02-27 22:14:17
每个地方都有自己的专用存储,您可以将您的对象放在这些存储中,以供以后在某个调用上下文中运行时使用/检索。无论运行什么上下文,框架都是关联的。上下文是在其中限定作用域的对象之间进行通信的方式,您可以使用Java或其他表达式语言(EL) (如OGNL )进行访问。
在OGNL中,操作上下文是OGNL上下文,值堆栈是根。
框架将OGNL上下文设置为我们的ActionContext,并将值栈设置为OGNL根对象。(值堆栈是几个对象的集合,但对于OGNL,它看起来像是一个对象。)除了值堆栈,框架还在ActionContext中放置了其他对象,包括表示应用程序、会话和请求上下文的Map。这些对象在ActionContext中与值堆栈(我们的OGNL根)并存。
ActionContext是ThreadLocal,所以您可以在一个线程中使用它。从这个线程获取操作上下文/值堆栈的最好方法是使用静态方法。
ActionContxt ctx = ActionContext.getContext();
ValueStack vs = ctx.getValueStack();拦截器还传递了一个参数,称为调用上下文,这是操作上下文。
值堆栈也有自己的上下文,验证也有自己的上下文。因此,这些定义永远不会结束。
https://stackoverflow.com/questions/28754698
复制相似问题