struts2在Action中獲取Scope中的對象request、session、application

一、描述

       在Action操作中,關鍵就是Action中的exectue方法,但是此方法並沒有request、session、application等對象作爲參數,自然就不能利用這些對象來操作,下面我們用四種方式來獲取這些對象:

方式一、與Servlet解耦合的非IOC方式

獲取的scope對象與容器無關,通過ActionContext獲取。
LoginAction代碼如下

package com.asm;

public class LoginAction extends ActionSupport {

    private Stringusername;

    ActionContext context;

    Map request;

    Map session;

    Map application;

    public String execute()throws Exception {

       context=ActionContext.getContext();

       request=(Map)context.get("request");

       session=context.getSession();

       application=context.getApplication();

      

       request.put("req","requst屬性");

       session.put("ses","sesion屬性");

       application.put("app","application屬性");

       returnSUCCESS;

    }

    ...省略username的get/set方法

}

struts.xml配置如下:

<struts>

    <packagename="scope"extends="struts-default">

       <actionname="login"class="com.asm.LoginAction">

           <result>/loginSuc.jsp</result>

</action>
</
package>   

</struts>

login.jsp內容如下:

<formaction="<%=request.getContextPath()%>/login.action">

       用戶名:<inputtype="text"name="username"><br>

       <inputtype="submit"value="login">   

</form>

loginSuc.jsp的主要內容如下:
${requestScope.req}

${sessionScope.ses}

${applicationScope.app}
<h4>以下使用scope.getAttribute的形式來接受</h4>

       request:  <%=request.getAttribute("req")%><br>

       session:  <%=session.getAttribute("ses")%><br>

       application:<%=application.getAttribute("app")%><br>

分析:通過ActionContext的getContext靜態方法得到ActionContext對象,然後ActionContext對象調用get方法來獲取一個存儲在request範圍中的對象。我們使用el或通過request.getAttribute這樣的方式均可以獲取對象值,這說明了這些Map request對象實際是存儲在request範圍內的對象。


方式二、與Servlet解耦合的IOC方式

我們建立Login2Action,主要代碼如下:
package com.asm;

public class Login2Action extends ActionSupportimplementsRequestAware,SessionAware,ApplicationAware {

    private Stringusername;

    Map request;

    Map session;

    Map application;

    public String execute()throws Exception {

       request.put("req","requst屬性");

       session.put("ses","sesion屬性");

       application.put("app","application屬性");

       returnSUCCESS;

    }

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

       this.request=request;

    }

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

       this.session=session;

    }

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

       this.application=application;

    }

    ...省略username的get/set方法 

}
註冊此Action的name爲login2,隨後修改登錄提交爲.../login2.action。便可以發佈測試。說明:此方法其實和方式一很相似,只是在方式一中我們需要手動的爲Map request賦值,但是在方式二中它是通過實現接口,在重寫接口中的方法中完成對Maprequset的賦值,所以稱之IOC方式。藉助此例,略談下依賴注入與控制反轉:所謂依賴注入就是一個對象自己本身的初始化是依賴其它對象。比如這裏Map request這些對象會依賴struts2來給其初始化,稱爲依賴注入,而依賴注入的就表示,這些對象的控制權不再由此類本身掌握,而是交給了別的對象,即是控制權反轉了。強調:方式二是開發中主要用的方式,應重點掌握


方式三、與Servlet耦合的非IOC方式

建立Login3Action,代碼如下:
package com.asm;
public class Login3Actionextends ActionSupport {

    private Stringusername;

    HttpServletRequest request;

    HttpSession session;

    ServletContext application;

    public String execute()throws Exception {

       request = ServletActionContext.getRequest();

       session = request.getSession();

       application = ServletActionContext.getServletContext();

 

       request.setAttribute("req","requst屬性");

       session.setAttribute("ses","sesion屬性");

       application.setAttribute("app","application屬性");

       returnSUCCESS;

    }

    ...省略username的get/set方法。

}
此方法獲取的純粹的Scope對象,它與容器相關,這些Scope對象操作更強。


方式四、與Servlet耦合的IOC方式

建立Login4Action,代碼如下:

package com.asm;
public class Login4Actionextends ActionSupport implementsServletRequestAware,ServletContextAware{

    private Stringusername;

    ActionContext context;

    HttpServletRequest request;

    HttpSession session;

    ServletContext application;

    public String execute()throws Exception {

       context=ActionContext.getContext();

       session=request.getSession();  

       request.setAttribute("req","requst屬性");

       session.setAttribute("ses","sesion屬性");

       application.setAttribute("app","application屬性");

       returnSUCCESS;

    }

   

    public void setServletRequest(HttpServletRequest request) {

       System.out.println("測試:"+request);

       this.request=request;

    }

    public void setServletContext(ServletContext application) {

       System.out.println("測試:"+application);

       this.application=application;

    }

    ...省略username的get/set方法

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章