Struts2访问Servlet的三种方式

基本介绍

在Struts2中,Action并没有直接和Servlet API耦合。虽然Struts2 中的Action访问Servlet API麻烦一些,但是这却是Struts2中Action的重要改良之一,方便Action进行单元测试。

尽管Action和Servlet API解耦会带来很多好处,然而在Action中完全不访问Servlet API几乎是不可能的,在实现业务逻辑时,经常要访问Servlet中的对象,如request、session和application等 。

在Struts2中,访问Servlet API有3种方法,分别是实现特定接口,通过ServletActionContext类,通过ActionContext类。

思维导图

实现特定接口访问

package com.pc.web.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware; 

import com.opensymphony.xwork2.ActionSupport; 

/**
 * 使用特定接口访问Servlet对象
 * @author Switch
 *
 * org.apache.struts2.dispatcher.StrutsRequestWrapper@461aa2
 * org.apache.catalina.connector.ResponseFacade@7e83df
 * org.apache.catalina.core.ApplicationContextFacade@3b102
 * org.apache.catalina.session.StandardSessionFacade@5a214b
 * 是由一个名称为servletConfig的拦截器为我们封装的
 */
public class ActionTest7 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware { 

  private HttpServletRequest request;
  private HttpServletResponse response;
  private ServletContext application; 

  /**
   * @return
   */
  public String demo(){
    System.out.println(request);
    System.out.println(response);
    System.out.println(application);
    System.out.println(request.getSession());
    return SUCCESS;
  } 

  @Override
  public void setServletRequest(HttpServletRequest request) {
    this.request = request;
  } 

  @Override
  public void setServletResponse(HttpServletResponse response) {
    this.response = response;
  } 

  @Override
  public void setServletContext(ServletContext application) {
    this.application = application;
  }
}

通过ServletActionContext类

package com.pc.struts2.web.action;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; 

import org.apache.struts2.ServletActionContext; 

import com.opensymphony.xwork2.ActionSupport;
/**
 * 访问ServletAPI的方式
 *
 * 使用Struts2框架提供了一个工具类:
 *     ServletActionContext
 * 它里面提供了对应的静态方法,可以直接获取ServletAPI
 *
 * 有一个需要注意的问题:
 *    org.apache.struts2.dispatcher.StrutsRequestWrapper@4637b3
 *    org.apache.catalina.connector.ResponseFacade@1f2f2f7
 *    org.apache.catalina.session.StandardSessionFacade@12d77c1
 *    org.apache.catalina.core.ApplicationContextFacade@1133ff
 *
 *    requet对象已经不是原来tomcat提供的了,而是被struts2框架包装过了。
 *     包装使用的是装饰者模式。
 *    装饰者模式的作用是对方法进行增强。
 *
 * @author Switch
 */
public class ActionAPITest extends ActionSupport {
  /**
   * 在Struts2框架中使用ServletAPI
   * @return
   */
  public String useServletAPI() {
    HttpServletRequest request = ServletActionContext.getRequest();
    HttpServletResponse response = ServletActionContext.getResponse();
    HttpSession session = request.getSession();
    ServletContext application = ServletActionContext.getServletContext();
    System.out.println(request);
    System.out.println(response);
    System.out.println(session);
    System.out.println(application);
    return "success";
  }
}

通过ActionContext类

package com.pc.web.action;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; 

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics; 

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; 

/**
 * ActionContext类介绍
 *   它是Struts2框架为我们提供的一个工具类。
 *   该类可以通过方法直接获取request,response,servletContext对象
 * @author Switch
 *
 * context.getParameters(); == request.getParameterMap(); 获取的是请求参数
 */
public class ActionTest8 extends ActionSupport implements StrutsStatics { 

  private HttpServletRequest request;
  private HttpServletResponse response;
  private ServletContext application; 

  /**
   * 使用ActionContext访问ServletAPI
   * @return
   */
  public String demo(){
    ActionContext context = ActionContext.getContext(); 

    request = (HttpServletRequest) context.get(HTTP_REQUEST);
    response = (HttpServletResponse) context.get(HTTP_RESPONSE);
    application = (ServletContext) context.get(SERVLET_CONTEXT);
    System.out.println(request);
    System.out.println(response);
    System.out.println(application);
    System.out.println(request.getSession());
    /*org.apache.struts2.dispatcher.StrutsRequestWrapper@112e422
    org.apache.catalina.connector.ResponseFacade@13f8b4c
    org.apache.catalina.core.ApplicationContextFacade@d244dd
    org.apache.catalina.session.StandardSessionFacade@a711cb*/ 

    return SUCCESS;
  } 

  /**
   * 使用原始ServletAPI对象,往session域和application域中存入数据
   * session域中存入     key=sessionAttr     value=hello session attr
   * application域中存入 key=applicationAttr   value=hello application attr
   * @return
   */
  public String demo2(){
    //1.获取session对象
    HttpSession session = ServletActionContext.getRequest().getSession();
    //存入数据
    session.setAttribute("sessionAttr", "hello session attr");
    session.getId();
    //2.获取ServletContext
    ServletContext application = ServletActionContext.getServletContext();
    application.getRealPath("/WEB-INF/uploads");
    //存入数据
    application.setAttribute("applicationAttr", "hello application attr");
    return SUCCESS;
  } 

  /**
   * 使用ActionContext类中的getSession()和getApplication()获取到的map来往map中存入数据
   * sessionMap中存入     key=sessionAttr     value=hello session map
   * applicationMap中存入 key=applicationAttr   value=hello application map
   * @return
   */
  public String demo3(){
    //1.获取ActionContext对象
    ActionContext context = ActionContext.getContext();
    //2.获取sessionMap
    Map<String,Object> sessionMap = context.getSession();
    sessionMap.put("sessionAttr", "hello session map");
    //3.获取applicationMap
    Map<String,Object> applicationMap = context.getApplication();
    applicationMap.put("applicationAttr", "hello application map");
    return SUCCESS;
  } 

}

ActionContext类访问Servlet API的常用方法


方法声明

功能描述

void put(String key, Object value)

将 key-value键值对放入ActionContext 中,模拟Servlet API中的HttpServletRequest的setAttributeO方法。

Object get(String key)

通过参数key来查找当前ActionContext中的值。

Map<String, Object> getApplication()

返回一个Application级的Map对象。

static ActionContext getContext()

获取当前线程的ActionContext对象。

Map<String, Object> getParameters()

返回一个包含所有HttpServletRequest参数信息的Map对象。

Map<String, Object> getSession()

返回一个Map类型的HttpSession对象。

void setApplication(Map<String, Object> application)

 设置Application上下文。

void setSession(Map<String, Object> session)

设置一个Map类型的Session值 。

PS:通过对这三种方式的使用,可以发现通过实现特定接口和使用ServletActionContext类,Action是与Servlet API进行直接耦合的,这样并不利于程序解耦。所以开发中建议优先使用ActionContext。

PS:虽然这样,在控制器与Servlet API解耦了,但是在Struts2中肯定有一部分代码还是和Servlet API有耦合,这是毋庸置疑的。如果我们只是需要使用Servlet API中域对象中的域(键值对,存放数据的),那么就使用ServletContext,如果需要使用除了域之外的其他东西,那么还是要使用ServletActionContext的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Struts2中Action访问Servlet API的几种方法

    详解Struts2中Action访问Servlet API的几种方法 在通常的web开发中Request和Response对象比较常见,但在Struts2框架中由于Action能与JSP页面进行数据交互,所以通常都不会用到这两个对象.如果想在Struts2程序中用到这两个对象,也有解决方法 Struts2的Action并未直接与任何Servlet API耦合,这是Struts2的一个改良之处,因为Action类不再与Servlet API耦合,能更轻松的测试该Action.但如何访问? Web应

  • Struts和servlet不能共存问题解决方法

    在一个项目中,如果我们既用到了Struts2又用到了Servlet,项目运行时有可能无法正常访问Servlet,原因是在配置Struts的过滤器的时候,拦截了所有请求. <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 下面是servlet的配置 <servlet> <

  • Struts2访问servlet分享

    一:访问或添加request/session/application属性  复制代码 代码如下: public String scope() throws Exception{ ActionContext ctx = ActionContext.getContext(); ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app ctx.getSession().put("ses&quo

  • 详谈Servlet和Filter的区别以及两者在Struts2和Springmvc中的应用

    在javaweb开发中,Servlet和Filter是很重要的两个概念,我们平时进行javaweb开发的时候,会经常和Servlet和Filter打交道,但我们真的了解Servlet和Filter吗? 一.基本概念 Servlet: Servlet 是在WEB服务器上运行的程序.这个词是在 Java applet的环境中创造的,Java applet 是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务. 服务器上需要一些程序,

  • Struts2访问Servlet的三种方式

    基本介绍 在Struts2中,Action并没有直接和Servlet API耦合.虽然Struts2 中的Action访问Servlet API麻烦一些,但是这却是Struts2中Action的重要改良之一,方便Action进行单元测试. 尽管Action和Servlet API解耦会带来很多好处,然而在Action中完全不访问Servlet API几乎是不可能的,在实现业务逻辑时,经常要访问Servlet中的对象,如request.session和application等 . 在Struts2

  • 详解Spring Boot 访问Redis的三种方式

    目录 前言 开始准备 RedisTemplate JPA Repository Cache 总结 前言 最近在极客时间上面学习丁雪丰老师的<玩转 Spring 全家桶>,其中讲到访问Redis的方式,我专门把他们抽出来,在一起对比下,体验一下三种方式开发上面的不同, 分别是这三种方式 RedisTemplate JPA Repository Cache 开始准备 开始之前我们需要有Redis安装,我们采用本机Docker运行Redis, 主要命令如下 docker pull redis doc

  • C++ 的三种访问权限与三种继承方式

    三种访问权限 我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public.protected.private.要理解它们其实也很容易,看下面了一个例子. 父类: class Person { public: Person(const string& name, int age) : m_name(name), m_age(age) { } void ShowInfo() { cout << "姓名:" << m_name <&l

  • Python图片存储和访问的三种方式详解

    目录 前言 数据准备 一个可以玩的数据集 图像存储的设置 LMDB HDF5 单一图像的存储 存储到 磁盘 存储到 LMDB 存储 HDF5 存储方式对比 多个图像的存储 多图像调整代码 准备数据集对比 单一图像的读取 从 磁盘 读取 从 LMDB 读取 从 HDF5 读取 读取方式对比 多个图像的读取 多图像调整代码 准备数据集对比 读写操作综合比较 数据对比 并行操作 前言 ImageNet 是一个著名的公共图像数据库,用于训练对象分类.检测和分割等任务的模型,它包含超过 1400 万张图像

  • Struts2获取参数的三种方法总结

    Struts2获取参数的三种方法总结 前言: Struts2不在建议我们使用原生的servletAPI来获取参数,这样做的目的是事项Struts2的action与servlet进行解耦,可以在日后更加方便的对action类进行测试. Struts2获取参数的三种办法: (1)属性驱动方式 (2)模型驱动方式 (3)对象驱动方式 one by one 属性驱动方式 /* * 参数获取方式之属性驱动方式 */ public class TestAction extends ActionSupport

  • SpringMVC返回json数据的三种方式

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等. 1.第一种方式是spring2时代的产物,也就是每个json视图controller配置一个Jsoniew. 如:<bean

  • 解决SpringBoot跨域的三种方式

    一.什么是跨域 1.1.为什么会出现跨域问题 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现.同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互.所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port) 简单说A应用只能访问

  • springmvc url处理映射的三种方式集合

    目录 一.SpringMVC简介 二.工作流程与介绍 三.代码截图 以下组件通常使用框架提供实现: 1.DispatcherServlet:前端控制器 2.HandlerMapping:处理器映射器 3.Handler:处理器 4.HandlAdapter:处理器适配器 5. ViewResolver:视图解析器 6.View:视图 四.适配器作用 一.SpringMVC简介 SpringMVC是一种基于Spring实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模

  • SpringBoot配置 Druid 三种方式(包括纯配置文件配置)

    记录一下在项目中用纯 YML(application.yml 或者 application.properties)文件.Java 代码配置 Bean 和注解三种方式配置 Alibaba Druid 用于监控或者查看 SQL 状况: 1. 纯配置文件 .yml 或者 .properties (1)pom.xml 添加相关依赖 <!-- SPRINGBOOT WEB --> <dependency> <groupId>org.springframework.boot<

  • 详解SpringBoot禁用Swagger的三种方式

    目录 摘要 方法 禁用方法1: 禁用方法2: 禁用方法3: 摘要 在生产环境下,我们需要关闭swagger配置,避免暴露接口的这种危险行为. 方法 禁用方法1: 使用注解 @Value() 推荐使用 package com.dc.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Be

随机推荐