首页 > 代码库 > Struts2 与Servlet API解耦,耦合的访问方式

Struts2 与Servlet API解耦,耦合的访问方式

一.与Servlet API解耦的访问方式

1.为了避免与Servlet API耦合在一起,方便Action类做单元测试,
  Struts2对HttpServletRequest、HttpSession和ServletContext进行了封装,
  构造了三个Map对象来替代这三种对象,在Action中,
  直接使用HttpServletRequest、HttpSession、ServletContext对应的Map对象来保存和读取数据。
  要获得这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类

ActionContext - 请求上下文 。就是struts2封装的request.包含了request,session,application上面这三个都是Map.

public class LoginAction implements Action{    private String username;    private String password;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }        public String execute() throws Exception {        if (username.equals("1")&&password.equals("1")) {            //解耦合 记录session            Map<String, Object> session = ActionContext.getContext().getSession();            session.put("uname", username);            return SUCCESS;        }else {            return LOGIN;        }    }}     
<!--登录

登陆成功后,记录用户名到Session中,登陆失败,跳会登陆页面

 -->        <action name="loginAction" class="cn.happy.action.LoginAction">            <result name="success">            s.jsp            </result>            <result name="login">            login.jsp            </result>        </action>

二.与Servlet API耦合的访问方式

直接访问 Servlet API将使Action类与Servlet API耦合在一起,Servlet API对象均由Servlet容器来构造,与这些对象绑定在一起,测试过程中就必须有Servlet容器,这样不便于Action类的测试,但有时候,确实需要访问这些对象,Struts2同样提供了直接访问ServletAPI对象的方式。

要直接获取Servlet API对象可以使用org.apache.struts2.ServletActionContext类,该类是ActionContext类的子类。

2:向Action中注入ServletAPI对象对应的Map对象

public class LoginAction implements Action,SessionAware {    private String username;    private String password;    private Map<String,Object> map;    public String execute() throws Exception {        if (username.equals("1")&&password.equals("1")) {            //注入map集合            map.put("uname", username);            return SUCCESS;        }else {            return LOGIN;        }    }           public void setSession(Map<String, Object> map) {                this.map=map;    }}

//通过ActionContext的子类ServletActionContext实现

public class LoginAction implements Action {    private String username;    private String password;    public String execute() throws Exception {        if (username.equals("1")&&password.equals("1")) {           HttpSession session = ServletActionContext.getRequest().getSession();            session.setAttribute("uname", username);            return SUCCESS;        }else {            return LOGIN;        }    }

//向Action实例注入Servlet API对象

public class LoginAction implements Action,ServletRequestAware{    private HttpServletRequest Request;        private String username;    private String password;    public String execute() throws Exception {        if (username.equals("1")&&password.equals("1")) {         //记录session          HttpSession session=request.getSession();          session.setAttribute("uname",username);            return SUCCESS;        }else {            return LOGIN;        }    }        public void setServletRequest(HttpServletRequest arg0) {        this.request=request;            }

 

Struts2 与Servlet API解耦,耦合的访问方式