我有这个应用程序流与struts2:
Page_A.jsp包含可以使用方法executeA
ActionA-> executeA方法将数据存储在带有“myKey”键的sesion中
ActionA将结果返回到Page_B.jsp
Page_B.jsp包含可以使用方法executeB
在ActionA-> executeB方法中,它将从“myKey”会话中获取提交的数据
我发现有两种方法可以设置和从会话中获取数据:
使用ActionContext
// put the data into session Map session = ActionContext.getContext().getSession(); session.put("myKey", data); // get the data from session Map session = ActionContext.getContext().getSession(); data = (String[]) session.get("myKey");
使用ServletActionContext
// put the data into session HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(false); session.setAttribute("myKey", data); // get the data from session HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(false); data = (String[]) session.getAttribute("myKey");
在两种方式之间,哪种方式更好?或者还有另一种更好的方法吗? (如果有的话,我更喜欢简单的方法)
第二件事,我想确保会话与用户登录会话绑定。这意味着一个用户的“myKey”会话数据将与另一个用户的“myKey”会话数据不同(“myKey”会话数据永远不会被另一个用户的“myKey”会话数据覆盖)。
例如:
User1登录
User1转到Page_A.jsp并提交数据,现在他在Page_B.jsp(现在“myKey”会话包含User1提交的数据)
User2登录
User2转到Page_A.jsp并提交数据
我担心如果User1确实从Page_B.jsp提交,“myKey”中的数据是否仍然会引用他提交的原始数据,或者他将从User2获取数据(因为“myKey”会话数据被替换了)?
答案 0 :(得分:2)
如果您正在使用拦截器,请使用ActionContext.getContext().getSession();
,因为它没有操作所具有的DI,另一方面,操作添加SessionAware
接口,会话将被注入。
注射方法可降低耦合并使您更容易测试您的行为。
以上两者都假设您不需要完整的HttpServletRequest接口(其功能远远超过 作为参数映射):http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html
如果您需要此界面,那么ServletActionContext.getRequest();
当然是正确的。再一次在操作中,您可以使用ServletRequestAware
来降低耦合,这将为您注入HttpServletRequest
。
如果您只需要一个属性地图,那么只需使用为您提供地图的方法即可。再次,这是因为它更容易测试,意图很明确。
会话是唯一的,它们由应用程序服务器维护。为简单起见,当用户使用您的应用程序时,您可以放心会话。