论坛首页 Java企业应用论坛

总结webwork里通过ActionContext以及Aware接口访问数据

浏览 4158 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-08  

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
//通过ActionContext访问数据
//davy ,2007-06-08
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
0.ActionContext的缺陷:
我们通过静态方法访问ActionContext的,而它本身是ThreadLocal的实现,所以对
action进行自动的单元测试将需要更多的工作;此外,由于能在线程调用栈的任意位
置访问ActionContext,因此你能与任意ThreadLocal协作,但请不要依赖这一点,如
过多依赖这一点,则你会陷入深层次的代码,而对你的action没有一的好处!
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
00.好多方案是让你的action Class实现SessionAware接口,当然你可以认为此action
依赖于CompleteStack.代码如下:

public class Login extends ActionSupoort implements SessionAware,UserDaoAware
{
  Map session;
  User user;
  UserDao userDao;
  //设置session,SessionAwear接口保证在action执行以前,先设置好session Map;
  public void setSession(Map session)
  {
    this.session = session;
  }
  //用户登陆
  public String execute() throws Exception
  {
    user = this.control.getUser(user.getName,user.getPassword);
    if(user == null)
    {
      return INPUT;
    }else
    {
      session.put("user",user);
      return SUCCESS;
    }
  }
}

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
01.获取session.
  Map session = ActionContext.getContext().getSession();
  session.put("user",user);
  return SUCCESS;
  注意:这里得到的session已经不是servlet特有的HttpSession了,此session表现为
        Map,此Map中封装了HttpSession.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
02.获得HttpSession.
(1).
   ActionContext context  = ActionContext.getContext();
   HttpServletRequest req = context.get(ServletActionContext.HTTP_REQUEST);
   HttpSession session = req.getSession();
   session.put("user",user);
   return SEUCCESS;
   注意:不到万不得以,不要同时使用ActionContext和ServletActionContext这两个类.
(2).这是在下常用的方法.
   HttpServletRequest req = ServeletActionContext.getRequest();
   HttpSession session = req.getSession();
   session.put("user",user);
   return SUCCESS;
(3).以下才是最推荐的方式,通过让你的action class实现ServletRequestAwear接口.
   public class Login extends ActionSupport implements ServletRequestAwear,UserDaoAwear
   {
     HttpServletRequest req;
     User user;
     UserDao userDao;
    
     public void setServletRequest(HttpServletRequest req)
     {
 this.req = req;
     }

     public String execute() throws Exception
     {
        user = userDao.findUser(user.getName(),user.getPassword());
 if(user == null)
 {
   return INPUT;
 }else
 {
   HttpSession session = req.getSession();
          session.put("user",user);
   return SUCCESS;
 }
     }

   }

   发表时间:2007-06-08  
最好不要和sevlet代码耦合啊
0 请登录后投票
   发表时间:2007-06-09  
可把session访问的部分抽离到接口和另外一个实现类。
到时候做单元测试只需要做个Mock实现就好了~~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics