Java随记 —— Servlet 教程笔记

article/2025/10/18 21:38:42

文章目录

    • 1. 概念
    • 2.步骤
      • 1. 创建 JavaEE 项目
      • 2. 定义一个类,实现 Servlet 接口
      • 3. 实现接口中的抽象方法
      • 4. 配置 Servlet
    • 3. 执行原理
      • 配置 Tomcat 虚拟目录
      • Servlet 执行原理
    • 4. 生命周期
      • 1. 被创建:执行 `init` 方法,只执行一次
        • Servlet 什么时候被创建 ?
        • 配置执行 Servlet 的创建时机
        • Servlet 的线程安全问题
      • 2. 提供服务:执行 `service` 方法,执行多次
      • 3. 被销毁:执行 `destroy` 方法,只执行一次
      • 代码
      • 配置执行 Servlet 的创建时机
    • 5. Servlet 3.0
      • Servlet 3.0 的好处
      • 步骤:
      • Servlet 3.0 注解配置方法
        • 方法一
        • 方法二
      • 注意
    • 6. IDEA 与 Tomcat 的相关配置
    • 6. Servlet 的体系结构
      • 1. Servlet 的结构体系
      • 2. GenericServlet
      • 3. HttpServlet
    • 7. Servlet 相关配置

1. 概念

Servlet:server applet

  • Servlet 即运行在服务器端的小程序
  • Servlet 就是一个接口,定义了 Java 类被浏览器访问到(Tomcat识别)的规则。
  • 将来我们自定义一个类,实现 Servlet 接口,复写方法。

2.步骤

1. 创建 JavaEE 项目

在这里插入图片描述

2. 定义一个类,实现 Servlet 接口

package com.example.webdemo;  import javax.servlet.*;  
import java.io.IOException;  public class HelloServlet implements Servlet {  }

3. 实现接口中的抽象方法

在这里插入图片描述

package com.example.webdemo;  import javax.servlet.*;  
import java.io.IOException;  public class HelloServlet implements Servlet {  @Override  public void init(ServletConfig servletConfig) throws ServletException {  }  @Override  public ServletConfig getServletConfig() {  return null;  }  @Override  public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {  System.out.println("Hello Servlet");  }  @Override  public String getServletInfo() {  return null;  }  @Override  public void destroy() {  }  
}

4. 配置 Servlet

在这里插入图片描述

  • <web-app> 根标签里配置 <servlet><servlet-mapping> 中的内容
  • 注意不要写到根标签外
<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"  version="4.0">  <!--配置内容-->  <servlet>  <servlet-name>demo1</servlet-name>  <servlet-class>com.example.webdemo.HelloServlet</servlet-class>  </servlet>        <servlet-mapping>  <servlet-name>demo1</servlet-name>  <url-pattern>/demo1</url-pattern>  </servlet-mapping>  </web-app>

3. 执行原理

配置 Tomcat 虚拟目录

  • 后期项目数量增加,配置 Tomcat 虚拟目录方便管理。
  • Run --> Edit Configurations... --> Tomcat 9.0.46 --> Deployment --> Application context

在这里插入图片描述

Servlet 执行原理

  1. 当服务器接收到客户端浏览器的请求后,会解析请求 URL路径,获取访问的 Servlet 的资源路径
  2. 查找 web.xml 文件,是否有对应的 <url-pattern> 标签体内容
  3. 如果有,则再找到对应的 <servlet-class> 全类名
  4. Tomcat 会将字节码文件加载进内存,并创建其对象
  5. 调用其方法

在这里插入图片描述

4. 生命周期

1. 被创建:执行 init 方法,只执行一次

Servlet 什么时候被创建 ?

  • 默认情况下,第一次被访问时,Servlet 被创建
    • 可以配置执行 Servlet 的创建时机。[[1. Servlet 教程#配置执行 Servlet 的创建时机]]

配置执行 Servlet 的创建时机

  • 配置 <load-on-startup>
      1. 第一次访问时,创建 --> <load-on-startup> 为负值
      1. 服务器启动时,创建 --> <load-on-startup> 为 0 或 正整数

<servlet>  <servlet-name>Demo1</servlet-name>  <servlet-class>com.example.webdemo.Demo1</servlet-class>  <!-- 指定 Servlet 的创建时机  1. 第一次被访问时,创建  * <load-on-startup> 的值为负值  2. 在服务器启动时,创建  * <load-on-startup> 的值为0或正整数 -->  <load-on-startup>5</load-on-startup>  </servlet>

<load-on-startup> 为正值的结果。

在这里插入图片描述

Servlet 的线程安全问题

  • Servlet 的 init 方法,只执行一次,说明一个 Servlet 在内存中只存在一个对象,Servlet 是单例的。
    • 多个用户同时访问时,可能存在线程安全问题
    • 解决:尽量不要在 Servlet 中定义成员变量。即使定义了成员变量,也不要对其修改值
      • number 不共享(解决问题)在这里插入图片描述

2. 提供服务:执行 service 方法,执行多次

  • 每次访问 Servlet 时,Servlet 方法都会被调用一次

3. 被销毁:执行 destroy 方法,只执行一次

  • Servlet 被销毁时执行。 服务器关闭时,Servlet 被销毁
  • 只有服务器正常关闭时,才会执行 destroy 方法
  • destroy 方法在 Servlet 被销毁之前执行,一般用于释放资源(临终交代遗言)

代码

package com.example.webdemo;  import javax.servlet.*;  
import java.io.IOException;  public class HelloServlet implements Servlet {  /**  * 初始化方法  * 在 Servlet 被创建时,执行。只会执行一次  * * @param servletConfig  * @throws ServletException  */    @Override  public void init(ServletConfig servletConfig) throws ServletException {  System.out.println("init......");  }  /**  * 提供服务方法  * 每一次Servlet被访问,执行。执行多次  * * @return  */  @Override  public ServletConfig getServletConfig() {  return null;  }  /**  * 提供服务方法  * 每一次 Servlet 被访问是,执行,执行多次  * * @param servletRequest  * @param servletResponse  * @throws ServletException  * @throws IOException  */    @Override  public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {  System.out.println("service......");  }  /**  * 获取 Servlet 的一些信息,版本,作者等等。。。  * * @return  */  @Override  public String getServletInfo() {  return null;  }  /**  * 销毁方法  * 在服务器正常关闭是,执行,执行一次  * */  @Override  public void destroy() {  System.out.println("destroy......");  }  
}

配置执行 Servlet 的创建时机

  • 配置 <load-on-startup>
      1. 第一次访问时,创建 --> <load-on-startup> 为负值
      1. 服务器启动时,创建 --> <load-on-startup> 为 0 或 正整数

<servlet>  <servlet-name>Demo1</servlet-name>  <servlet-class>com.example.webdemo.Demo1</servlet-class>  <!-- 指定 Servlet 的创建时机  1. 第一次被访问时,创建  * <load-on-startup> 的值为负值  2. 在服务器启动时,创建  * <load-on-startup> 的值为0或正整数 -->  <load-on-startup>5</load-on-startup>  </servlet>

<load-on-startup> 为正值的结果。

在这里插入图片描述

5. Servlet 3.0

Servlet 3.0 的好处

支持注解配置。可以不需要 web.xml 了

步骤:

  1. 创建 JavaEE 项目,选择 Servlet 的3.0以上的版本,可以不创建 web.xml
  2. 定义一个类,实现 Servlet 接口
  3. 复写方法
  4. 在类上使用 @WebServlet 注解,进行配置

Servlet 3.0 注解配置方法

WebServlet("资源路径")

方法一

在类前加入 @WebServlet 注解并配置 urlPatterns 即可。

  • 示例
WebServlet(urlPatterns = "/demo1")

在这里插入图片描述

方法二

value 的特性: 表示最重要的属性

由于注解 @WebServlet 括号中只有一个属性,value 可以不写

示例:

@WebServlet(value = "/demo1")   //value 可以不写@WebServlet("/demo1")

在这里插入图片描述

注意

  1. 从 Java EE 6 才开始支持 Web 3.0 --> 支持 Servlet 3.0

在这里插入图片描述

6. IDEA 与 Tomcat 的相关配置

  1. IDEA 会为每一个 Tomcat 部署的项目单独建立一份配置文件

    • 查看控制台的 log:Using CATALINA_BASE:
      • “C:\Users\fqy.IntelliJIdea2018.1\system\tomcat_itcast”
  2. 工作空间项目 和 Tomcat部署的web项目

    • Tomcat真正访问的是“tomcat部署的web项目”,
    • “Tomcat 部署的web项目"对应着"工作空间项目” 的web目录下的所有资源
    • WEB-INF目录下的资源不能被浏览器直接访问。
  3. 断点调试:使用"小虫子"启动 dubug 启动

6. Servlet 的体系结构

1. Servlet 的结构体系

Servlet – 接口

GenericServlet – 抽象类

HttpServlet – 抽象类

2. GenericServlet

代码 【GenericServlet.java】

//  
// Source code recreated from a .class file by IntelliJ IDEA  
// (powered by FernFlower decompiler)  
//  package javax.servlet;  import java.io.IOException;  
import java.io.Serializable;  
import java.util.Enumeration;  
import java.util.ResourceBundle;  public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {  private static final String LSTRING_FILE = "javax.servlet.LocalStrings";  private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings");  private transient ServletConfig config;  public GenericServlet() {  }  public void destroy() {  }  public String getInitParameter(String name) {  ServletConfig sc = this.getServletConfig();  if (sc == null) {  throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));  } else {  return sc.getInitParameter(name);  }  }  public Enumeration<String> getInitParameterNames() {  ServletConfig sc = this.getServletConfig();  if (sc == null) {  throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));  } else {  return sc.getInitParameterNames();  }  }  public ServletConfig getServletConfig() {  return this.config;  }  public ServletContext getServletContext() {  ServletConfig sc = this.getServletConfig();  if (sc == null) {  throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));  } else {  return sc.getServletContext();  }  }  public String getServletInfo() {  return "";  }  public void init(ServletConfig config) throws ServletException {  this.config = config;  this.init();  }  public void init() throws ServletException {  }  public void log(String msg) {  this.getServletContext().log(this.getServletName() + ": " + msg);  }  public void log(String message, Throwable t) {  this.getServletContext().log(this.getServletName() + ": " + message, t);  }  public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;  public String getServletName() {  ServletConfig sc = this.getServletConfig();  if (sc == null) {  throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));  } else {  return sc.getServletName();  }  }  
}

由于我们常用的只有 service 方法,所以 GenericServlet 就将其它方法默认空实现,只把 service 方法抽象实现。

  • GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
    • 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
    • 需要其它方法直接复写即可。

3. HttpServlet

  • HttpServlet:对http协议的一种封装,简化操作
    1. 定义类继承 HttpServlet
    2. 复写 doGet/doPost 方法

在这里插入图片描述

7. Servlet 相关配置

  • urlpartten:Servlet访问路径
    1. 一个Servlet可以定义多个访问路径
      • @WebServlet({"/d4","/dd4","/ddd4"})
    2. 路径定义规则:
      1. /xxx :路径匹配 --> @WebServlet({"/user/demo4"})
      2. /xxx/xxx :多层路径,目录结构 --> @WebServlet("/user/demo4")
      3. *.do :扩展名匹配 --> @WebServlet("/*")

http://chatgpt.dhexx.cn/article/7U6SkONw.shtml

相关文章

servlet 教程 2:返回 jsp 页面

上一篇文章讲解了 servlet 环境搭建&#xff0c;本文介绍 servlet 相关用法 上一篇文章地址&#xff1a;servlet 教程 1&#xff1a;环境搭建和新建 servlet 项目 1、返回 WebContent 目录下的 jsp 页面 WebContent 目录下的 jsp 页面&#xff0c;可以直接通过地址访问 在 We…

java servlet 教程_JavaWeb快速入门之Servlet教程

本篇文章针对具备 Java 基础的小伙伴&#xff0c;提供了详细的Servlet 入门教程&#xff0c;课程对 Servlet 技术的整体框架进行了讲解&#xff0c;并附带了实例演示&#xff0c;快来了解下~ 废话不多说&#xff0c;接下来列出来的学习内容与上传的视频相结合&#xff0c;视频在…

Servlet 详细教程 + 案例

Servlet 方法介绍Servlet urlPattern 配置IDEA 模板创建 Servlet中文乱码问题POST 乱码GET 乱码 路径问题Response 响应字符数据Response 响应字节数据用户登录案例准备工作流程 用户注册案例代码优化案例准备工作业务 - 查询所有业务 - 添加业务 - 修改&#xff08;数据回显&a…

Servlet教程

01_Servlet的概述&入门案例 Servlet 是Java所提供的一门用于开发动态WEB资源的技术&#xff0c;也是JavaEE的规范之一 开发步骤 创建一个WEB项目 在WEB项目中创建一个类&#xff0c;让该类去实现Servlet接口&#xff08;继承Servlet接口的实现类&#xff09; 在web.xml文件…

Servlet的详细教程

文章目录 一、Servlet的简介二、Servlet的入门案例三、创建Servlet的三种方式3.1实现Servlet接口的方式3.2继承GenericServlet抽象类的方式3.3继承HttpServlet的方式 四、Servlet注解和配置文件的写法4.1配置文件的写法4.2注解的写法 五、Servlet的生命周期六、Servlet获取前端…

python+requests+pytest 接口自动化框架(二)

目录 一、Fixture固件 scope&#xff1a; 1.基础应用&#xff1a;scope是function 2.scope为class 3.scope作用域是module或package/session params用于数据驱动&#xff1a; ids: name: pytest执行顺序总结&#xff1a; 二、pytest的基础路径设置 三、pytest断言 …

python自动化测试—Python自动化框架及工具

1 概述 手续的关于测试的方法论&#xff0c;都是建立在之前的文章里面提到的观点&#xff1a; 功能测试不建议做自动化接口测试性价比最高接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 本系列选择的测试语言是 python 脚本语言。由于其官方…

Windows C#自动化框架

毕业后&#xff0c;也跟随着大流奔着高上大的自动化而去&#xff0c;先是学习几个小时的QTP知道大体的流程后&#xff08;QTP确实极其容易上手&#xff09;&#xff0c;立马着手写自动化脚本&#xff0c;折腾了2次公司软件Vke后&#xff0c;发现vbs的语言局限性太强&#xff0c…

python接口自动化框架搭建

框架组成部分&#xff1a; 用例模块 (case)数据模块&#xff08;data&#xff09;环境、公共配置模块&#xff08;env)公共方法模块&#xff08;public&#xff09;接口模块&#xff08;url&#xff09;执行模块&#xff08;run.py&#xff09;如图所示 用例模块&#xff1a; 这…

Robot Framework接口自动化框架

Robot Framework简介 1、什么是Robot Framework 由Nokia Siemens Networks&#xff08;诺基亚西门子&#xff09;开发。Robot Framework是一款基于python的功能自动化测试框架。可以同时测试多种类型的客户端和接口。主要用于轮次很多的验收测试和验收测试驱动开发(ATDD)。 2、…

python+requests+pytest 接口自动化框架(演示)

框架代码已封装 小白 3行代码即可实现接口自动化 1 调用请求 2 在yaml文件中写测试用例 3 运行效果 日志文件 控制台也有对应日志 后期会一点点更新 框架的搭建

自动化框架搭建面试题

面试 1、接口自动化和web自动化有多少case ?覆盖率是多少?全部执行完需要多久? 2、接口自动化测试怎么做? web自动化测试怎么做? 3、什么是POM模式?为什么要使用它? 4、说说你对数据驱动和关键字驱动的理解? 5、web自动化测试用例如何设计?如何提高web自动化用例…

手把手教你从0到1搭建web ui自动化框架(python3+selenium3+pytest)

-前期准备 -环境 -实战: 从0开始 前期准备 为更好的学习自动化框架搭建&#xff0c;你需要提前了解以下知识&#xff1a; python基础知识 pytest单元测试框架 PO模式 selenium使用 环境 本次我们自动化环境为&#xff1a; macpython3selenium3pytest6.2.4 (不管是win还是mac&…

自动化测试框架总结

目录 1. 单元测试框架 2. Web自动化测试框架 3. iOS自动化测试框架 4. Android自动化测试框架 1. 单元测试框架 几乎所有的主流语言&#xff0c;都会有其对应的单元测试框架,下面简单介绍一下python,java,C#三种语言的常见单元测试框架 1.1 Python python常见单元测试框架…

自动化框架到底是什么?

如今&#xff0c;随着敏捷和 DevOps 软件方法论的发展&#xff0c;以及企业寻求更快发布和高质量产品的需求&#xff0c;它需要比手动测试方法更快&#xff0c;更高效的软件测试方法。微型&#xff0c;小型和中型企业&#xff08;SME&#xff09;使其测试过程自动化变得越来越必…

UI 自动化框架对比2

1、pytest 在开始本文之前&#xff0c;我想跟大家澄清两个概念&#xff0c;一个是测试框架一个是测试工具。很多人容易把他们搞混了&#xff0c;测试框架是诸如 Unittest、Pytest、TestNG 这类&#xff0c;而测试工具指的则是 Selenium、Appium、Jmeter 这类。 测试框架的作…

APP自动化简单理解(在python中实现简单的app自动化框架)

一、app自动化环境搭建 1、安装jdk及配置jdk的环境变量 app底层是c语言&#xff0c;应用层是java&#xff0c;所以需要jdk 2、安装SDK&#xff0c;配置android SDK环境 3、安装模拟器 4、下载安装Appium工具 01、appium客户端 appium destop 服务器 02、命令行安装&…

UI自动化框架如何设计及搭建?

目录 UI自动化框架 自动化原则&#xff1a; 如何减少自动化维护成本&#xff1f; UI自动化框架优化方案&#xff1a;&#xff08;在不增加维护成本前提下&#xff09; UI自动化脚本可分为3种&#xff1a; 已经实现自动化的模块可以不做手工测试了吗&#xff1f; UI自动化…

接口自动化框架

接口自动化框架讲解 框架结构 接口测试框架的结构如下图所示&#xff1a; 接口测试框架的结构说明&#xff1a; - API用于封装被测系统的接口&#xff08;用requests模块封装的请求方法&#xff09; - TestCase将一个或多个接口封装成测试用例&#xff0c;并使用UnitTest管…

什么是自动化框架?

前言 无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“…