四、 JSP04 Servlet 技术

news2024/12/30 2:42:37

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

image-20230528125725792

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 的生命周期进行管理,如下图

image-20230528141546845

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

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

image-20230528145639995

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

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


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

[外链图片转存中...(img-ctfi0hOT-1685257076158)]

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

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

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

相关文章

Linux系统编程学习 NO.5 ——shell命令行的概念以及原理、权限的概念

1.shell命令行的概念以及原理 首先&#xff0c;用户下达指令需求。此时Linux操作系统的内核kernel&#xff0c;并不会直接接收用户下达的指令&#xff0c;因为操作系统不擅长跟用户打交道。那么指令要如何下达呢?这就命令行解释器来对用户的指令进行处理。 1.1.shell命令行的…

每日学术速递5.26

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Text2NeRF: Text-Driven 3D Scene Generation with Neural Radiance Fields 标题&#xff1a;Text2NeRF&#xff1a;具有神经辐射场的文本驱动 3D 场景生成 作者&#xff1a;Jingb…

从组件化角度聊聊设计工程化

目录 设计系统 设计系统的定义 设计系统的优势 设计系统存在的问题 设计工程化 设计系统探索 设计系统落地实践 Design Token Design Token 实践 设计工程化理想方案构想 展望 参考文献 近几年围绕业务中台化的场景&#xff0c;涌现出了许多低代码平台。面对多组件…

RAW、RGB 、YUV三种图像格式理解

文章目录 1. 背景2. 相关概念2.1 颜色与色彩空间2.2 RAW图像2.3 RGB图像2.4 YUV图像 3. 分类简图 RAW、RGB 、YUV三种图像格式理解 1. 背景 在工作中&#xff0c;经常听到用来描述图像格式的RAW&#xff0c;RGB与YUV&#xff0c;但一直没有系统的进行了解&#xff0c;处于局部认…

Redis实战之实现共同关注

Redis实战之实现共同关注 一 需求 二 实现 package com.hmdp.service.impl;import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.…

用ChatGPT一分钟自动产出一份高质量PPT

如何用ChatGPT一分钟自动产出一份高质量PPT&#xff0c;节约时间摸鱼呢&#xff1f;废话少说&#xff0c;直接上案例。 一.用ChatGPT做一下提问&#xff0c;这里我用的小程序万事知天下&#xff0c;根据自己PPT的需求&#xff0c;制作chatgpt的prompt就行了。 请帮我创建一个以…

Spring Security 核心解读(一)整体架构

Spring Security 整体架构 前提整体架构Servlet 整体的过滤器模型Security 过滤器链自定义过滤器 实际开发解决方案一个替代cookie认证的filter其他组件&#xff0c;后续抽时间再整理整理 前提 开源项目一手文档基本都在github&#xff0c;标准文档基本都在官网。 最好的文档就…

在Centos Stream 9上Docker的实操教程 - Docker的常用命令

在Centos Stream 9上Docker的实操教程 - Docker的常用命令 Docker启动类命令Docker镜像命令镜像列表 docker images镜像查找 docker search拉取镜像 docker pull删除镜像 docker rmi查看占用信息 docker system df容器创建新镜像 docker commit 容器命令启动容器 docker run查看…

【历史上的今天】4 月 27 日:Tumblr 上线;施乐推出了 Star 工作站;第一台安德伍德打字机诞生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 27 日&#xff0c;在 1791 年的今天&#xff0c;摩斯电码的共同发明者、电报发明者塞缪尔摩斯&#xff08;Samuel Morse&#xff09;诞生。摩斯最开始是一…

基于springboot + vue 的学生成绩管理系统

基于springboot vue实现的学生成绩管理系统 主要模块&#xff1a; 1&#xff09;学生模块&#xff1a;我的成绩、成绩统计、申述管理、修改密码 2&#xff09;教师模块&#xff1a;任务管理、对学生班级任务安排、班级学生的成绩查看、申述管理 3&#xff09;管理员模块&…

Vue自定义插件的使用

通过 Vue 实例绑定方法&#xff1a; 在 plugins.js 文件中创建 filter 过滤器&#xff0c;定义一个只返回前四个字符的方法。 export default {install(Vue){// 定义过滤器Vue.filter(mySlice,function(value){return value.slice(0,4);})} } 由于我们之前在 main.js 文件中引入…

六级备考20天|CET-6|翻译练习|真题·红楼梦|8:50~9:08+11:33~12:00

目录 1 中文 2 英文​ 3 解析 4 订正 ​ 1 中文 漏翻译&#xff1a;具有很强的艺术感染力&#xff01; 2 英文 3 解析 tell 讲述 tragic love story 悲剧性爱情故事 own painful personal experience 自己痛苦的个人经历 major/minor characters 主要/次要人物 be viv…

SSH爆破攻击及应急响应/事件处置

提示&#xff1a;本文是我做的笔记&#xff0c;有问题可以留言 目录 前言一、什么是SSH&#xff1f;二、开始前的准备1.扫描2.准备爆破3.准备ssh登录登陆后的准备nc反弹 应急响应/事件处置1.查看网络连接情况2.查看守护进程3.删除&#xff0c;结束异常后门4.修改密码 总结 前言…

day40_servlet

今日内容 零、 复习昨日 一、注解 二、改造项目 三、请求转发 四、重定向 零、 复习昨日 一、注解(Annotation) 注解,又称为注释.它是给程序看的注释. JDK1.5后才出现的,作用是为了提高开发效率的,如何做到?(一个注解可以简化很多很多代码…) 常见注解: Override 1.1 自定义注…

Linux基础开发工具之软件包管理器

目录 前言 1.什么是软件包 2.软件下载的三种方式 3. Linux软件生态 4. 使用yum安装软件 5.yum源的相关介绍 总结&#xff1a; 前言 Linux作为一款操作系统&#xff0c;其自然也和我们其他的操作系统一样需要安装对应得软件去满足我们的需求&#xff0c;因此为了更好的下载…

ICV报告: ADAS SoC市场规模将在2024年迎来较大突破

随着先进驾驶辅助系统&#xff08;ADAS&#xff09;的出现和对于自动驾驶的追求&#xff0c;汽车行业正在经历快速转型。这些技术进步的核心是ADAS SoC&#xff0c;它是实现多个功能集成于单一平台的关键组件。ADAS SoC已经成为智能汽车的重要驱动因素&#xff0c;彻底改变了安…

ArduPilot开源代码之H743+BMI270x2+ChibiOS配置适配

ArduPilot开源代码之H743BMI270x2ChibiOS配置适配 1. 源由2. 配置适配2.1 bootloader配置2.2 flight controller配置 3. 4.3.6固件编译Step 1: 获取源代码Step 2: 准备编译环境Step 3: 复制配置文件Step 4: 编译bootloaderStep 5: 编译飞控 4. 基础配置4.1 机型配置4.2 IMU校准…

通过python采集lazada商品详情数据接口,支持多站点。

为了采集Lazada商品详情&#xff0c;您可以使用Python的网络爬虫库&#xff08;例如BeautifulSoup、Scrapy等&#xff09;来获取页面内容。以下是基本步骤&#xff1a; 安装所需的Python库&#xff08;例如requests、BeautifulSoup等&#xff09;。使用requests库发送GET请求并…

C/C++开发,libiec61850库学习及运用

目录 一、libiec61850库下载编译 1.1 下载 1.2 linux编译&#xff1a; 1.3 win编译 二、案例编译测试 2.1 CMakeLists.txt调整(server_example_goose) 2.2 模型static_model.h/static_model.cpp生成 2.3 案例编译(server_goose) 2.4 客户端编译 2.5 运行测试 一、libiec61850…

SAP-MM 条件类型字段解析

01、“定价类型”&#xff1a;定义此条件类型的代码和描述&#xff0c;代码不能重复&#xff0c;描述可更改&#xff0c;根据实际需要&#xff0c;条件类型可定制&#xff1b; 02、“存取顺序”&#xff1a;表示此条件类型在定价时&#xff0c;要到存取顺序号定义的条件表中读…