3

我有这个使用 struts2 的应用程序流程:

  1. Page_A.jsp 包含可以使用方法 executeA 向 ActionA 类提交数据的表单

  2. ActionA->executeA 方法将数据存储在具有键“myKey”的会话中

  3. ActionA 将结果返回给 Page_B.jsp

  4. Page_B.jsp 包含可以使用方法 executeB 向 ActionA 类提交数据的表单

  5. 在 ActionA->executeB 方法中,它将从“myKey”会话中获取提交的数据

我发现有两种方法可以从会话中设置和获取数据:

  1. 使用 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");
    
  2. 使用 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”会话数据覆盖)。

例如:

  1. 用户 1 登录

  2. User1 转到 Page_A.jsp 并提交数据,现在他在 Page_B.jsp 中(现在“myKey”会话包含 User1 提交的数据)

  3. 用户2登录

  4. User2 也去 Page_A.jsp 并提交数据

  5. 我担心如果 User1 确实从 Page_B.jsp 提交,“myKey”中的数据是否仍会引用他提交的原始数据,或者他会从 User2 获取数据(因为“myKey”会话数据已被替换)?

4

1 回答 1

2

如果您正在使用ActionContext.getContext().getSession();拦截器,因为它没有操作所具有的 DI,则使用,另一方面,对于操作添加SessionAware接口并且会话将被注入。

注入方法降低了耦合度,并且更容易测试您的操作。

以上都假设您不需要完整的 HttpServletRequest 接口(它的功能远不止作为参数映射):http ://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest .html

如果你需要这个接口那么ServletActionContext.getRequest();当然是正确的。再次在动作中,您可以通过使用ServletRequestAwarewhich will injection来降低耦合HttpServletRequest

如果您只需要一个属性映射,那么只需使用为您提供映射的方法。同样,这是因为它更容易测试并且意图很明确。

会话是唯一的,它们由应用程序服务器维护。为简单起见,当用户使用您的应用程序时,您可以放心有一个会话。

于 2013-05-28T05:16:15.917 回答