struts2中ValueStack生命周期是跨应用程序吗?
-
15-11-2019 - |
题
我可以设置一个属性 ValueStack
在几个方面。
ValueStack stack = ActionContext.getContext().getValueStack();
stack.getContext().put("resultDTO",resultDTO); //1. creates a different branch
//parallel to root
stack.set("resultDTO", resultDTO); //2. pushes on root as a Map?
stack.push(resultDTO); //3. pushes on root
myActionClass.setProperty(); //4. normal action accessor
我需要能够在 JSP、freemarker 和 java 中获取所有这些值
stack.findValue() or stack.findString().
我想了解一下这4种设置方法的生命周期。是否跨应用。是个 价值栈 创建每个请求并为每个请求设置应用程序和会话值?
我知道第四种方法是最常见的方法,但我可能不会在所有不易访问操作类的地方使用它。
我对JSP中访问还有一个疑问
<s:push value="resultDTO" ><s:property value="data.form1[0]" /></s:push>
<!--5.works for context.put() & stack.set() both-->
<s:property value="#resultDTO.data.form1[0].countryofissue" /> <!--6.context.put()-->
<s:property value="resultDTO.data.form1[0].countryofissue" /> <!--7.stack.set()-->
<s:property value="data.form1[0].countryofissue" /> <!--8.stack.push()-->
我还想知道第五点在这两个方面是如何工作的 stack.getContex().put()
和 stack.set()
?据我了解,在 6 日 结果DTO 我正在访问的是一个不同的根,在第七个中,它是默认根的子项,即 ValueStack。第八步开始从默认根目录开始搜索。
我经历了 http://struts.apache.org/2.0.11.1/docs/ognl.html, http://struts.apache.org/2.1.2/struts2-core/apidocs/com/opensymphony/xwork2/util/ValueStack.html 并且这个链接相当混乱 http://www.opensymphony.com/ognl/html/DeveloperGuide/introduction.html#embeddingOGNL
说了这么多我不太倾向于使用 stack.getContext().put()
方法,因为我可以通过将 url 设置为来清楚地看到其中的值 ?调试=浏览器. 。如果我做错了,请告诉我。
解决方案
这 ValueStack
是每个请求。如果将值放在堆栈上,则可以稍后在请求中(即在视图层中)访问它们,但无法在重定向中幸存,这将是一个新的 HTTP 请求并拥有自己的 ValueStack
.
在正常情况下,URL 或表单帖子中的参数将使用操作的 setter 方法在操作上设置。在拦截器中,您可以直接将值添加到堆栈中。例如, ExceptionMappingInterceptor
使用 stack.push(Object)
发布异常以在错误页面上使用的方法。
stack.getContext().put(String, Object)
-- 将键/值放入位于堆栈中的映射中。该映射代表堆栈的上下文。stack.set(String, Object)
-- 将键/值放入位于堆栈中的映射中。我不确定这与之前的方法有何关系,除了它是不同的地图之外。stack.push(Object)
-- 这会将对象放置在堆栈的根部。
您不需要从视图层内将任何内容放置在堆栈上,所以我很好奇您想要做什么需要这样做。