首页 > 代码库 > 9.Struts2在Action中获取request-session-application对象

9.Struts2在Action中获取request-session-application对象

为避免与Servlet API耦合在一起,方便Action类做单元测试.
Struts2对HttpServletRequest、HttpSession、ServletContext进行了封装,构造了三个Map对象来替代这三种对象。
注意,这三个对象与Servlet API中的三个对象是相同的。
即,在Action中放入Session中信息,在JSP页面中是可以读出来的。
方式一:通过使用ActionContext类获取
在Struts2框架中,通过Action的执行上下文类ActionContext,可以获取request/session/application对象。

ActionContext对象本身就是request范围的存储空间。

所以,对于向request范围中添加属性,直接向ActionContext对象中添加即可。

ActionContext ctx = ActionContext.getContext();
Map<String,Object> application = ctx.getApplication();Map<String,Object> session = ctx.getSession();
application.put(“app”, “应用范围”);                                 //往ServletContext里放入appsession.put(“ses”, “session范围”);                                //往session里放入sesctx.put(“req”, “request范围”);                                 //往request里放入req
 
代码文档目录如下:

 


 index.jsp源码如下:

 

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My JSP ‘index.jsp‘ starting page</title>    <meta http-equiv="pragma" content="no-cache">    <meta http-equiv="cache-control" content="no-cache">    <meta http-equiv="expires" content="0">        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">    <meta http-equiv="description" content="This is my page">    <!--    <link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css">    -->  </head>    <body>    This is my JSP page. <br>  </body></html>

 

 

 

 show.jsp源码如下:

<%@ page pageEncoding="utf-8" isELIgnored="false"%><html>  <head>      <title>show page</title>  </head>    <body>        application中的app=${applicationScope.app}<br/>       session中的ses=${sessionScope.ses}<br/>      request中的req=${requestScope.req}     </body></html>

 

 ScopeTestAction.java源码如下:

package actions;import java.util.Map;import com.opensymphony.xwork2.ActionContext;public class ScopeTestAction {    public String execute(){        ActionContext ctx=ActionContext.getContext();        Map<String,Object> application=ctx.getApplication();        Map<String,Object> session=ctx.getSession();                application.put("app","app scope");        session.put("ses","ses scope");                //request中放入属性req        ctx.put("req", "req scope");                return "success";    }}

 

web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5"     xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">            <filter>        <filter-name>struts2</filter-name>        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>        </filter>        <filter-mapping>        <filter-name>struts2</filter-name>        <url-pattern>/*</url-pattern>        </filter-mapping>      <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>

 

struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd"><struts>    <package name="one" extends="struts-default">            <action name="scope" class="actions.ScopeTestAction">            <result>/show.jsp</result>        </action>            </package>    </struts>

 

部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/request_session_application/scope.action

运行截图如下:


 

方式二:通过实现特定接口来获取
通过让Action实现特定接口,也可获取request/session/application对象。
 RequestAware接口:该接口中只有一个方法
    public void setRequest(Map<String,Object> request)
 SessionAware接口:该接口中只有一个方法
    public void setSession (Map<String,Object> session)
 ApplicationAware接口:该接口中只有一个方法
    public void setApplication (Map<String,Object> application)
只要在Action中以如下的形式定义好相应的对象:
            Map<String,Object> request;
并以如下的方式实现特定接口中的方法:
            this.request = request;
那么,在Action方法中(如execute方法)就可使用相应的对象了。
对这些对象的访问:
在各范围中放入属性后,在页面中即可通过EL表达式将其值读出来了。
    ${requestScope.req}   <br/>
    ${sessionScope.ses}   <br/>
    ${applicationScope.app}
实例:在Action中获取request/session/application—scopetest
Step1:编写ScopeTestAction与ScopeTestAction2类,来实现使用两种方式的添加相应习属性的功能
Step2:编写web.xml与struts.xml
Step3:编写show.jsp
在上面的基础上新建ScopeTestAction2.java
完成源码如下:
package actions;import java.util.Map;import org.apache.struts2.interceptor.ApplicationAware;import org.apache.struts2.interceptor.RequestAware;import org.apache.struts2.interceptor.SessionAware;public class ScopeTestAction2 implements RequestAware, SessionAware,        ApplicationAware {    private Map<String,Object> request;    private Map<String,Object> session;    private Map<String,Object> application;    public void setApplication(Map<String, Object> request) {        this.request=request;    }    public void setSession(Map<String, Object> session) {        this.session=session;    }    public void setRequest(Map<String, Object> application) {        this.application=application;    }        public String execute(){                application.put("app","app scope");        session.put("ses","ses scope");                //request中放入属性req        request.put("req", "req scope");        return "success";    }}

 

 

 

9.Struts2在Action中获取request-session-application对象