一、前言
Struts是一種基於MVC設計模式的web應用框架,主要擔任C的角色,用於分離頁面顯示和業務邏輯處理,那其實在我們學習jsp的時候學過一個具有類似功能的東西——servlet。其實Struts本質上相當於servlet,可以理解Struts是對servlet的進一步封裝和抽象。那么在servlet里面使用的對象,在Struts里面同樣也是可以使用的,這也是這一章的主要內容。
二、傳統的Web程序和Web容器傳遞數據的方法
- HttpServletRequest的getParameter(String name)方法
- HttpSession的getAttribute(String Object)方法
三、Action為什么需要調用Servlet API?
- Action需要存取request、session、application數據區中數據
- 例如:在Action中將用戶數據保存到Session中
- 例如:跟蹤用戶的狀態,例如購物車功能
四、Action訪問servlet API的方式
- 提供了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"; }
提供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"; }
- 實現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}獲取即可。