四、 Servlet 技术
4.1 认识 Servlet
Web 容器在处理 JSP 文件时,会将 JSP 文件通过 JSP 容器转换成可识别的 .java 文件
这个 .java 文就是一个 Servlet 类,JSP 技术就是基于 Servlet 实现的
4.1.1 什么是 Servlet
- Servlet 是一个符合特定规范的 Java 程序,是一个基于 Java 技术的 Web 组件
- 主要用于生成动态的内容
- Servlet 在服务器端运行,有 Servlet 容器管理
- Servlet 与客户端通过 Servlet 容器实现的 请求/响应模型进行交互
- 运行流程主要如下图
4.1.2 什么是 Servlet 容器
- Servlet 容器也被称为 Servlet 引擎,是 Web 服务器或应用程序服务器的一部分
- 用于在发送的请求和响应之上提供网络服务,管理和运行 Servlet/JSP
4.2 Servlet API 简介
Servlet 是一个特殊的 Java 类,这个 Java 类必须符合 Servlet 规范
Servlet API 定义在 javax.servlet 包中
主要描述和定义 Servlet 组件和运行环境之间的协定
4.2.1 Servlet 接口
- Servlet 接口定义了所有 Servlet 组件必须实现的方法
- 以及一系列初始化 Servlet、处理请求、释放 Servlet 等与 Servlet 的生命周期相关的方法
- Servlet 接口的常用方法
方法名称 | 功能描述 |
---|---|
void init(ServletConfig config) | 用于在处理客户请求前完成 Servlet 对象的初始化工作 |
void service(ServletRequesr req,Servlet Response res) | 用于处理客户端的请求 |
void destroy() | 用于释放 Servlet 对象所使用的资源 |
ServletConfig getServletConfig() | 返回传递给 init() 方法的 ServletConfig 对象,该对象包含此 Servlet 的初始化和启动参数 |
String getServletInfo() | 返回有关 Servlet 的信息,如作者,版本和版权 |
4.2.2 GenericServlet 抽象类
- 抽象类 GenericServlet 定义了通用的、不依赖于协议的 Servlet
- 该类实现了 Servlet 接口和 ServletConfig 接口
- 给出了出 service() 方法外的其他方法的简单实现
- GenericServlet 抽象类的常用方法
方法名称 | 功能描述 |
---|---|
public void init(ServletConfig config) | 是对 Servlet 接口中 init(ServletConfig config)方法的实现 将 ServletConfig 实例保存以备用 |
public void init() | 用于在子类中重写,以实现用户定制的初始化工作 |
public String getInitParameter(String name) | 通过调用 ServletConfig 接口的 getInitParameter(String name) 方法 获取设置的初始化参数,为了简化从 ServletConfig 对象中获取初始化参数 而定义的方法 |
public ServletContext getServletContext() | 通过调用 ServletConfig 接口的 getServletContext() 方法返回 ServletContext() 对象的引用,为了简化从 ServletConfig 对象中获取 ServletContext 对象而定义 方法 |
- 实现用户制定的初始化工作通常只需要重写不带参数的 init() 方法
- 如果重写带参的 init(ServletConfig config) 方法,则应包含 super.init(config) 代码
4.2.3 HttpServlet 抽象类
- Servlet 是运行在 Web 服务器的 Java 程序,基于 HTTP 来处理来自客户端的请求并给出响应
- 抽象类 HttpServlet 继承自 GenericServlet 类
- 除了具有 GenericServlet 类的相似的方法
- 还针对 HTTP 提供了相关的支持
- 能够针对 HTTP 的 POST、GET 等请求方式进行差异化处理
- HTTPServlet 抽象类的常用方法
方法名称 | 功能描述 |
---|---|
public void service(ServletRequest req, ServletResponse res) | 对 GenericServlet 类中 service() 方法的实现,将请求 分发给 protected 类型的 sercice() 方法 |
protected void service(HttpServletRequesr req, HttpServletResponse res) | 针对 HTTP 的 service() 方法,接收标准的 HTTP 请求,并将他们分 发给 HttpServlet 类中定义的一系列 doXxx() 方法 |
protected void doXxx(HttpServletRequesr req, HttpServletResponse res) | 针对 HTTP 的不同请求方面而定义的一系列处理方法,如 doGet()、doPost() 等 |
4.2.4 ServletContext 接口
-
ServletContext 接口定义了 Servlet 组件用来与 Servlet 容器进行通信的一组方法
-
例如:获取文件的 MIME 类型、调度请求或写入日志文件
-
一个 ServletContext 示例表示一个 Web 应用的上下文
-
JSP 内置对象 application 就是 ServletContext 的示例
-
ServletContext 接口的常用方法
方法名称 | 功能描述 |
---|---|
String getInitParameter(String name) | 获取应用范围的名称为 name 的初始化参数值,应用范围的初始化 参数可以在部署描述符中使用 <context-param> 元素定义 |
void setAttribute(String name,Object object) | 设置名称为 name 的属性 |
Object getAttribute(String name) | 获取名称为 name 的属性 |
void removeAttribute(String name) | 从 Servlet 上下文中删除局域给定名称的属性 |
String getRealPath(String path) | 返回参数所代表目录的真是路径 |
void log(Stirng message) | 记录一般日志信息 |
4.2.5 ServletConfig 接口
- Servlet 容器使用 ServletConfig 接口的示例向 Servlet 组件传递配置信息
- ServletConfig 接口的常用方法
方法名称 | 功能描述 |
---|---|
Enumeration <String> getInitParameterNames() | 获取 Servlet 所有初始化参数的名称 |
String getInitParameter(String name) | 获取以 name 命名的初始化餐数值 |
ServletContext getServletContext() | 返回 Servlet 的上下文对象引用 |
4.3 Servlet 的生命周期
Servlet 生命周期可被定义为 Servlet 从创建直到销毁的整个过程
包括加载和实例化、初始化、服务及销毁
4.3.1 Servlet 生命周期简介
- Servlet 接口中的 init() 方法、service() 方法和 destroy() 方法表示了 Servlet 的生命周期
- Servlet 不能独立运行,必须被部署在 Servlet 容器中
- Servlet 容器会对 Servlet 的生命周期进行管理,如下图
1、加载和实例化
- 当客户端向某个 Servlet 发送一个请求时,Servlet 容器会查找内存中是否存在该 Servlet 的实例
- 如果不存在,就会创建一个实例
- 如果存在,就会之间从内存中取出该示例响应请求
2、初始化
- Servlet 容器在完成 Servlet 实例化后,会调用该 Servlet 的 init() 方法进行初始化
- 初始化的目的是让 Servlet 在处理客户端请求前完成一些准备工作
- 对于每个 Servlet 实例,Servlet 容器只调用一次 init() 方法
3、服务
- Servlet 容器会调用 Servlet 的 service() 方法处理客户端的请求
- HttpServlet 的 service() 方法则会根据不同的请求方法(GET、POST 等)
- 将请求分别发送到 doGet()、doPost() 等方法进行处理
4、销毁
- Servlet 容器既负责创建 Servlet 实例,又负责销毁 Servlet 实例
- 当 Servlet 实例应当被释放时,Servlet 容器就会调用 destroy() 方法
- destroy() 方法负责释放 Servlet 实例所使用的资源,而不是之间回收 Servlet 实例
4.4 实现 Servlet
实现 Servlet 大致分为四个步骤
1、创建普通的 Java 类
2、实现 Servlet 的规范
3、重写 service() 方法,用于处理请求
4、设置注解,指定访问的路径
4.4.1 实现 Servlet 步骤01: 创建普通的 Java 类
-
在 Web 项目中创建一个 Java 类
-
我这里命名为 ”HelloServlet“
-
代码示例 01
package com.example.demo;
public class HelloServlet {
}
4.4.2 实现 Servlet 步骤02:实现 Servlet 的规范
- 实现 Servlet 的规范 方式主要有以下几种
- 继承 HttpServlet 类
- 继承 GenericServlet 类
- 实现 Servlet 接口
- 最常用的是 继承 HttpServlet 接口
- 代码示例 02
package com.example.demo;
import javax.servlet.http.HttpServlet;
public class HelloServlet extends HttpServlet {
}
4.4.3 实现 Servlet 步骤03:重写 service() 方法
-
重写 service() 方法,用于处理页面的请求,以及响应页面
-
参数 req 表示请求,参数 resp 表示响应
-
代码示例 03
package com.example.demo;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//输出在控制台
System.out.println("HelloServlet");
//输出在页面
resp.getWriter().write("HelloServlet");
}
}
4.4.4 实现 Servlet 步骤04:设置注解
- 设置注解,指定 Servlet 的访问路径
- 设置注解语法
@WebServlet("/路径")
- 为 Servlet 设置注解后,可以直接在搜索此页面
- 代码示例 04
package com.example.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//设置注解
@WebServlet("/ser01")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//输出在控制台
System.out.println("HelloServlet");
//输出在页面
resp.getWriter().write("HelloServlet");
}
}
- 可以在网址栏中直接搜索设置的路径
- 设置的路径无误的话,就会执行 Servlet 的创建和调用
s ServletException, IOException {
//输出在控制台
System.out.println(“HelloServlet”);
//输出在页面
resp.getWriter().write(“HelloServlet”);
}
}
- 可以在网址栏中直接搜索设置的路径
[外链图片转存中...(img-ctfi0hOT-1685257076158)]
- **设置的路径无误的话,就会执行 Servlet 的创建和调用**