程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Struts2 與Servlet API解耦,耦合的訪問方式,struts2servlet

Struts2 與Servlet API解耦,耦合的訪問方式,struts2servlet

編輯:JAVA綜合教程

Struts2 與Servlet API解耦,耦合的訪問方式,struts2servlet


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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved