我知道ValueStack
是在Struts2中引入的,与Struts1模型相比又有一个变化,现在为每个请求实例化了一个新的ActionObject
。因此,我们可以定义实例变量而不必担心多线程问题。
拦截器和JSP从ActionObjects
访问实例变量的方式是通过ValueStack
。但是ValueStack
的实现方式(或至少由Struts2框架使用)是ValueStack
的方式。使访问更容易,这样我们就不必遍历整个对象树。我有以下问题。
如果我具有嵌入式对象(对象的多个层次结构)怎么办?在这种情况下,访问机制的行为如何?
如果让我们说两个客户端同时向同一肌动蛋白发出请求,并且执行动作的结果是不同的,因为两个客户端提供的输入返回了两个不同的结果。假设我的Action Class有一种方法可以获取最佳价格,并且基于后端服务中的逻辑,对于2个不同的请求,结果分别为10和12。现在ActionClass
有一个名为price的成员变量,该值将存储在其中,并且结果JSP showResults.jsp
将访问此变量(使用标记lib)以显示价格。 struts2框架如何保证client1和client2返回正确的响应,并且在JSP上显示响应时价格不会混乱,因为据我了解,ValueStack
只是采用先进先出(堆栈逻辑)的方式。因此,它可能最终会向两个客户端请求返回10,因为同一变量在值堆栈上存储两次(使用相同的名称),但使用不同的值。ValueStack
何时从列表中销毁对象?
最佳答案
嵌入式对象或换句话说,嵌套的Bean可通过其访问器或通过评估OGNL表达式时使用该访问器的OGNL直接访问。 Struts2在top
的valueStack
上放置了一个动作bean,因此可以按名称检索动作属性,但是使用OGNL点表示法解析嵌套的bean。您可以在documentation中找到有关OGNL的更多信息。
每个操作实例都有其自己的上下文和valueStack
,因此,除非这些值在application
范围内维护,否则客户端不会相互干扰,并具有自己的值。valueStack
由调度程序创建,并置于操作上下文中。必要时,某些拦截器也可以重新创建它。您不必担心其值,因为它们在操作结束时就被销毁了。
关于java - Struts2 ValueStack如何处理多个请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20417423/