Action訪問ServletAPI的三種方式


一、前言

Struts是一種基於MVC設計模式的web應用框架,主要擔任C的角色,用於分離頁面顯示和業務邏輯處理,那其實在我們學習jsp的時候學過一個具有類似功能的東西——servlet。其實Struts本質上相當於servlet,可以理解Struts是對servlet的進一步封裝和抽象。那么在servlet里面使用的對象,在Struts里面同樣也是可以使用的,這也是這一章的主要內容。

 

二、傳統的Web程序和Web容器傳遞數據的方法

  1. HttpServletRequest的getParameter(String name)方法
  2. HttpSession的getAttribute(String Object)方法

三、Action為什么需要調用Servlet API?

  1. Action需要存取request、session、application數據區中數據
  2. 例如:在Action中將用戶數據保存到Session中
  3. 例如:跟蹤用戶的狀態,例如購物車功能

 

四、Action訪問servlet API的方式

  1. 提供了ServletActionContext類完成直接訪問HttpServletRequest,HttpServletResponse,ServletContext 對象

   缺點:Action組件和這些ServletAPI耦合在一起,不利於軟件維護。

//第一種方式:ServletActionContext類,直接訪問servletAPI對象

HttpServletRequest request=ServletActionContext.getRequest();

HttpSession session=request.getSession();

ServletContext application=ServletActionContext.getServletContext(); 

//      request.setAttribute("user",uname);//將user對象放到request作用域中

//      session. setAttribute("user",uname);//將user對象放到session作用域中

//      application. setAttribute("user",uname);//將user對象放到application作用域中

 

if("ross".equals(this.uname) && "111".equals(this.upass)){

    request.setAttribute("user",uname);//將user對象放到request作用域中

    return "success";

}else{

    request.setAttribute("msg","用戶名或密碼錯誤");//將user對象放到request作用域中

    return "error";

}

 


  1. 提供ActionContext類

  特點:Struts2將ServletAPI(HttpServletRequest,HttpSession,ServletContext)分別封裝在Map中,完成了Action組件和ServletAPI的解耦。

         所以如果ActionContext能實現我們的功能就不要去使用ServletActionContext,讓我們的action盡量不要去直接訪問servlet的相關對象,更符合面向對象編程的思想。

  注意:不要在構造函數當中使用ActionContext,因為此時ActionContext里面的值也許還沒有設置。同理,ServletActionContext也一樣不要在構造函數當中使用。這就有了我們的第三種訪問方式。

//第二種方式:actioncontext類

ActionContext context=ActionContext.getContext();

Map<String,String> request=(Map<String,String>)context.get("request");//獲得request對象 Map<String,Object> session=(Map<String,Object>)context.getSession();

Map<String,Object> application=(Map<String,Object>)context.getApplication();

request.put("user",uname);//將user對象放到request作用域中

if("ross".equals(this.uname) && "111".equals(this.upass)){

              request.put("user",uname);//將user對象放到request作用域中

              return "success";

         }else{

              request.put("msg","用戶名或密碼錯誤");//將user對象放到request作用域中

              return "error";

         }

 

  1. 實現RequestAware,SessionAware,ApplicationAware接口。【推薦使用】

  特點:裝配request,session,application對象的時機早,在檢測Action組件的實現接口時就完成了裝配。

private Map<String, Object> request;

     private Map<String, Object> session;

     private Map<String, Object> application;

     @Override

     public void setApplication(Map<String, Object> arg0) {

         this.application=arg0;

     }

     @Override

     public void setSession(Map<String, Object> arg0) {

         this.session=arg0;

     }

     @Override

     public void setRequest(Map<String, Object> arg0) {

         this.request=arg0;

     }

     /**

      * 處理用戶登錄請求

      */

     public String execute() {

         // 模擬用戶登錄處理(登錄正確)

         if ("ross".equals(uname) && "111".equals(upass)) {

              session.put("uname", uname);

              // 返回邏輯視圖名

              return SUCCESS;

              // 登錄失敗

         } else {

              request.put("loginError", "登錄名稱或者密碼錯誤");

              // 返回邏輯視圖名

              return ERROR;

         }

     }


頁面上使用el表達式${ loginError}獲取即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM