Struts2 ValueStack如何处理多个请求

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

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

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

  3. ValueStack何时从列表中销毁对象?

  1. 嵌入式对象或者换句话说嵌套bean可以通过它们的访问器或通过在评估OGNL表达式时使用该访问器的OGNL直接访问。 Struts2将一个动作bean放在valueStacktop ,因此动作属性按名称检索,但嵌套bean使用OGNL 表示法解析。 有关OGNL的更多信息,请参阅文档 。

  2. 每个动作实例都有自己的上下文和valueStack ,因此除非在application范围内维护这些值,否则客户端不会相互干扰并拥有自己的值。

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