HttpServlet背后的那些事!

2024-04-03 00:32
文章标签 httpservlet 背后

本文主要是介绍HttpServlet背后的那些事!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

阅读本篇文章大约花费您4分钟!


  我们自己新建一个Servlet类的时候,我们通常会继承自HttpServlet类,并且编译器也是默认帮我们继承了HttpServlet类,为什么我们要继承HttpSerlvet类呢?初学Web的同学一定知道Servlet类,并且熟知里面的五个方法和Serlvet的生命周期,为什么到具体使用Serlvet的时候却和HttpServlet关系深厚,看起来和Serlvet类好像没什么关系?

  今天我们就来看一下这其中到底是怎么回事。我们需要了解三个类,分别是Servlet,GenericServlet,HttpServlet。

Servlet接口

  Servlet中一共有五个方法,其中包含三个生命周期方法:

  • init(ServletConfig config) 初始化方法【生命周期方法】
  • service()方法 具体的操作方法 【生命周期方法】
  • destroy()方法 销毁方法 【生命周期方法】
  • getServletInfo() 返回Serlvet描述信息 【非生命周期方法】
  • getServletConfig() 返回servlet配置对象 【非生命周期方法】

实现serlvet接口我们必须重写这五个方法,显然这是不友好的,所以有一个GenericServlet类对Servlet进行了封装。

GenericServlet类

  GenericServlet类是一个抽象类,实现Servlet接口,其中主要完成了以下工作:

  1. 将init(ServletConfig config)方法中的config对象赋给类的成员变量,可以通过getServletConfig()获得
  2. 为Servlet接口所有方法提供默认的实现(有的是空方法体)
  3. 提供一个新的不带参数的init()方法,子类通过重写这个方法而不是原始的init()方法来进行初始化工作

  大致的实现代码如下:

abstract class GenericServlet implements Servlet,ServletConfig{private ServletConfig servletConfig;public void init(ServletConfig servletConfig) throws ServletException {this.servletConfig=servletConfig;//调用自定义的init() this.init();}//自定义的init()方法,可以由子类覆盖public void init(){ }//实现service()空方法,并且声明为抽象方法,强制子类必须实现service()方法 public abstract void service(ServletRequest request,ServletResponse response) throws ServletException,java.io.IOException{}//实现空的destroy方法public void destroy(){ }}

  自定义init()方法的原因是:如果子类要初始化必须覆盖父类的init(ServletConfig)而使它无效, this.servletConfig=servletConfig不起作用 这样就会导致空指针异常。自定义init()后,如果子类要初始化,可以直接覆盖不带参数的init()方法。

  不该参数的init()方法不是生命周期方法。

  进行了这样的封装,一个Servlet继承自GenericServlet要方便很多,但是在网络应用中,离不开Http协议,而GenericServlet中的方法还很少,无法满足我们的使用,于是出现了HttpServlet。

HttpServlet类

  HttpServlet是一个抽象类,进一步继承了GenericServlet。它不仅进一步封装了Serlvet,还提供了很大Http相关的方法,关于这些方法的使用都很简单,这里不再赘述,主要看一下HttpServlet是如何改进GenericServlet的。

  在HttpServlet中,主要做了如下两个改动:

  1. 重写原始service()方法,并且重新定义了一个service(HttpServletRequest req,HttpServletResponse res),注意这里的两个参数变了,HttpServletRequest是ServletRequest的子类,封装了Http相关内容,HttpServletResponse也是一样。
  2. 在自定义的service()方法中,针对不同的请求分别调用处理不同请求的方法doGet(),doPost()

  代码如下:

abstract class HttpServlet extends GenericServlet{//HttpServlet中的serviceprotected void service(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse){//该方法通过httpServletRequest.getMethod()判断请求类型调用doGet() doPost()}//必须实现父类的service()方法public void service(ServletRequest servletRequest,ServletResponse servletResponse){HttpServletRequest request;HttpServletResponse response;//由于HttpSerlvetRequest/response是ServletRequest/response的子类,可以转换try{request=(HttpServletRequest)servletRequest;response=(HttpServletResponse)servletResponse;}catch(ClassCastException){throw new ServletException("non-http request or response");}//调用service()方法this.service(request,response);}}

  经过HttpSerlvet封装之后,我们只需要针对不同的请求重写doPost()或者doGet()方法即可,也就是我们平时在eclipse中最常使用的方式。

  这就是Servlet到HttpServlet的过程,了解了这个过程有助于帮助Serlvet的理解,平时在学习的时候,也应该从底层原理取理解一项技术,这样不仅能帮助我们理解,也可以学习到很多优秀的编程思想,这也是大家都建议程序员要学会阅读源码的原因之一。

  希望大家都可以在自己的道路上闯出一片天地!

这篇关于HttpServlet背后的那些事!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/871473

相关文章

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

大脑临界状态:探索思维背后的物理机制

在深度思考或创造性灵感的涌现时刻,个体常体验到一种介于混乱与有序之间的特殊心理状态。这种感受实则反映了大脑在认知过程中的临界状态,这是一种涉及复杂物理现象的心理活动表现。近期研究表明,大脑结构中存在着与临界性密切相关的物理特性,这为理解大脑功能提供了新的科学依据。 自然界的相变现象,如冰融化为水,为我们提供了一个理解大脑临界状态的直观比喻。在思考过程中,大脑神经元的活动模式经历类似的

[大师C语言(第三十五篇)]C语言Excel操作背后的技术

C语言是一种高效且灵活的编程语言,但在处理Excel文件时,通常需要借助第三方库,因为C语言标准库并不直接支持Excel文件格式。在C语言中操作Excel文件,我们可以使用如libxlsxwriter、libxlsxreader等第三方库来实现。本文将深入探讨C语言Excel操作背后的技术,并通过详细的代码示例来展示这些技术的实际应用。 第一部分:使用libxlsxwriter库创建Excel文

钱也许会让人败坏,但没有钱,败坏的可能性更大VS贪婪的背后是恐惧

诗人纪伯伦,曾经写过一则寓言,说他在漫游四方的时候,曾经在一个岛上见过一个人头铁足怪物,在一刻不停的吃着呢土,喝着海水。纪伯伦在旁边观察良久,然后走过去问,“你从不感到满足吗?你的饥渴永远不会得到消解吗?”那个怪物回答说:“不,我已经满足了,我甚至已经吃喝的很疲倦了,但是我总是担心呐,明天没有泥土可以吃,没有海水可以喝啊。” 第一次看到这个故事的时候,我心里确实是被惊了一下。有的时候不管是他人,还

The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path

今天把一台电脑上的一个含有jsp的工程铐到其他电脑上,jsp页面开头部分报错,(The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build  Path)。 解决办法: 右击自己的web工程      选择Build Path--->Java Build Path--->Libraries---

转基因技术的伦理之争:高科技背后的生命敌对性隐患

转基因技术的生命伦理争议 转基因技术虽具高科技含量,但其背后涉及的生命伦理问题令人担忧。这项技术通过保护一种生命来杀害另一种生命,被认为是“生命敌对性”技术。类似于原子弹的杀伤力众所周知,但转基因技术却被误认为是为生命服务的高科技,缺乏有效的限制,潜藏着巨大的风险。 转基因技术在农业中的应用 转基因技术在农业领域广泛应用,如转基因棉花、大豆和玉米,都是通过杀害其他生命实现的。

路由器IP地址可以随便改吗?了解背后的真相与操作要点

随着网络的普及和智能家居的发展,路由器作为连接我们与数字世界的桥梁,其重要性日益凸显。在使用路由器的过程中,IP地址是一个关键的概念。然而,很多人对于路由器IP地址的修改存在疑问:是否可以随意更改?更改后又会有哪些影响?虎观代理小二将为您解答这些问题,帮助您更好地理解和使用路由器。 一、路由器IP地址的作用与分类 IP地址,即互联网协议地址,是分配给每个连接互联网的设备的唯一标识符。路由器

为何Proteus用户争相拥抱SmartEDA?揭秘背后的强大吸引力!

在电路设计与仿真领域,Proteus一度以其稳定性能和丰富功能赢得了众多用户的青睐。然而,近年来,越来越多的Proteus用户开始转向SmartEDA,这一新兴电路仿真软件正迅速崭露头角,成为行业内的翘楚。那么,究竟是什么原因促使这些用户纷纷转向SmartEDA呢?今天,就让我们一同揭秘SmartEDA背后的强大吸引力。 首先,SmartEDA在设计功能上的全面性是其一大优势。相较于Prot

一行超长日志引发的 “血案” - Containerd 频繁 OOM 背后的真相

案发现场:混沌初现 2024年6月10日,本应是平静的一天。但从上午 9 点开始,Sealos 公有云的运维监控告警就开始不停地响。北京可用区服务器节点突然出现大量 “not ready” 告警,紧接着,系统自动触发 004 节点重启,让服务暂时恢复了正常。 就在我以为这只是个小插曲的时候,7分钟后,广州可用区服务器也沦陷了!001 节点不得不重启以求自保。事情似乎并没有那么简单。 “发

[大师C语言(第三十二篇)]C语言异常处理背后的技术

C语言,作为一种古老且广泛使用的编程语言,在许多系统中扮演着核心角色。然而,与其他现代编程语言相比,C语言并没有内置的异常处理机制。尽管如此,C语言提供了一些技巧和模式,使得开发者能够有效地处理异常情况。本文将深入探讨C语言中异常处理的背后技术,并通过详细的代码示例来展示这些技术的实际应用。 第一部分:错误码和返回值 C语言中最基本的异常处理技术是通过错误码和返回值来实现的。函数通过返回特定的