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