例如在Action中访问session的2种方式:
1. ServletActionContext.getRequest().getSession() 返回一个HttpSession对象
2. ActionContext.getContext().getSession() 返回一个对应与session的Map<String, Object>请问这两种方式,哪一种在实际项目开发中更常用呢?
struts2提供第二种的目的难道仅仅是为了测试方便?

解决方案 »

  1.   

    ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(比如Map),它存放的是Action在执行时需要用到的对象. 一般情况, 我们的ActionContext都是通过: ActionContext context = (ActionContext) actionContext.get();来获取的.
    通过ActionContext取得HttpSession: Map session = ActionContext.getContext().getSession();ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了上面介绍的ActionContext,它提供了直接与Servlet相关对象访问的功能。如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet的相关对象.
     
    注意:在使用ActionContext时有一点要注意: 不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null;同样,HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req作为类变量给其赋值。
      

  2.   

    我认为也是为了方便测试,使我们的action不依赖servlet这些东西。
      

  3.   

    struts2 对 servlet 进行了封装,当然 struts2 提供了直接访问 servlet 的API。
    1. ServletActionContext.getRequest().getSession() 直接访问了servlet API 中的session
    2. ActionContext.getContext().getSession() struts封装的session
    两种效果几乎一样。但是在实际项目中,如果使用了struts2 就尽量避免直接访问servlet API,而是使用struts2 提供的API。