热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Struts2访问Servlet的三种方式

这篇文章主要介绍了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 sessiOnMap= context.getSession(); 
    sessionMap.put("sessionAttr", "hello session map"); 
    //3.获取applicationMap 
    Map 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 getApplication()
返回一个Application级的Map对象。
static ActionContext getContext()
获取当前线程的ActionContext对象。
Map getParameters()
返回一个包含所有HttpServletRequest参数信息的Map对象。
Map getSession()
返回一个Map类型的HttpSession对象。
void setApplication(Map application)
 设置Application上下文。
void setSession(Map session)
设置一个Map类型的Session值 。

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

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

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


推荐阅读
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文介绍如何在Java项目中使用Log4j库进行日志记录。我们将详细说明Log4j库的引入、配置及简单应用,帮助开发者快速上手。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 探讨了小型企业在构建安全网络和软件时所面临的挑战和机遇。本文介绍了如何通过合理的方法和工具,确保小型企业能够有效提升其软件的安全性,从而保护客户数据并增强市场竞争力。 ... [详细]
  • 在本周的白板演练中,Apache Flink 的 PMC 成员及数据工匠首席技术官 Stephan Ewen 深入探讨了如何利用保存点功能进行流处理中的数据重新处理、错误修复、系统升级和 A/B 测试。本文将详细解释保存点的工作原理及其应用场景。 ... [详细]
  • 本文详细介绍了 Flink 和 YARN 的交互机制。YARN 是 Hadoop 生态系统中的资源管理组件,类似于 Spark on YARN 的配置方式。我们将基于官方文档,深入探讨如何在 YARN 上部署和运行 Flink 任务。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 本文介绍如何将自定义项目设置为Tomcat的默认访问项目,使得通过IP地址访问时直接展示该自定义项目。提供了三种配置方法:修改项目路径、调整配置文件以及使用WAR包部署。 ... [详细]
author-avatar
采蘑菇的灵的fans
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有