1. 程式人生 > >Action訪問ServletAPI的三種方式

Action訪問ServletAPI的三種方式

mvc 構造 缺點 思想 一個 前言 line api 這也

一、前言

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}獲取即可。

Action訪問ServletAPI的三種方式