Servlet的继承树,生命周期和线程不安全

news2025/7/24 9:15:15

 1、Servlet 继承树

 

3)Servlet的继承树
- Servlet接口
   public interface Servlet{
       public void init(config);
       public void service(request,response);
       public void destroy();
   }
- GenericServlet抽象类
   public abstract class GenericServlet implements Servlet{
       实现了init方法和destroy方法。service方法仍然保持抽象
   }
- HttpServlet抽象类 - 最初设计时,基于http协议,因此产生了HttpServlet,将来可能会基于其他协议出现其他协议下的Servlet
   public abstract class HttpServlet extends GenericServlet{
        实现了service方法。然后重载了service方法
        protected void service(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{
            String method=request.getMethod();
            if("POST".equals(method)){
                doPost(request,response);
            }else if("PUT".equals(method)){
                doPut(...)
            }else{...
            }
        }
        细化了服务方法:
        public void doPost(){}
        public void doGet(){}
        public void doDelete(){}
        public void doPut(){}
   }

 2、Servlet 生命周期

    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
        </dependency>

        <dependency>
            <groupId>com.csdn</groupId>
            <artifactId>pro03-fruit-optimize</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
package com.csdn.servlet;
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import java.io.IOException;
//4、演示Servlet生命周期
@WebServlet("/h04")
public class ServletLifecycle extends GenericServlet {
    // tomcat被执行的时候,他是不会被实例化的,这样是比较合理的
    // 因为假设项目里面有一万个Servlet,tomcat在启动的时候,
    // 就要实例化一万个实例对象,但是一万个也不知道用户什么时候来访问,
    // 放在tomcat里面,就会使tomcat启动的时间拉长,延迟实例化,只执行一次
    public ServletLifecycle() {
        System.out.println("ServletLifecycle正在实例化....");
    }
    //当有请求到来时,会被执行,多次请求可以执行多次
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("ServletLifecycle正在服务....");
    }
    //请求到来时,先实例化,然后执行init方法,只执行一次,然后执行service方法
    @Override
    public void init() throws ServletException {
        System.out.println("ServletLifecycle正在初始化....");

    }
    //tomcat停止时,执行destroy方法
    @Override
    public void destroy() {
        System.out.println("ServletLifecycle正在销毁....");
    }
}
4)Servlet的生命周期
- Servlet是tomcat去实例化的,不是程序员new的
- Servlet中的服务方法也不是程序员主动调用的,也是由tomcat去调用的。当有请求到来时,tomcat通过反射执行service方法
- Servlet的生命周期分为四个阶段:实例化、初始化、服务、销毁
- 默认情况下,Servlet不会随着容器的启动而被实例化,而是当第一次有人请求我的时候,我才会被实例化
  当容器停止时,容器中的Servlet实例会被销毁,destroy方法被调用

 3、Servlet 线程不安全问题

package com.csdn.servlet;
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import java.io.IOException;
//5、演示线程不安全的问题
@WebServlet("/h05")
public class ThreadUnsafeServlet extends GenericServlet {
    public Integer i = 1;
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        if (i % 2 == 0) {
            System.out.print("A");
        } else {
            System.out.print("B");
        }
        i++;
    }
}
- Servlet在tomcat容器中是单实例的是线程不安全的
        ① 单实例的意思是:所有客户端发过来的请求都是同一个ServletLifecycle实例来处理
            第一个用户发请求过来时,容器会去实例化servlet,然后进入服务阶段,从此之后,所有的请求到来时,直接执行服务方法
        ② 线程不安全的意思时:既然所有的请求到来时是同一个servlet实例去处理的,那么这些请求之间不能共用数据(共用变量)
            什么情况下共用变量?servlet中有成员变量,而服务方法中需要根据成员变量的值决定程序流程
            如果第一个请求到来时,执行服务方法,然后在服务方法中更改成员的值,从而就会导致其他的请求到来时流程发生变化
            小结:线程不安全的本质是:Servlet由成员变量;成员变量的值可能发生变化;业务逻辑依赖于这个变量
        ③ 如何解决线程不安全的问题:尽量避免使用成员变量;如果非要使用成员变量,那么要注意业务逻辑不要受成员变量值影响

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

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

相关文章

LiveMedia视频管理平台如何接入海康大华前端设备

LiveMedia视频管理平台支持对局域网内海康、大华、ONVIF设备及已经注册的GB28181前端&#xff0c;进行自动搜索&#xff0c;添加&#xff0c;简化添加流程。 接入海康大华设备示例 登陆视频中间件进入平台配置页面 点击上图设备管理&#xff0c;进入设备管理界面 点击设备发现…

J2EE项目部署与发布(Linux版本)

目录 一.jdk&tomcat安装 1.jdk的安装 1.2解压对应的安装包 1.3配置环境变量 2.tomcat的安装 二.mysql的安装 三.后端接口部署 后端部署 导入war包 修改端口 开启访问 一.jdk&tomcat安装 1.jdk的安装 登录VMware Workstation Pro 然后连接MobaXterm 将 jd…

ctfhub技能树web题目全解

Rce 文件包含 靶场环境 重点是这个代码&#xff0c;strpos&#xff0c;格式是这样的strpoc&#xff08;1&#xff0c;2&#xff0c;3&#xff09; 1是要搜索的字符串&#xff0c;必须有&#xff1b;2是要查询的字符串&#xff0c;必须有&#xff1b;3是在何处开始查询&#…

精明玩家的防骗攻略!绝地求生作图工具推荐!

亲爱的游戏玩家们&#xff0c;大家好&#xff01;在这个充满欢乐的游戏世界中&#xff0c;我们总是不可避免地会面临一些骗局和风险。为了保护自己的权益和游戏账号的安全&#xff0c;我们需要一些实用的方法和工具来帮助我们游戏更放心。 首先&#xff0c;防止被骗游戏账号黑名…

SpringBoot的核心配置:YAML概述、基础语法;JSR303数据校验;多环境切换

SpringBoot核心配置 SpringBoot配置文件分类 SpringBoot是基于约定的&#xff0c;所以很多配置都有默认值&#xff0c;但如果想使用自己的配置替换默认配置的话&#xff0c;就可以使用 application.properties或者application.yml&#xff08;application.yaml&#xff09;进…

“VVIC API:一键获取海量商品列表,根据关键词精准匹配,助力商家抢占市场先机!“

VVIC API接口可以根据关键词获取商品列表。以下是使用VVIC API接口获取商品列表的步骤&#xff1a; 确认VVIC API接口的请求地址和所需参数。根据接口文档中的说明设置请求参数&#xff0c;包括关键词和其他筛选条件。发送HTTP GET请求到API地址&#xff0c;即可得到对应的调用…

错误: 找不到或无法加载主类 回归java运行的本质

错误: 找不到或无法加载主类 回归java运行的本质 一&#xff0c;背景 当有了idea这种工具后&#xff0c;java的mian方法执行起来是如此简单&#xff0c;很少有人再手动编辑并通过命令行执行了。 同时&#xff0c;在当今Spring Boot盛行的今天&#xff0c;恐怕很少再有人执行j…

cmake多目录构建初步成功

目录和代码和 首次cmake 多目录构建失败 此文一样&#xff1b; 只有一个CMakeLists.txt&#xff1b; cmake_minimum_required(VERSION 3.10) project(mytest3 VERSION 1.0) include_directories("${PROJECT_SOURCE_DIR}/include") add_executable(mytest3 src/main…

二叉树问题——前/中/后/层遍历问题(递归与栈)

摘要 博文主要介绍二叉树的前/中/后/层遍历(递归与栈)方法 一、前/中/后/层遍历问题 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历 102. 二叉树的层序遍历 103. 二叉树的锯齿形层序遍历 二、二叉树遍历递归解析 // 前序遍历递归LC144_二叉树的前…

[PHP]DBErp进销存系统 v1.1 RC 221101

DBErp系统&#xff0c;是北京珑大钜商科技有限公司 基于 Laminas doctrine 2 开发的一套进销存系统。 本系统运行环境要求&#xff1a; 服务器系统&#xff1a;Linux&#xff08;推荐&#xff09;、Unix、Windows Web服务软件&#xff1a;Apache&#xff08;推荐&#xff09;…

PO-sxmb_moni错误消息提示“在qRFC队列**中执行消息时出现短存储***

问题描述&#xff1a; 原因分析&#xff1a; 一般是abap dump或者标准错误、弹窗这类挂起操作导致接口代理程序执行不下去“存储”导致 解决方案&#xff1a; 1.SMQ1 SMQ2找到错误的队列&#xff0c;查看执行日志&#xff08;意义不大&#xff09;&#xff0c;点击解锁看看是…

NLP 快速入门

文章目录 前言NLP 历史回顾NLP任务语料的标注AI语料标注师岗位职责 TransformersHugging Face模型中文文本分类使用 NLTK 进行文本分类 参考链接开源NLP 前言 学习NLP&#xff0c;解决两个问题&#xff1a; 如何使用别人训练好的模型&#xff1f;如何基于别人的模型&#xff…

SpringMVC Day 09 : 异常处理

前言 在Web应用程序开发中&#xff0c;我们经常会遇到各种各样的错误和异常情况。那么如何有效地捕获和处理这些异常呢&#xff1f;本文将介绍Spring MVC中的异常处理机制&#xff0c;帮助您构建更稳定、可靠的Web应用程序。 一、前期准备 1、新建项目&#xff0c;结构如下 2…

【问题解决】 avue dicUrl 动态参数加载字典数据(已解决)

事情是这样的&#xff0c;用了avue-crud组件&#xff0c;配置了一个option。     现在有一列source属性要展示为 多选的下拉框 &#xff0c;当然问题不在这而在于&#xff0c;选项是需要根据同级别属性id去拿的。也就是option.column.source 的配置中 需要该行的option.col…

V90PN总线伺服梯形加减速速度控制(标准报文1应用)

V90 PN总线伺服速度控制应用可以利用标准报文1和SinaSpeed功能块实现,具体代码介绍请查看下面相关文章链接,这里不再赘述。 速度随动控制 V90伺服PN总线速度随动控制(手摇轮功能)-CSDN博客文章浏览阅读40次。V90PN总线控制相关内容,请参考下面文章链接:博途1200/1500PLC …

我和云栖有个约会

开端&#xff0c;似曾相识的云栖 2023年阿里云云栖大会在云栖小镇举办&#xff0c;云栖小镇&#xff1f;在2020年的时候&#xff0c;曾经来过这里参加竞赛。时隔三年&#xff0c;身份变换&#xff0c;以开发者的身份&#xff0c;收到阿里云开发者社区的邀请&#xff0c;正好有…

简单易懂的讲解一下什么是自动化测试?

1.什么是自动化测试 以程序测试程序&#xff0c;以代码代替思维&#xff0c;以脚本的运行代替手工测试。自动化的测试涵盖了&#xff1a;功能&#xff08;黑盒&#xff09;自动化测试&#xff0c;功能&#xff08;白盒&#xff09;自动化测试&#xff0c;性能测试&#xff0c;…

如何在Linux上安装JDK、Tomcat和MySQL以及部署后端项目

目录 前言 一、JDK和Tomcat的安装 1.JDK安装 2.Tomcat安装 二、安装MySQL 三、后端接口部署 1.将ssh前后端分离项目进行部署 ​2.将单体项目进行部署 3.将ssm前后端分离项目进行部署并修改端口号 前言 随着现代软件开发的快速发展&#xff0c;越来越多的企业和个人开始…

【C语法学习】6 - gets()函数

文章目录 1 函数原型2 参数3 返回值4 读取机制5 示例 1 函数原型 gets()&#xff1a;从标准输入流stdin读取一个字符串存储到str指向的内存空间&#xff0c;函数原型如下&#xff1a; char *gets(char *str)2 参数 gets()函数的参数只有一个str&#xff1a; str是一个指向c…

如何借助知乎平台开展问答口碑营销?

知乎作为一个开放性的问答社区&#xff0c;把各行各业的用户链接在一起&#xff0c;用户可以在知乎平台分享自己的经验&#xff0c;也可以在知乎上搜索自己感兴趣的问题&#xff0c;因此就会有很多企业想要在知乎上进行问答营销推广自己的产品&#xff0c;但这些企业自己亲身试…