0

根据我的研究,我发现诸如<s:set>,<s:push>或通过创建一个标签<s:bean>能够直接插入对ActionContextor的引用ValueStack。这让我很困惑,因为你为什么不能有一个专门的地方来存放所有东西?可能只是把所有东西都放在里面,ActionContext因为它基本上是作为一个ServletContext.

更令人困惑的是,如果您想访问 中的值,则ValueStack必须使用 Struts 标记,<s:property>但如果值只是存储在 中ActionContext,则只需使用#valueOGNL 提供的前缀。

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

4

1 回答 1

0

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

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

该框架将 OGNL 上下文设置为我们的 ActionContext,并将值堆栈设置为 OGNL 根对象。(值栈是几个对象的集合,但对 OGNL 来说,它似乎是一个对象。)除了值栈,框架还将其他对象放在 ActionContext 中,包括表示应用程序、会话和请求上下文的 Maps。这些对象与值堆栈(我们的 OGNL 根)共存于 ActionContext 中。

ActionContext是,因此ThreadLocal您可以在一个线程中使用它。从此线程获取操作上下文/值堆栈的最佳方法是使用静态方法。

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

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

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

于 2015-02-27T14:14:17.400 回答