我需要在Struts 2应用程序中的多个请求上保留一个对象。将对象放入Session或将其保存在Struts 2的Value Stack上是否更好?
那么,在会话中持久保存对象与在价值堆栈上维护对象之间是否存在真正的差异(性能或其他方面)?
1)会话
mutableSDO = getSession().get(SESSION_OBJ_IDENTIFIER);
// manipulate object
getSession().put(SESSION_OBJ_IDENTIFIER, mutableSDO);
2)维持价值堆栈
<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 :(得分:4)
在S2应用程序中,会话,请求和参数都是值堆栈的一部分。
默认情况下会公开请求范围,但您需要#才能访问其他范围。
如果使用#为属性添加前缀,它将按照它们出现的顺序访问上述范围,直到找到该属性。在使用#scope_name.attr显式查找所需范围所需的范围堆栈中,会出现多个同名属性。
在选项1和选项2之间。只有选项1将持续多个请求(实际上所有维护会话的请求)。第二个不会在任何时间保持该值,而是一个请求,将其从一个请求向前发送到下一个请求。第一种方法是让用户随机访问应用程序中的任何页面,并能够访问已分配的值,第二种方法取决于转发到正确的页面。
假设您已填充员工表并希望转到员工的详细信息页面,您应该只在请求范围内拥有员工ID。即使您需要多次使用emp_id,也不应该在会话范围内使用它。因此,如果你正在向前推进并掌握数据,这是正确的方法。
如果你有一些用户偏好说,背景颜色。然后,这将是一个很好的事情放入会话值,因为一个组或所有页面将使用它。
主要考虑因素是,如果用户打开多个窗口并点击刷新按钮,网站是否会按预期运行?考虑用户打开多个员工详细信息窗口,如果值作为会话值加载而不是作为get参数传递(在请求范围内),则用户点击刷新以查看每个窗口上的最新员工数据只会获得最后一名员工加载在会话上。