Struts2中訪問web元素

來源:互聯網
上載者:User

標籤: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元素

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.