一.與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; }