当前位置: 代码迷 >> Web前端 >> 小结webwork里通过ActionContext以及Aware接口访问数据
  详细解决方案

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

热度:140   发布时间:2012-10-26 10:30:58.0
总结webwork里通过ActionContext以及Aware接口访问数据

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
//通过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;
?}
???? }

?? }

1 楼 一日游 2007-06-08  
最好不要和sevlet代码耦合啊
2 楼 tiyi 2007-06-09  
可把session访问的部分抽离到接口和另外一个实现类。
到时候做单元测试只需要做个Mock实现就好了~~
  相关解决方案