我可以设置一个属性 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) -- 这会将对象放置在堆栈的根部。

您不需要从视图层内将任何内容放置在堆栈上,所以我很好奇您想要做什么需要这样做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top