【JavaWeb】一文了解 Servlet 那点事
一、概述
-
Servlet(Server Applet)是 Java Servlet 的简称,称为小服务程序或服务连接器,使用 Java 语言编写的服务器端程序。从狭义上来讲,Servlet 是 Java 语言实现的一个接口;从广义上来讲,Servlet 是任何实现了 Servlet 接口的类。
-
特性:Servlet 独立于平台和协议
-
作用
- 开发动态资源(Servlet 也是服务器的一种资源,可供外界访问,比如浏览器)
- 接收浏览器请求并响应数据给浏览器
二、开发步骤
-
创建一个类并实现 javax.servlet.Servlet 接口
-
实现接口中的所有方法
-
在 service() 方法中处理请求和响应数据
-
配置 Servlet 访问地址,即配置 web.xml 文件(Servlet 2.5)
-
使用注解(Servlet 3.0),即
@WebServlet
(要求Servlet 3.0 +、Tomcat 8 +、Java EE 6.0 +)@WebServlet():标记在类上 name:servlet名字,等价于
<servlet-name></servlet-name>
urlPatterns:访问地址,等价于<url-pattern></url-pattern>
value:与urlPatterns相同,只有一个属性时,可省略
-
三、生命周期
在介绍 Servlet 之前,先提出四个问题(答案在最后):
- Servlet 对象由谁负责创建?
- Servlet 对象什么时候创建?
- Servlet 对象什么时候销毁?
- Servlet 是单例还是多例?
Servlet 的生命周期可以分为四个:
- 实例化:Servlet 容器 Tomcat 创建 Servlet 的实例
- 初始化:由容器调用 init() 方法,调用1次
- 请求与响应处理:若请求 Servlet,则容器调用 service() 方法,可调用多次
- 服务终止:正常关闭服务器时调用 destroy() 方法,调用1次
总结
首次访问 Servlet 创建对象并调用 init() 方法,然后调用 service() 方法,非首次访问则直接调用 service() 方法,正常关闭服务时调用 destroy() 方法
相关方法
- 构造方法:对象实例化时执行,必须是公共无参(1次)
void init(ServletConfig config)
:初始化时执行(1次)void init(ServletConfig config)
:每次请求都会执行(n次)void destroy()
:服务器正常关闭时执行(1次)
四、请求流程
-
浏览器发送请求,Tomcat 接收到请求后解析请求地址,获取要访问的项目和资源路径
-
Tomcat 服务器内部扫描该项目下的所有 Servlet ,并将每一个资源路径和对应类的全限定名存入 Map 中
// 资源路径作为key,全限定名作为value Map<String, String> map1 = new HashMap<>()
-
通过资源路径,从 map1 中获取对应类的全限定名
-
判断是否为第一次访问
// Servlet实例缓存池: Map<String, Servlet> map2 = new HashMap<>(); if (map2.get("全限定名") == null) { // 没有找到,则为第一次访问,跳到第五步 } else { // 找到,则不为第一次访问,跳到第七步 }
-
通过反射创建该 Servlet 实例对象并存入实例缓存池
-
创建 ServletConfig 对象,并调用 init() 方法
-
创建 request 和 response 对象
-
调用 service() 方法,并将 request 和 response 作为参数传递进来,通过 service() 中的 response 对象将数据传给浏览器,并在浏览器上显示
-
等待下一次访问
请求流程图:

五、请求与响应对象
1. 请求对象
- 作用:获取用户提交的请求参数
- 常用 API:
Request 相关 API | 描述 |
---|---|
String getMethod() | 获取请求方式(get/post) |
String getRequestURI() | 获取统一资源标识符(资源名字)/demo |
StringBuffer getRequestURL | 获取统一资源定位符(访问地址)http://localhost/demo |
String getProtocol() | 获取协议和版本 |
String getContextPath() | 获取上下文路径(项目名 path) |
String getHeader(String headName) | 获取指定请求头的值 |
String getParameter(String name) | 通过参数名获取一项参数值 |
String[] getParameterValues(String name) | 通过参数名获取一组同名的值(复选框、下列列表多选) |
Enumeration getParameterNames() | 获得所有的参数名 |
Map getParameterMap() | 获取表单所有的参数键和值,封装成 Map 对象 |
setCharacterEncoding() | 设置编码格式 |
Enumeration 相关 API | 描述 |
---|---|
boolean hasMoreElements() | 如果还有其它元素,返回 true |
E nextElement() | 返回下一个元素 |
2. 响应对象
-
作用:用于响应数据(响应行,响 应头,响应体)给浏览器
-
常用 API
Response 相关 API | 描述 |
---|---|
OutputStream getOutputStream() | 字节输出流(图片等) |
PrintWriter getWriter() | 字符打印流 |
PrintWriter | ServletOutputStream | |
---|---|---|
write | 不指定文本类型,√ | 不指定文本类型,× |
println | 不指定文本类型,√ | 浏览器没有显示 |
五、其它
(1)继承体系

GenericServlet 是一个通用的 Servlet,可以用来处理各种协议发出的请求和响应。
HttpServlet 是专门用来处理 HTTP 协议发送的请求
- 创建类继承 HttpServlet
- 重写参数以 Http 开头的 service 方法,进行请求处理和响应数据
- 不要调用父类的 service 方法,否则,报405错误
(2)ServletConfig对象
-
作用:用来封装Servlet初始化时的一些配置信息(解决硬编码问题)
-
常用方法
String getInitParameter("参数名")
:通过指定参数名获取参数值
(3)loadOnStartup属性
-
作用:让 Web 服务器启动时创建并初始化 Servlet
-
用法:
-
配置文件
-
注解:
@ WebServlet(loadOnStartup = 1)
-
-
说明:取值范围为1-10,值越小越先被加载,默认为-1
(4)通配符
通配符有两种,可以使用 /* 或 *.后缀名
/的优先级高于.后缀名 匹配规则:精确匹配,哪个更匹配就使用哪个
(5)映射
servlet-name 不能使用 default 和 jsp。原因是 default 和 jsp 已经被 Tomcat 使用,若以这两个命名,则会覆盖掉Tomcat中的。
- Servlet 对象由谁负责创建?Web 服务器(Tomcat)
- Servlet 对象什么时候创建?用户第一次访问时
- Servlet 对象什么时候销毁?服务器正常关闭或重启时
- Servlet 是单例还是多例?Servlet 值在第一次访问时创建对象,因此是单例的
转载自:https://juejin.cn/post/7135040811644764168