Servlet基础之API

文章目录

    • Servlet API
      • 1. 概述
      • 2. 相关对象概述
      • 3. Servlet 接口
      • 4. GenericServlet 抽象类
      • 5. HTTPServlet 类
      • 6. ServletRequest 和 HTTPServletRequest
      • 7. HttpServletRequest
      • 8. ServletResponse 和 HTTPServletResponse
      • 9. ServletConfig 和 ServletContext
      • 10. 部署描述符

Servlet API

1. 概述

Servlet API 是你的 Java Web 程序与 Servlet 容器(例如,Tomcat)之间的『约定』。

注意
Servlet 容器有且不仅只有 Tomcat 一种。后续内容就不再强调 Servlet 容器和 Tomcat 之间的关系,但凡提到 Tomcat 容器的场景,使用其它的 Servlet 容器也是可以的。

这个约定归结起来就是,Tomcat 将 Servlet 类载入内存,并由 Tomcat 调用 Servlet 对象的具体的方法这些方法所需的参数也是由 Tomcat 准备并传入的

简单来说就是一句话,你按照某种特定规则写好代码『放在这里等着』Tomcat 来调用。

Servlet 技术的核心是 Servlet 接口:

Servlet 接口
└── GenericServlet 抽象类└── HttpServlet 

你的 Servlet 类必须直接或间接实现的 Servlet 接口。通常,我们是继承 HttpServlet,从而间接实现 Servlet 接口。

// 直接实现 Servlet 接口
public class AServlet implements Servlet { ... }// 间接实现 Servlet 接口
public class BServlet extends GenericServlet { ... }// 间接实现 Servlet 接口
public class CServlet extends HttpServlet { ... }

2. 相关对象概述

在 web 项目运行期间,每个 Servlet 类最多只能有一个对象。它们都是『单例』的,它们都是(被动地)由 Tomcat 创建的。

如果你是直接实现的 Servlet 接口, Tomcat 在调用你的 Servlet 的 .service 方法时,会传入两个参数:

  • ServletRequest 其中封装了当前的 HTTP 请求,因此,Servlet 开发人员不必解析和操作原始的 HTTP 数据。

  • ServletResponse 表示对当前用户的 HTTP 响应,它使得将响应发回给用户变得十分容易。

如果你是间接实现的 Servlet 接口,本质上也是如此。

ServletRequest 和 ServletResponse 对象是『多实例』的。

对于每一个 WebApp,Tomcat 还会创建一个 ServletContext 实例,它也是『单例』的。这个对象中中封装了上下文的环境详情。

每个 Servlet 实例也都有一个封装 Servlet 配置的 ServletCongfig ,Servlet 和 ServletConfig 是『一一对应』的。

总结:一个 WebApp 在运行时,有:

  • 1 个 ServletContext 实例

  • N 个 Servlet 实例 (取决于 Servlet 类的数量)

  • N 个 ServletConfig 实例 (取决于 Servlet 类的数量)

  • 任意个 HTTPRequest / HTTPResponse 实例 (取决于用户请求的次数)

3. Servlet 接口

Servlet 接口中定义了 5 个方法:

#方法说明
1.init在 Servlet 第一次被请求时,被 Servlet 容器调用。
Tomcat 调用 .init 时,容器会传入一个 ServletConfig 对象。
2.service在每次用户发起请求时,被容器调用。
Tomcat 调用 .service 时,容器会传入代表用户请求和相应的 HTTPRequest 对象和 HTTPResponse 对象。
3.destroy在销毁 Servlet 时,被 Tomcat 调用。一般发生在卸载 WebApp 或关闭容器时。
4.getServletInfo这个方法返回一个用于描述 Servlet 的字符串。
5.getServlet这个方法用于返回由 Servlet 传给 .init 方法的 ServletConfig 对象。

.init.service.destroy 方法是 Servlet 的生命周期方法,另外两个方法是非生命周期方法。

4. GenericServlet 抽象类

GenericServlet 抽象类实现了 Servlet 接口,它为这些方法提供了默认的实现,并新增了一个 servletConfig 实例变量,用于在 init() 方法中将容器传入的 ServletConfig 对象保存起来。

5. HTTPServlet 类

HTTPServlet 在其父类 GenericServlet 的基础上进一步简化了实现了 Servlet 接口的工作。

HTTPServlet 有两个特性是 GenericServlet 所不具备的:

  1. 不用 Override service() 方法,而是 Override doGet() 或者 doPost() 方法。

  2. 使用 HttpServletRequest/HttpServletResponse,而非 ServletRequest/ServletResponse。

6. ServletRequest 和 HTTPServletRequest

每当 Tomcat 调用你的 Servlet 的 service 方法时,它都会创建一对新的 Request 和 Response 对象传入其中。

Tomcat 何时会调用你的Servlet 的 service 方法?

getParameter() 方法是 ServletRequest 中最常用的方法,该方法用于从 Request 对象中获取请求参数的值。

除了 getParameter() 外,类似用于获取请求参数的值的方法还有:

  • getParameterNames()

  • getParameterMap()

  • getParameterValues()

7. HttpServletRequest

由于我们更长使用的是 HTTPServlet 类,而不是 Servlet 接口,因此,我们更多地是接触并使用 HttpServletRequest,而不是 ServletRequest 。

HTTPServletRequest 实现并扩展了 ServletRequest 接口。

HttpServletRequest 扩展的常用方法有:

  • Stirng getRequestURL( )

  • Stirng getRequestURI( )

  • Stirng getContextPath( )

  • String getMethod( )

  • Cookie[] getCookies( )

  • HttpSession getSession( )

8. ServletResponse 和 HTTPServletResponse

Tomcat 在调用你的 Servlet 的 service() / doGet() / doPost() 方法时,除了会传入要给 Request 对象,还会传入一个 Response 对象:ServletResponse / HttpServletResponse

ServletResponse 隐藏了向浏览器发送响应的复杂过程。

在 ServletResponse 所有的方法中,最常用的方法之一是 getWriter() 方法,它返回一个可以向客户端发送文本的 java.io.PrintWriter 对象。默认情况下,PrintWriter 对象使用 ISO-8859-1 编码。

注意
有另外的一个向浏览器发送数据的方法叫 getOutputStream(),但这个方法是用于发送二进制数据的。因此大多数情况下使用的是 getWriter(),而非 getOutPutStream()。不要调用错了方法。

大多数情况下,你的 Servlet 通过 Tomcat 向客户端发送响应数据应该是一个 HTML 格式的字符串。

在发送这个 HTML 格式字符串前,应该先调用 setContentType() 方法,设置响应的内容类型,并将 text/html 作为参数传入。这是告诉浏览器,所发送给它的数据内容是 HTML 格式内容。

HTTPServletResponse 实现并扩展了 ServletResponse 接口。它所扩展的常用的方法有:

  • void addCookie ( Cookie cookie )

  • void sendRedirect ( String location )

9. ServletConfig 和 ServletContext

当 Tomcat 创建出你的 Servlet 的单例对象后,它会调用你的 Servlet 的 init() 方法,并传入一个 ServletConfig 对象。

ServletConfig 对象中封装这由 @WebServlet 注解或者 部署描述符 传给 Servlet 的配置信息。

这样传入的每一条信息就叫做 初始化参数,一个初始化参数由 key 和 value 组成。

@WebServlet(name="HelloServlet",urlPatterns = {"/hello.do"},initParams = {@WebInitParam(name="author", value="ben"),@WebInitParam(name="email", value = "hemiao3000@126.com")
})

为了获得 Servlet 的初始化参数,可以从容器传给 Servlet 的 ServletConfig 对象中调用 getInitParameter() 方法来获得。


ServletContext 代表着 WebbApp。每个 WebApp 只有一个 ServletContext 对象。

通过调用 ServletConfig 实例的 getServletContext() 方法,可以获得该 Servlet 所属的 WebApp 的 ServietContext 对象。

10. 部署描述符

在 servlet 3.0 之前,不支持注解的形式来配置 servlet,而是在 web.xml 中使用配置描述符。

<servlet><servlet-name>HelloServlet</servlet-name><servlet-class>HelloServlet</servlet-class><init-param><param-name>author</param-name><param-value>ben</param-value></init-param><init-param><param-name>email</param-name><param-value>hemiao3000@126.com</param-value></init-param>
</servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/HelloWorld/hello.do</url-pattern>
</servlet-mapping>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软考- 系统集成项目管理工程师2】

第一章-信息化知识-信息与信息化 今日座右铭&#xff1a;最好的偷懒方式&#xff0c;就是一次做好。 文章目录 第一章-信息化知识-信息与信息化前言一、信息1、信息的基本概念2、信息的传输模型3、信息的质量属性 二、信息系统1、系统的基本概念2、信息系统的生命周期 三、信息…

js-cookie的使用方法

js-cookie是一个简单的&#xff0c;轻量级的处理cookies的API。 js-cookie网站 一、安装 npm install js-cookie 二、引入js-cookie 在需要使用的页面直接引用即可。 import Cookies from "js-cookie"; 三、使用示例 以利用js-cookie实现token持久化为例&#…

Android-System 常用adb 命令

1、adb导出logcat&#xff1a;adb logcat > D:/log.txt 2、adb导出anr文件&#xff1a;adb pull /data/anr/trances.txt 3、adb连接安卓设备&#xff1a;adb connect 192.168.129.11:5555 4、选择安卓设备&#xff1a;adb -s 192.168.11.55 5、查看日志状态:getprop | grep …

IP类接口大全,含免费次数

IP查询 IP归属地-IPv4高精版&#xff1a;根据IP地址查询归属地信息&#xff0c;支持到中国地区&#xff08;不含港台地区&#xff09;街道级别&#xff0c;包含国家、省、市、区县、详细地址和运营商等信息。IP归属地-IPv4区县级&#xff1a;根据IP地址查询归属地信息&#xf…

IDEA 安装阿里Java编码规范插件

1.File>Settings 2.安装之后重启 开发过程中如果有不符合规范的地方&#xff0c;会自动出现提示

Ubuntu如何安装使用Nginx反向代理?

在Ubuntu上安装Nginx并配置使其生效是相对简单的过程。以下是一步一步的指南&#xff1a; 步骤 1&#xff1a;安装 Nginx 打开终端&#xff0c;并执行以下命令来安装 Nginx&#xff1a; sudo apt update sudo apt install nginx步骤 2&#xff1a;启动 Nginx 服务 安装完成…

【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 归并排序 代码实现&#xf…

pin to pin替代TI DRV8872的GLOBALCHIP直流电机驱动芯片GC8872,低成本、宽电压,内置电荷泵,短地短电源保护,限流

在现如今电机驱动芯片处于持续涨价的状态下&#xff0c;并且供货期货期长&#xff0c;偶尔缺货的状态下。为了降低设计成本&#xff0c;第一时间设计出优秀的产品占据市场高位。我这边推荐使用浙江GLOBALCHIP国产电机驱动芯片进行替换设计。供货稳定、价格低廉。GC8872是GLOBAL…

Android Glide从网络加载图片 点击可放大查看效果

前言 通过url来获取bitmap 然后通过glide工具来加载bitmap 来实现图片点击放大 废话不多说&#xff0c;直接上代码 代码 String netPhoto "xxx";//从网络加载缓存try {Glide.with(TakePhotoSurveyActivity.this).asBitmap().load(photoDesign).into(new CustomTa…

Flink实战三_TableAPISQL

接上文&#xff1a;Flink实战二_DataStream API 1、Table API和SQL是什么&#xff1f; 接下来理解下Flink的整个客户端API体系&#xff0c;Flink为流式/批量处理应用程序提供了不同级别的抽象&#xff1a; 这四层API是一个依次向上支撑的关系。 Flink API 最底层的抽象就是有…

CSS之webkit内核中的属性text-stroke

让我为大家介绍一下text-stroke 大家是否想过要弄一个描边过的文字&#xff0c;接下来&#xff0c;text-stroke就可以为你解决 text-stroke是一个复合属性&#xff0c;里面有两个参数&#xff1a;描边的尺寸 描边的颜色 <!DOCTYPE html> <html lang"en">…

书生浦语大模型 笔记作业汇总

第一节课笔记&#xff1a;https://blog.csdn.net/2301_80618119/article/details/135376409?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135376409%22%2C%22source%22%3A%222301_80618119%22%7D 第二节课笔记&#xff1a; …

[AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

蓝桥杯备战——10.超声波模块

1.分析原理图 蓝桥杯单片机板子的原理图做的简直是依托答辩&#xff0c;乱糟糟的不说还弄成黑白的&#xff0c;明明很简单的东西&#xff0c;弄成一大堆。 可以看到&#xff0c;J2跳线帽如果P10接N_A1,P11接N_B1就是用作超声波功能。N_A1用作发生超声波功能&#xff0c;而N_B1…

Android开发之UI控件

TextView 实现阴影效果的textview android:shadowColor"#ffff0000" 设置阴影颜色为红色android:shadowRadius"3" 设置阴影的模糊程度为3android:shadowDx"10" 设置阴影在水平方向的偏移android:shadowDy"10" 设置阴影在竖直方向的偏…

程序员的进阶之路-技术能力水平区分

当涉及到软件开发工程师的能力等级时&#xff0c;可以根据技能水平、工作经验和职责来划分。以下是初中高级软件开发工程师的详细介绍&#xff1a; 初级软件开发工程师&#xff1a; 具备基本的编程知识和技能&#xff0c;熟悉一门或多门编程语言&#xff0c;了解基本的算法和数…

PyFlink使用教程,Flink,Python,Java

环境准备 环境要求 Java 11 Python 3.7, 3.8, 3.9 or 3.10文档&#xff1a;https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/docs/dev/python/installation/ 打开 Anaconda3 Prompt > java -version java version "11.0.22" 2024-01-16 LTS J…

Nginx 1.25配置QUIC和HTTP3

Nginx 1.25配置QUIC和HTTP/3 Nginx在编译时需要配置相应的SSL库&#xff0c;以确保能够支持HTTP3.0和HTTP2.0等基于HTTPS的协议。这些加密算法主要由OpenSSL提供。另外&#xff0c;BoringSSL是谷歌创建的OpenSSL分支&#xff0c;专门用于支持TLS 1.3的UDP协议的0-RTT数据传输加…

2024 年人工智能(AI)会有哪些新趋势和新突破?无际Ai分享

随着科技的不断发展&#xff0c;人工智能领域正在以惊人的速度迈向前所未有的高度。在 2024 年&#xff0c;我们可以期待看到多个领域的重大突破&#xff0c;这将为人工智能技术带来新的应用和可能性。 以下是一些可能出现的新领域和突破性进展&#xff1a; 强化学习应用拓展&…

python中yield的用法

yield(生成器) v. 产生&#xff08;收益、效益等&#xff09;&#xff0c;产生&#xff08;结果&#xff09;&#xff1b;出产&#xff08;天然产品&#xff0c;农产品&#xff0c;工业产品&#xff09;&#xff1b;屈服&#xff0c;让步&#xff1b;放弃&#xff0c;让出&…