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;}@Overridepublic void setServletRequest(HttpServletRequest request) {this.request = request;}@Overridepublic void setServletResponse(HttpServletResponse response) {this.response = response;}@Overridepublic 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@112e422org.apache.catalina.connector.ResponseFacade@13f8b4corg.apache.catalina.core.ApplicationContextFacade@d244ddorg.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.获取ServletContextServletContext 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.获取sessionMapMap<String,Object> sessionMap = context.getSession();sessionMap.put("sessionAttr", "hello session map");//3.获取applicationMapMap<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的。


Struts2访问Servlet的三种方式相关推荐

  1. 访问Servlet的几种方式

    文章目录 访问Servlet的几种方式 1.servlet直接转发到另一个servlet 2.使用a标签跳转到servlet 3.表单提交 4.Ajax请求Servlet ①.通过URL调用(以GET ...

  2. 【OpenCV】OpenCV访问像素点的三种方式

    环境配置   VS2013+OpenCV3.0+Win7(X64)    前言   OpenCV是图像处理最常用的库之一.它提供了许多常用的图像处理算法相关的函数,极大地方便了图像处理方法的开发,而图 ...

  3. bash shell脚本访问PostgreSQL的三种方式

    bash脚本里有三种方式访问PostgreSQL数据库 但前提是要设置密码文件.当然对于有系统对应账户的数据库角色可以绕过密码登录环节,如 1 $ sudo -u postgres psql 或 1 ...

  4. COS中访问文件的三种方式

    1.通过FID来访问文件(比如EF,DF) 2.通过SFI来访问文件(有些COS命令可以通过SFI来快速访问文件,而不需要事先选中文件) 3.通过文件名来访问文件(只能是DF文件) 转载于:https ...

  5. 安装web服务器访问站点的三种方式,Web服务器配置方法

    您可能感兴趣的话题: 服务器配置 核心提示:本教程为大家介绍web服务器的配置方法. Web服务器概述 Web服务器又称为WWW服务器,它是放置一般网站的服务器.一台Web服务器上可以建立多个网站,各 ...

  6. android获取自定义属性,android 自定义控件中获取属性的三种方式(转)

    第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值. (1)在xml文件中设置属性值 android:layout_width="f ...

  7. 实现内网映射的三种方式:

    实现内网映射的三种方式: 1.ngrok. 1)下载ngrok  下载地址:https://ngrok.com/download  选择合适的版本下载,我下载的是win64为的是这样: 2)解压下载下 ...

  8. 【小家Spring】SpringBoot中使用Servlet、Filter、Listener三大组件的三种方式以及原理剖析

    每篇一句 要么就安逸的穷,要么就拼命的干 前提概要 web开发使用Controller基本能解决大部分的需求,但是有时候我们也需要使用Servlet,因为相对于拦截和监听来说,有时候原生的还是比较好用 ...

  9. Servlet 的三种创建方式

    Servlet 创建有三种方式. 1.实现 Servlet 接口 因为是实现 Servlet 接口,所以我们需要实现接口里的方法. 下面我们也说明了 Servlet 的执行过程,也就是 Servlet ...

最新文章

  1. linux 瞬间文件数没了,关于linux:如何快速汇总文件中的所有数字?
  2. matplotlib安装
  3. 回调函数function的test
  4. .NET体系中的源程序安全问题
  5. com.mysql.jdbc.NotUpdatable: Result Set not updatable (references no primary keys).(解决方法)
  6. console和windows子系统
  7. 朴素贝叶斯与贝叶斯网络
  8. css遮罩层从下往上_CSS:图片自带3px下边距的bug修复
  9. 使用rem进行页面适配
  10. Nutch-1.6在Hadoop环境下的安装配置
  11. RJ45和RJ11的线序以及用途
  12. 2017年总结与展望
  13. 一些文字游戏....
  14. 无人驾驶失败案例汇总
  15. 一、pytorch环境配置
  16. windows服务器如何搭建网站,Windows系列服务器网站搭建详细过程
  17. 海域重力场与垂直基准产品构建及质量评估系统
  18. 东北大学计算机硬件题库,东北大学20春学期《计算机硬件技术基础》在线平时作业123答案100...
  19. MPSK通信系统的Monte Carl仿真(matlab实现,附源码)
  20. 免费电子书 工具 开发工具包 各类资源 下载 .

热门文章

  1. Linux中Tomcat 服务的搭建
  2. css里的符号含义【串联选择器】和【后代选择器】
  3. 【Liunx】Linux 文件基本属性
  4. GitHub+jsDelivr+PicGo+Visual Studio Code 打造稳定、快速、高效、免费图床
  5. C#LeetCode刷题之#367-有效的完全平方数(Valid Perfect Square)
  6. there are so many javascript library
  7. 如何使用Docker Volumes在基于Docker的应用程序上启用实时重新加载
  8. freecodecamp_我在1个月内完成了整个freeCodeCamp课程(并记录了所有内容)
  9. 这是可用于下一个项目的React Native工具列表
  10. dagger2 注入_如何使用Dagger 2在您的应用程序中实现依赖注入