2011-03-09 31 views
1

我需要在Struts 2应用程序中的多个请求中持久保留一个对象。将对象放入Session还是将其保留在Struts 2的Value Stack上会更好?会话持久性与价值堆栈中的维护之间的区别

那么,在会话中坚持一个对象还是在值栈上维护对象之间是否存在真正的区别(性能或其他)?在值栈

<s:property name="mutableDTO"/> 
... 

// mutableDTO instance variable set by Struts 2, value from client submit action 

// mainpulate mutableDTO 

this.mutableDTO = changedDTO; 

// jsp uses changed DTO 
... 
<s:property name="mutableDTO"/> 
+0

什么是“价值堆栈”? –

+0

Struts 2 Value Stack。 – Nick

回答

4

在S2中应用,会话,请求

1)会话

mutableSDO = getSession().get(SESSION_OBJ_IDENTIFIER); 

// manipulate object 

getSession().put(SESSION_OBJ_IDENTIFIER, mutableSDO); 

2)保持,并且参数是所有部分值栈。

默认情况下,请求范围是公开的,但您需要#来访问其他范围。

如果以#为前缀的属性,它将按照它们出现的顺序访问前述范围,直到找到属性。它的相同名称的多个属性出现在作用域堆栈中,您将需要使用#scope_name.attr显式查找所需的作用域。

在您的选项1和选项2之间。只有选项1将保留在多个请求上(实际上是维持会话的所有请求)。第二个不会在任何时间保持这个值,而只是一个请求,从一个请求到另一个请求冒泡。第一个将让用户随机访问应用程序中的任何页面并能够访问sored值,第二个依赖于转发到正确的页面。

假设你已经填充了一张雇员表,并且想要转到该雇员的详细信息页面,那么你只应该在请求范围内具有该雇员标识。即使您需要多次使用emp_id,您也不应该在会话范围内使用它。所以,如果你正在链接并掌握数据,这是正确的路要走。

如果你有一些用户喜好说,背景颜色。那么这将是一个很好的事情放入会话值,因为一组或所有页面将使用它。

主要考虑因素是,如果用户打开多个窗口并点击刷新按钮,网站的行为是否与预期相同?考虑一个用户打开多个员工详细信息窗口,如果该值作为会话值加载而不是作为get参数传递(在请求范围内),则用户点击刷新以查看每个窗口上的最新员工数据只会获得最后一名员工加入会议。

+0

感谢您的澄清! – Nick