標籤:http override inverse 環境 getc inject depend 構造方法 依賴注入
有很多時候我們都需要訪問web元素,比如說使用者管理系統,使用者登入成功了需要往session中放置一個值,然後要在前台拿到這個值,常用的web元素包括request、session和application等。
Struts2中有四種方式可以訪問到web元素:
1、通過ActionContext來訪問Map類型的request、session、application對象。
2、通過實現RequestAware、SessionAware、ApplicationAware介面來訪問Map類型的request、session、application對象(IoC方式)。(常用)
3、通過ServletActionContext來訪問Servlet API類型的HttpServletRequest、 HttpSession、 ServletContext對象(依賴於Servlet API 方式)。
4、通過實現ServletRequestAware介面來訪問Servlet API類型的HttpServletRequest、 HttpSession、 ServletContext對象(IoC方式)。
一、ActionContext方式
在電腦程式中,一般Context是指程式啟動並執行環境,在Struts2的ActionContext中,包括我們需要的request、session、application等對象,所以我們可以在ActionContext中拿到這些對象,一般在Action類的構造方法,或execute()方法中擷取。
package com.chongqing.action;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;public class LoginAction1 extends ActionSupport {private Map request; //定義Map類型的requestprivate Map session; //定義Map類型的sessionprivate Map application;//定義Map類型的application//在構造方法中擷取這些對象public LoginAction1() {request = (Map)ActionContext.getContext().get("request");session = ActionContext.getContext().getSession();application = ActionContext.getContext().getApplication();}//利用索引值存放數值到request,session,application public String execute() {request.put("r1", "r1");session.put("s1", "s1");application.put("a1", "a1");return SUCCESS; }}
然後在JSP頁面中擷取相關web元素:
<body>User Login Success!<br /><s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br /><s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br /><s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br /><s:debug></s:debug><br /></body>
注意:在Action中我們定義的Map類型的request、session和application,而在JSP頁面中卻可以直接通過request.getAttribute("r")等方式直接拿到裡面的值,這說明在Struts2的內部機制會將Action中Map類型的request、session和application裡面的值依次放置到真實類型的request、session和application中。
二、IoC(控制反轉)
這是最常用的方式。所謂控制反轉(Inversion of Control),就是本來是由自己擷取session的(自己控制),現在交給Struts2或容器來控制session(交給其他人控制),只要我們按照規定的格式來寫就行。控制反轉一般分為兩種類型,依賴注入(Dependency Injection,簡稱DI)和依賴尋找(Dependency Lookup),這裡是依賴注入。
讓Action類實現RequestAware、SessionAware、ApplicationAware介面,然後重寫他們的set方法即可。
package com.chongqing.action;import java.util.Map;import org.apache.struts2.interceptor.ApplicationAware;import org.apache.struts2.interceptor.RequestAware;import org.apache.struts2.interceptor.SessionAware;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {private Map<String, Object> request;private Map<String, Object> session;private Map<String, Object> application;//DI dependency injection//IoC inverse of controlpublic String execute() {request.put("r1", "r1");session.put("s1", "s1");application.put("a1", "a1");return SUCCESS; }@Overridepublic void setRequest(Map<String, Object> request) {this.request = request;}@Overridepublic void setSession(Map<String, Object> session) {this.session = session;}@Overridepublic void setApplication(Map<String, Object> application) {this.application = application;}}
三、擷取原類型(依賴於Servlet API 方式)
這種方式與第一種方法相似,不過這裡是擷取Servlet API類型的HttpServletRequest、 HttpSession、 ServletContext對象,用的不多。
package com.chongqing.action;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class LoginAction3 extends ActionSupport {private HttpServletRequest request;private HttpSession session;private ServletContext application;public LoginAction3() {request = ServletActionContext.getRequest();session = request.getSession();application = session.getServletContext();}public String execute() {request.setAttribute("r1", "r1");session.setAttribute("s1", "s1");application.setAttribute("a1", "a1");return SUCCESS; }}
四、原類型的IoC方式
這種方式與第二種方式相似,不過這裡是實現ServletRequestAware介面,用的不多。
package com.chongqing.action;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.apache.struts2.interceptor.ServletRequestAware;import com.opensymphony.xwork2.ActionSupport;public class LoginAction4 extends ActionSupport implements ServletRequestAware {private HttpServletRequest request;private HttpSession session;private ServletContext application;public String execute() {request.setAttribute("r1", "r1");session.setAttribute("s1", "s1");application.setAttribute("a1", "a1");return SUCCESS; }@Overridepublic void setServletRequest(HttpServletRequest request) {this.request = request;this.session = request.getSession();this.application = session.getServletContext();}}
Struts2中訪問web元素