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里放入app

session.put(“ses”, “session范围”);
                                //往session里放入ses

ctx.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="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";
    }

}
时间: 2024-10-19 01:07:35

9.Struts2在Action中获取request-session-application对象的相关文章

struts2 action中获取request session application的方法

共四种方式: 其中前两种得到的是Map<String,Object>  后两种得到的才是真正的request对象 而Map就是把request对象中的属性取出做成了键值对而已. [方法一] public class LoginAction { private Map request; private Map session; private Map application; public String execute() { request = (Map)ActionContext.getCo

struts2在action中获取request、session、application,并传递数据

如果只是通过request.session.application传递数据,则不需要获取相应的对象也可以传递数据,代码如下: ScopeAction.java: package com.itheima.action; import com.opensymphony.xwork2.ActionContext; public class ScopeAction { public String execute() { /* * 我们这里不通过字段(添加setXXX.getXXX方法)传递数据,我们想着

在Struts2的Action中获得request response session几种方法

转载自~ 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象呢?Struts2为我们提供了四种方式.分别为servlet 不相关的 非IoC 取得Request等对象的方式servlet 不相关的 IoC 取得Request等对象的方式servlet 相关的 非IoC 取得Request等对象的方式servlet 相关的 IoC 取得Request等对象的方式以下分别叙述.首先请看struts.xml文件文

struts2的action中获得request response session 对象

在struts2中有两种方式可以得到这些对象 1.非IoC方式 要获得上述对象,关键Struts 2中com.opensymphony.xwork2.ActionContext类.我们可以通过它的静态方法getContext()获取当前Action的上下文对象.有了这个对象我们想获得其他几个对象就好办了 ActionContext ctx = ActionContext.getContext(); Map session = ctx.getSession(); 细心的朋友可以发现这里的sessi

在springMVC的controller中获取request,response对象的一个方法

使用springMVC的时候,有些时候会需要获取请求或者响应对象,例如在身份验证的时候,需要获取请求头中的token,在做登录系统的时候需要使用response对象向客户端添加cookie,一个有效的做法是在controller的方法中添加对应参数如下所示: @RestController public class Test2Contrller { @RequestMapping("/test") public void test(HttpServletRequest req, Htt

160317(一)、在非action中获取request

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();             HttpSession session = request.getSession();

在struts2的action中操作域对象(request、session)

在struts2的Action中,操作域对象一共有三种方式: 1.ActionContext(与servelt API无关联): 1 //相当于request 2 ActionContext.getContext().put("userName", user.getUserName()); 3 //相当于session 4 ActionContext.getContext().getSession().put("userName", user.getUserName

struts2中获取request、response,与android客户端进行交互(文件传递给客户端)

用struts2作为服务器框架,与android客户端进行交互需要得到request.response对象. struts2中获取request.response有两种方法. 第一种:利用ServletActionContext的静态方法 Struts2 利用ServletActionContext类来维护Servlet对象,ServletActionContext利用ThreadLocal来维护 不同线程的Servlet对象,因此可以使用ServletActionContext类获取,这种方法

Action中取得request,session的四种方式

在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象呢?Struts2为我们提供了四种方式.分别为servlet 不相关的 非IoC 取得Request等对象的方式servlet 不相关的 IoC 取得Request等对象的方式servlet 相关的 非IoC 取得Request等对象的方式servlet 相关的 IoC 取得Request等对象的方式以下分别叙述. 首先请看struts.xml文件文件内容: