四、 JSP04 Servlet 技术

四、 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 容器实现的 请求/响应模型进行交互
  • 运行流程主要如下图

四、 JSP04 Servlet 技术_第1张图片

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 的初始化参数值,应用范围的初始化
参数可以在部署描述符中使用 元素定义
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 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 的生命周期进行管理,如下图

四、 JSP04 Servlet 技术_第2张图片

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");
    }
}

  • 可以在网址栏中直接搜索设置的路径

四、 JSP04 Servlet 技术_第3张图片

  • 设置的路径无误的话,就会执行 Servlet 的创建和调用

s ServletException, IOException {
//输出在控制台
System.out.println(“HelloServlet”);
//输出在页面
resp.getWriter().write(“HelloServlet”);
}
}


- 可以在网址栏中直接搜索设置的路径

[外链图片转存中...(img-AqCPwHbm-1704933649410)]

- **设置的路径无误的话,就会执行 Servlet 的创建和调用**

你可能感兴趣的:(JSP,servlet,jsp,java,tomcat)