全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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的。

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


# Struts2访问Servlet  # Struts访问Servlet  # Struts2  # Servlet  # 详谈Servlet和Filter的区别以及两者在Struts2和Springmvc中的应用  # 详解Struts2中Action访问Servlet API的几种方法  # Struts2访问servlet分享  # Struts和servlet不能共存问题解决方法  # 的是  # 键值  # 这是  # 有一  # 过了  # 是由  # 它是  # 可以通过  # 毋庸置疑  # 可以直接  # 种方法  # 需要注意  # 要使  # 大家多多  # 有一个  # 这三种  # 类中  # 象中  # 单元测试  # 这却 


相关文章: 如何快速完成中国万网建站详细流程?  建站之星如何助力企业快速打造五合一网站?  ,石家庄四十八中学官网?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  如何在阿里云ECS服务器部署织梦CMS网站?  如何通过虚拟主机空间快速建站?  c++怎么用jemalloc c++替换默认内存分配器【性能】  建站之星logo尺寸如何设置最合适?  成都网站制作报价公司,成都工业用气开户费用?  如何续费美橙建站之星域名及服务?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何快速登录WAP自助建站平台?  如何用花生壳三步快速搭建专属网站?  如何通过网站建站时间优化SEO与用户体验?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  如何获取上海专业网站定制建站电话?  建站之星后台密码遗忘?如何快速找回?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  宝塔面板如何快速创建新站点?  网站制作服务平台,有什么网站可以发布本地服务信息?  英语简历制作免费网站推荐,如何将简历翻译成英文?  ,网页ppt怎么弄成自己的ppt?  如何选择高效可靠的多用户建站源码资源?  南京网站制作费用,南京远驱官方网站?  Swift中swift中的switch 语句  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何用好域名打造高点击率的自主建站?  建站主机CVM配置优化、SEO策略与性能提升指南  如何快速搭建高效WAP手机网站?  如何通过虚拟主机快速搭建个人网站?  智能起名网站制作软件有哪些,制作logo的软件?  如何在香港免费服务器上快速搭建网站?  如何设置并定期更换建站之星安全管理员密码?  建站之星代理如何获取技术支持?  如何高效利用亚马逊云主机搭建企业网站?  如何用低价快速搭建高质量网站?  中山网站推广排名,中山信息港登录入口?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  个人网站制作流程图片大全,个人网站如何注销?  Swift开发中switch语句值绑定模式  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何零基础在云服务器搭建WordPress站点?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  香港服务器网站推广:SEO优化与外贸独立站搭建策略  油猴 教程,油猴搜脚本为什么会网页无法显示?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  建站主机服务器选购指南:轻量应用与VPS配置解析  建站之星如何实现网站加密操作? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。