Struts2 ValueStack如何处理多个请求

时间:2013-12-06 06:24:27

标签: java jsp struts2 ognl valuestack

我理解在Struts2中引入了ValueStack,并且Struts1模型的另一个更改现在是为每个请求实例化一个新的ActionObject。因此,我们可以定义实例变量而无需担心多线程问题。    拦截器和JSP从ActionObjects访问实例变量的方式是通过ValueStack。但ValueStack实现ValueStack的方式(或至少由Struts2框架使用)是ActionClass。使访问更容易,这样我们就不需要遍历整个对象树。我有以下问题。

  1. 如果我有嵌入对象(多个对象层次结构)怎么办?在这种情况下访问机制如何表现?

  2. 如果让我们说两个客户端同时向同一个肌动蛋白发出请求,并且Action执行的结果不同,因为2个客户端提供的输入返回了2个不同的结果。让我们说我的Action类有一个获得最佳价格的方法,并根据我的后端服务中的逻辑,结果出现在10和12两个不同的请求。现在showResults.jsp有一个名为price的成员变量,其中将存储此值,结果JSP ValueStack将访问此变量(使用标记lib)来显示价格。 struts2框架如何保证client1和client2得到正确的响应,并且在JSP上显示响应时价格不会混乱,因为据我所知,ValueStack只是先进先出(堆栈逻辑)方式。因此,它可能最终会向两个客户端请求返回10,因为相同的变量在值堆栈上存储了两次(具有相同的名称),但具有不同的值。

  3. {{1}}何时从列表中销毁对象?

1 个答案:

答案 0 :(得分:3)

  1. 嵌套对象或换句话说,嵌套bean可以通过其访问者或在评估OGNL表达式时使用该访问者的OGNL直接访问。 Struts2将动作bean放在top的{​​{1}}上,因此动作属性按名称检索,但嵌套bean使用OGNL dot 表示法解析。有关OGNL的更多信息,请参阅documentation

  2. 每个操作实例都有自己的上下文和valueStack,因此客户端不会相互干扰并拥有自己的值,除非值保留在valueStack范围内。

  3. application由调度程序创建并放入操作上下文。它也可以在需要时由一些拦截器重新创建。你不应该担心它的价值,因为它们在行动结束时被摧毁。