Web服务器如何确定哪个servlet处理请求

2023-11-10

Web服务器如何确定哪个Servlet处理请求

1.Servlet中的方法

1. init()方法

在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init();

2. service()方法

它是Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

3. destroy()方法

仅执行一次,在服务器端停止且卸载Servlet时执行该方法,有点类似于C++的delete方法。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

2.Servlet生命周期

Servlet生命周期分为四个阶段:

1 创建对象

默认情况下,servlet不会随着服务器的启动而创建对象,在第一次请求的时候创建,之后再次请求请求也不再创建对象。如果在配置了load-on-startup为1,那么servlet随着服务器的启动而创建对象。

2 初始化

Servlet对象创建后,立即执行init() 方法,因为在servlet内,servlet对象只创建了一次,只有一个,所以init() 方法只执行一次。

3 处理请求

所有请求首先到达service方法,然后service方法根据请求方式(post或get),进而判断调用doGet方法还是doPost方法。再次访问发送请求时,只有service方法执行。

4 销毁

重新发布项目或正常关闭tomcat时销毁。

3 代码详解

package com.jd.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	public void init() throws ServletException {
		System.out.println("init");
	}
	public TestServlet(){
		System.out.println("构造方法");
	}
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("service");
		super.service(arg0, arg1);
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doget方法");
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost");
	}
	
	@Override
	public void destroy() {
		System.out.println("destory");
	}

}

发送请求的网页:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
	<a href = "./TestServlet">链接</a>
</body>
</html>

xml文件中未配置load-on-startup为1

运行Tomcat服务器,
在这里插入图片描述

访问jsp网页
在这里插入图片描述
点击发送请求,页面跳转后,关闭tomcat服务器。eclipse控制台输出:
在这里插入图片描述

过程分析:发送请求后,servlet创建对象,执行构造方法和init()方法,所有请求经service方法处理(要运行service方法)后,由service确定使用doGet或doPost方法,最后执行destory()方法。

3如何获取值

1 设置值

在web.xml文件中的标签中添加属性名称和属性值。

- 单个servlet中的值

新建一个

<init-param>

</init-param>

`标签,注意此标签必须在 < load-on-startup >标签行之前

此标签中的子标签< param-name >中写属性名

<param-name>属性名</param-name>

子标签< param-value>中写属性值

<param-value>属性值</param-value>

总体如下:

<servlet>
    <description></description>
    <display-name>TestServlet</display-name>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.jd.servlet.TestServlet</servlet-class>
    
    <init-param>
		<param-name>name</param-name>
		<param-value>Candy</param-value>
	</init-param>
    
  <load-on-startup>1</load-on-startup>
  </servlet>
- 多个servlet中的值

新建一个

<context-param>

</context-param>

`标签,此标签放在< web-app>中。

此标签中的子标签< param-name >中写属性名

<param-name>属性名</param-name>

子标签< param-value>中写属性值

<param-value>属性值</param-value>

总体如下:

  <context-param>
  	<param-name>age</param-name>
  	<param-value>20</param-value>
  </context-param>
2 获取值

使用getInitParameter()方法获取当前servlet中的值,取得的是 < servlet> < init-param>配置的参数;
使用getServletContext().getInitParameter()获取能在多个servlet中使用的值,取得的是 配置的参数

package com.jd.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	@Override
	public void init() throws ServletException {
		System.out.println("init");
		String name = getInitParameter("name");
		System.out.println(name);
		String age = getServletContext().getInitParameter("age");//可以全局使用
		System.out.println(age);
	}

运行tomcat,发送请求后,控制台输出
在这里插入图片描述

3. Web服务器确定servlet处理请求过程

  1. Web服务器的Web Server接收到HTTP请求
  2. Web服务器将请求转发给servlet容器
  3. servlet容器根据请求的URL去调用客户端要访问的Servlet
  4. 在调用之前,servlet容器会根据web.xml中对Servlet的描述去查找要访问的Servlet
  • 若找到,将此Servlet装载进虚拟机并调用servlet的init()方法对servlet进行初始化(该方法只会在servlet第一次被载入时调用),然后调用Servlet实例中的service()方法处理请求,即读取请求中的数据,创建一个响应。servlet会被保留在容器的地址空间中,继续处理其他的HTTP请求。
  • 若没有找到,直接返回一个404的错误代码到客户端,表示访问的资源不存在。

:
当第二次去访问同一个Servlet时,若容器判断到该Servlet已经被装载并实例化,那么容器就不会再去创建一个新的Servlet实例,直接调用原来那个Servlet实例中的service()方法来处理请求。

如果在Spring MVC中的web.xml中添加如下代码,就可以交给Web服务器默认Servlet处理。

  <mvc:default-servlet-handler/>
  <mvc:annotation-driven></mvc:annotation-driven>
  1. Web服务器将动态生成的结果返回到正确的地址。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web服务器如何确定哪个servlet处理请求 的相关文章

  • 有无监督,上下游任务,高斯分布,BN总结

    1 无监督和有监督的区别 有无标号 label与预测结果做损失loss transformer有监督的 BERT 在预训练中在没有标号的数据集上训练 在微调的时候同样是用一个BERT模型 但是它的权重被初始化成在预训练中得到的权重 有标号的
  • 华为OD机试 - 字符串加密(Java)

    题目描述 给你一串未加密的字符串str 通过对字符串的每一个字母进行改变来实现加密 加密方式是在每一个字母str i 偏移特定数组元素a i 的量 数组a前三位已经赋值 a 0 1 a 1 2 a 2 4 当i gt 3时 数组元素a i
  • 软件工程学习过程中工具、资料汇总与心得

    因为在上了半年课以后 发现学的课程太杂 要的工具太多 回顾当初找工具找到病毒工具的苦不堪言的黑历史 在此整理学习用到的所有工具 保持更新 因为文件已经被别人上传了 还要积分什么鬼的 信息化时代共享不好嘛 因此将文件均上传至百度网盘 下载缓慢
  • vue+nodejs 搭建网站全过程

    Vue js Node js MongoDB 的网站搭建示例 安装和初始化项目 使用 Vue Cli 初始化前端项目 vue create my site 使用 Express 初始化后端项目 npx express generator m
  • 如何解决局域网广播风暴

    晚唐诗人许浑曾写过一首诗 咸阳城东楼 其中有一句名句 被传诵千古 山雨欲来风满楼 山雨欲来风满楼 是全诗的警句 周围的群山 雨意越来越浓 大雨即将到来 城楼上 已是满楼的狂风 全句只有寥寥七个字 却十分形象地写出了山城暴雨即将来临时的情景
  • 华为OD机试 - 阿里巴巴找黄金宝箱(I)(Python)

    题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上 无意中发现了强盗集团的藏宝地 藏宝地有编号从0 N的箱子 每个箱子上面贴有一个数字 箱子中可能有一个黄金宝箱 黄金宝箱满足排在它之前的所有箱子数字和等于排在它之后的所有箱子数字之和 第一个箱子
  • SQL SERVER行列不同分类的展示---PIVOT

    行列不同分类的SQL SERVER展示 由于工作的需求 需要对行不同分类 列也不同分类 可以将行分类之后对列进行每列CASE WHEN 进行展示 但是这种方法太蠢了 而且代码不够简洁 因此网上寻找了行转列函数 上最基础的做法 select
  • 关于javascript中number类型与string类型的比较

    javascript中number类型与string类型的比较 应该是根据number类型的数值情况 将string转换为与number数值相对应的值再比较 var numVal 10 00 if numVal 10 0000 consol
  • 搭建QNX开发环境-qnx系统环境开发

    锋影 e mail 174176320 qq com QNX是可以提供试用30天 目前发布最新的是qnx7 0版本 申请也是只能7 0 做好白老鼠的准备 老版本不再申请试用 其实多数时候 老版本的650 650sp1 和较新稳定的660版本
  • caffe 查看caffemodel中的参数与数据

    在用caffe训练完一个模型之后 我们想更加直观的查看这个模型该怎么做呢 caffe框架训练出来的caffemodel是一个类似于黑盒的东西 我们无法直接看到它的本质 需要借助caffe所定义的接口来协助我们 详细的文档在caffe官网上都
  • gcc链接脚本和启动文件详解

    C代码生成可执行程序分为 预编译 编译 汇编 链接四个阶段 预处理器把源程序聚合在一起 并把宏定义转换为源语言 编译器根据预处理的源程序生成汇编程序 汇编器处理汇编程序 生成可重定位的机器代码 连接器将可重定位的目标代码和库文件连接到一起
  • 基于51单片机直流电机PID调速PWM输出LCD1602液晶显示设计

    视频演示地址 https www bilibili com video BV1LK4y1R7ju 该设计是由AT89C51单片机为主控芯片显示为1602液晶构成直流电机调速 开机默认不转按下启动后电机开始运行 PID控制PWM进行调速 按键
  • Arduino使用ESP8266模块联网

    ESP8266模块准备 1 透传程序烧写 2 Arduino与ESP8266接线 Arduino模块程序 测试 总结 上一篇文章已经介绍了 利用 ArduinoIDE开发ESP8266模块 这篇文章介绍一下arduino怎么通过ESP826
  • unity鼠标事件

    鼠标事件 鼠标事件 都是当鼠标和gui或者碰撞体 Collider 交互时候触发 需要说明的是drag其实就是鼠标down后up之前持续每帧都会发送此消息 OnMouseDown 当鼠标上的按钮被按下时触发的事件 OnMouseDrag 当
  • LLVM IR格式的基本介绍

    LLVM IR以两种格式存储在磁盘上 1 位码 bc文件 2 汇编文本 ll文件 以sum c源代码为例 int sum int a int b return a b 使用Clang生成位码 命令如下 clang sum c emit ll
  • 单片机数码管从00到99C语言_51单片机数码管实现1到99显示

    在 51 单片机上实现用数码管显示 1 到 99 的数字 并且时间间隔为 1 秒 全部代码如下 include define uchar unsigned char define uint unsigned int sbit dula P2
  • C语言之tentative definition

    参考链接 What Are Tentative Symbols
  • redisson究极爽文-手把手带你实现redisson的发布订阅,消息队列,延迟队列(死信队列),(模仿)分布式线程池

    参考资料 分布式中间件实战 java版 书籍 多线程视频教程 视频 项目启动环境 导入依赖
  • Android Watchdog分析

    初始化 Watchdog作为一个独立的线程在SystemServer进程中被初始化 private void startBootstrapServices NonNull TimingsTraceAndSlog t Start the wa
  • Ant Design Vue通过iconfont构建自定义图标库

    虽然Ant Design Vue已经为我们内置了很多icon图标 我们很方便就能使用 但有时候有些图表我们还是系统能实现定义 本文主要介绍根据iconfont图标库创建自定义的icon图表 并在Ant Design Vue中使用 首先在ic

随机推荐

  • 3、 数组和字符串的应用 编程实现以下功能:将一个3行5列的二维数组a行和列元素互换,存到另一个二维数组b中。

    3 数组和字符串的应用 编程实现以下功能 将一个3行5列的二维数组a行和列元素互换 存到另一个二维数组b中 include
  • 在 Linux 中使用日志来排错

    人们创建日志的主要原因是排错 通常你会诊断为什么问题发生在你的 Linux 系统或应用程序中 错误信息或一系列的事件可以给你提供找出根本原因的线索 说明问题是如何发生的 并指出如何解决它 这里有几个使用日志来解决的样例 登录失败原因 如果你
  • Hibernate对原生sql处理及结果集报错:Expected type: java.lang.Integer, actual value: java.math.BigInteger

    基于Hibernate执行sql查询方法 映射实体对象报错Expected type java lang Integer actual value java math BigInteger 实体类ChannelTree package co
  • 面试题-6

    1 查找根目录下所有的隐藏目录 root chengyinwu find type d name 2 查找根目录下以rpm结尾的所有文件 root yinwucheng find type f name rpm 3 查找 data bak目
  • CTFshow单身杯 部分wp

    前言 不会吧不会吧不会有人520521不约会打比赛吧 文章目录 1 单身杯热身题目 2 misc签到 3 没大没小的串串 4 任性老板 5 蛤壳雪茄 1 6 蛤壳雪茄 2 7 The Dancing Men 8 伪装成RSA的MUSC 9
  • notion搭建博客方法一:notion简单操作说明

    简介 notion搭建博客的方法有很多种 今天介绍最基础的 原汁原味的方法 步骤 注册一个notion账号 使用邮箱就可以很快注册 免费账号除了附件大小 共享用户数等有部分限制其他基本都不影响使用 新建一个Page 输入 然后table I
  • Java课题笔记~ IoC 控制反转

    二 IoC 控制反转 控制反转 IoC Inversion of Control 是一个概念 是一种思想 指将传统上由程序代码直接操控的对象调用权交给容器 通过容器来实现对象的 装配和管理 控制反转就是对对象控制权的转移 从程序代码本身反转
  • springboot 连接redis

    安装文章https blog csdn net yeluo vinager article details 103680059 问题 F soft Redis x64 3 2 100 gt redis server exe service
  • muduo异步日志总结

    muduo中的日志是指诊断日志 即通常用于故障诊断和追踪的日志 便于服务器发生故障时的线索追踪 是网络库中很重要的一个部分 在总结异步日志之前 首先应该清楚什么是异步日志 与同步日志又有什么区别 同步日志与异步日志 同步日志 网络IO线程或
  • iPhone6可能取代公交卡和门禁卡

    10月28日 苹果公司正在积极寻求合作 以增加iPhone 6和iPhone 6 Plus内置的NFC芯片的用途 该芯片目前只能通过Apple Pay支付服务使用 因为苹果并没有向第三方开放API 应用编程接口 苹果正在与潜在合作伙伴展开沟
  • 流水线上的大专生,成功转行高薪IT岗,历程太心酸

    前言 我来自山东滨州 98年的 毕业于某职业学院 一名大专生 专业是机电一体化技术 对编程的认知度为0 和大多数人一样 一个月2500元 浑浑噩噩的工厂生活 大学时光 基本都是在睡觉 上网 逃课 早退中度过 偶尔会有一丝丝危机感 但是没一会
  • 华为OD机试真题-查找单入口空闲区域【2023.Q1】

    题目描述 给定一个 m xn 的矩阵 由若干字符 和0构成 X表示该处已被占据 0 表示该处空闲 请找到最大的单入口空闲区域 解释 空闲区域是由连通的O组成的区域 位于边界的0可以构成入口 单入口空闲区域即有目只有一个位于边界的0作为入口的
  • Linux系统中基于NGINX的代理缓存配置指南

    作为一名专业的爬虫程序员 你一定知道代理缓存在加速网站响应速度方面的重要性 而使用NGINX作为代理缓存服务器 能够极大地提高性能和效率 本文将为你分享Linux系统中基于NGINX的代理缓存配置指南 提供实用的解决方案 助你解决在爬虫过程
  • idea的自定义模板(文件代码模板和文件注释说明文档)

    1 idea自定义文件代码模板 1 步骤 File Settings Editor File and Code Templates 复制 起个名字 name 例如叫 HTML File View 把需要的代码放到合适位置 就做好了文件代码模
  • ES6必须知道的知识点--思维导图

    学习过程中每个人有每个人不同的习惯 我喜欢学完一个知识点再用脑图整理出知识点 这样回顾就有思路 看的顺序是从右上角开始顺时针 下面的图片是ES6要掌握的知识点 如果是要从事Vue React 这些都掌握了你就一只jio 进门了 希望对你有帮
  • 如何存matlab,[转载]如何在Matlab中保存文件及导入文件

    一 保存文件 1 保存整个工作区 File gt Save Workspace as 一个 mat文件 2 保存工作区的变量 在左工作区右击变量名 create M File 3 save命令 1 save 将工作区中的所有变量保存在当前工
  • C++ 从 HDF5 文件读取 Keras 神经网络模型和参数

    C 从 HDF5 文件读取 Keras 神经网络模型和参数 一 背景与应用 二 Keras 保存的 HDF5 参数 Weight 文件分析 二 遍历起点 1 工程需要包含的头文件和库文件 2 打开文件 3 打开 Root Group 并输出
  • uniapp图片上传h5与小程序的差别

    uni app的uni chooseImage图片上传的时候在h5跟小程序的一个差异 upload const token uni getStorageSync token uni chooseImage count 1 最多上传几张图片
  • 问题解决: 此文件来自其他计算机,可能被阻止以帮助保护该计算机/WORD在试图打开文件时遇到错误……...

    最近 在打开下载的office文档 包括word excel ppt等 时候 总是无法直接打开 错误提示如下 无论是邮件中的还是别的网站下载的 均提示该错误 后来搜索相关资料发现 修改其文件属性即可打开 属性 解除锁定
  • Web服务器如何确定哪个servlet处理请求

    Web服务器如何确定哪个Servlet处理请求 1 Servlet中的方法 1 init 方法 在Servlet的生命周期中 仅执行一次init 方法 它是在服务器装入Servlet时执行的 可以配置服务器 以在启动服务器或客户机首次访问S