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

相关文章

重启顺风车的背后,是高德难掩的“野心”

以史鉴今,我们往往可以从今天的事情中,看到古人的智慧,也看到时代的进步。就如西汉后期文学家恒宽曾说的,“明者因时而变,知者随事而制”。 图源来自高德官方 近日,高德就展现了这样的智慧。在网约车市场陷入饱和状态时,高德审时度势,宣布重启顺风车业务,并在全国范围内大规模启动,首批覆盖珠三角、长三角及湖北省武汉市等共计65座城市,完成在出行服务领域的又一重要布局。 重启顺风车,增量市场的“蛋糕

黑神话悟空背后的技术揭秘与代码探秘

《重塑神话:黑神话悟空背后的技术揭秘与代码探秘》 引言 在国产游戏领域,《黑神话:悟空》无疑是一颗璀璨的明星,它不仅融合了深厚的中国文化元素,更在技术上实现了诸多突破,为玩家带来了前所未有的沉浸式体验。本文将深入剖析《黑神话:悟空》背后的关键技术,并通过代码案例展示其技术实现的魅力。 一、高精度动作捕捉技术 《黑神话:悟空》中的角色动作之所以如此逼真,得益于高精度动作捕捉技术的应用

【C++】C++ STL探索:Vector使用与背后底层逻辑

C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现 在string类文章中提及了STL容器间的接口是大差不差的,本篇将直接通过模拟实现Vector来讲解底层实现与使用。 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔

Docker核心原理解读:深度剖析Docker Daemon,掌控容器背后的引擎

容器技术已经成为现代应用程序开发和部署中的核心工具,而在Docker生态系统中,Docker Daemon 扮演着至关重要的角色。它不仅是Docker架构的核心,还负责容器的管理、镜像的操作、资源的分配等复杂任务。本文将深入解读Docker Daemon的工作原理,探讨它在Docker系统中如何高效运行,以及它如何与其他组件协同工作。 一、Docker架构回顾 在深入了解Docker Daem

<编码:隐匿在计算机软硬件背后的语言>示例电路列表

<<编码: 隐匿在计算机软硬件背后的语言>>一书中的示例电路的线上可交互示例. 关于 <<编码: 隐匿在计算机软硬件背后的语言>> 一书的介绍, 参考豆瓣的介绍: 分章节介绍包含了各章节示例电路的简要操作说明, 电路截图以及在线交互操作链接, 方便读者按图查找. 点击以下或左侧书签栏各章节链接进入章节介绍. 第4章 手电筒剖析(Anatomy of a Flashlight) 示例电路

王楠首次讲述Cocos Creator背后的故事

Cocos Creator发布至今,得到了许多开发者的支持和喜爱,甚至有小伙伴留言说:幸福来得太突然。水滴石穿,非一日之功。这款工具从诞生到问世究竟经历了怎么样的曲折,未来又会走向何方?这方面,大概没有谁比Cocos Creator制作人王楠更有发言权了。   今天不妨抽出10分钟,听听王楠的讲述,相信或多或少会对你有所启发。   开发Cocos Creator的初衷是什么?   我和几

淘宝架构师岑文初:技术发展背后的那个人~~

身人还是很平和的,最后我做好了所有的分析和架构设计,给阿里云留了一个后续统一集团开放的方案,然后带着没完成的开放的理想去了淘宝。 2010年: 空降淘宝,虽然新老板对我能力比较认可,但是淘宝的开放平台已经有了一个10个左右的小团队了,如何融入是最迫切的。我缺乏的是业务,了解的是平台,能力在于技术,于是天天帮助团队同学打杂,解决问题,慢慢的也用能力证明自己。一直处于一个团队攻坚和打杂

揭秘!焦虑症背后的隐形推手:气血不足,你了解多少?

在这个快节奏、高压力的时代,焦虑症似乎成了许多人心头挥之不去的阴霾。失眠、心悸、易怒、持续担忧……这些症状不仅影响着我们的生活质量,更在无形中侵蚀着我们的身心健康。然而,你是否知道,这些看似心理层面的困扰,实则可能与一个古老而深刻的中医理念紧密相连——气血不足。今天,就让我们一起揭开焦虑症与气血不足之间那层神秘的面纱。 一、气血:生命之根本 在中医理论中,气血被视为人体生命活动的物质基础,是维

薛定谔的空气墙?一文带你了解其背后的技术原理

封面图 悟空来了都得撞墙? 目前,被称作“村里第一个大学生”的国产3A游戏《黑神话:悟空》发售已经有一段时间了,游戏采用虚幻引擎4技术,仿佛将传统与现代的界限模糊,玩家游玩时沉浸感极强。然而,游戏也有不少令人诟病的部分,今天要说的就是网上不少人吐槽的黑神话中的“空气墙”问题。 “空气墙”指的是游戏场景设计中给玩家的视觉认知与操作反馈不统一的现象,具体表现为“这里看起来明明可以通行,但

2015年2月2日 奶农倒牛奶的背后

郎教授说: 2014年12月份开始起,新疆山东山西河北北京都发现奶农倒奶的问题 中国人均的喝奶量是32.4公斤,只是世界平均的1/3 中国是市场是4000W吨,也就是哈有8000W吨的潜力 2007年,2011年,和2014年12月都出现倒奶事件 因为从这个时刻开始起,玉米等饲料价格上涨,原材料价格上涨导致农民只能杀牛倒奶 从2011年开始国际市场奶粉的价格比国内低