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>
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; } }
二.与Servlet API耦合的访问方式
直接访问 Servlet API将使Action类与Servlet API耦合在一起,Servlet API对象均由Servlet容器来构造,与这些对象绑定在一起,测试过程中就必须有Servlet容器,这样不便于Action类的测试,但有时候,确实需要访问这些对象,Struts2同样提供了直接访问ServletAPI对象的方式。
要直接获取Servlet API对象可以使用org.apache.struts2.ServletActionContext类,该类是ActionContext类的子类。
//通过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; }