当前位置: 首页 > news >正文

Servlet工作原理与注解

目录

一、Servlet工作原理

前置准备: 添加 Servlet 依赖

1、Servlet是什么?

2、Servlet的运行流程

二、从web.xml到注解:Servlet配置的演进

传统方式:web.xml配置方式

现代方式:注解配置(最常用)

三、总结


一、Servlet工作原理

前置准备: 添加 Servlet 依赖

在pom.xml文件中插入以下代码

<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>

刷新 Maven 项目,使依赖生效

1、Servlet是什么?

简单说,Servlet就是运行在Web服务器上的Java程序,专门用来处理浏览器的请求并返回响应。

2、Servlet的运行流程

当你在浏览器输入http://localhost:8080/demo/hello并回车,后台发生了什么?

浏览器 → 请求 → Tomcat → 解析URL → 找到对应Servlet → 调用service()方法 → 返回响应 → 浏览器

步骤发生了什么谁在做
1浏览器发送HTTP请求浏览器
2Tomcat接收请求,解析URLTomcat
3根据URL查找对应的ServletTomcat
4如果Servlet是第一次被访问,则创建实例并初始化Tomcat
5调用Servlet的service()方法处理请求你的Servlet代码
6将处理结果封装成HTTP响应返回Tomcat
7浏览器渲染页面浏览器

二、从web.xml到注解:Servlet配置的演进

传统方式:web.xml配置方式

在Maven项目中,web.xml曾经是Servlet的"户口本",每个Servlet都要在这里登记:

<!--注册Servlet:告诉Tomcat有这个Servlet类 --> <servlet> <!-- Servlet名称:自定义标识,需和下方映射名称一致 --> <servlet-name>HelloServlet</servlet-name> <!-- Servlet类路径:Tomcat找到这个类的完整路径(包名+类名) --> <servlet-class>com.example.uint2_1.HelloServlet</servlet-class> </servlet> <!-- Servlet映射:配置前台访问这个Servlet的地址--> <servlet-mapping> <!-- 关联的Servlet名称:和上面注册的名称一一对应 --> <servlet-name>HelloServlet</servlet-name> <!-- 访问路径:浏览器输入 localhost:8080/项目名/hello 就能访问 --> <url-pattern>/hello</url-pattern> </servlet-mapping>

缺点

  • 配置繁琐,一个Servlet要写两处

  • 项目大了web.xml会变得非常臃肿

  • 修改配置需要重启服务器

现代方式:注解配置(最常用)

package com.example.uint2_1; 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; import java.io.PrintWriter; @WebServlet("/world") // 访问地址:http://localhost:8080/项目名/world public class WorldServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); resp.setCharacterEncoding("UTF-8"); PrintWriter out=resp.getWriter(); out.println("<html><body>"); out.println("<h1>你好注解</h1>"); out.println("</body></html>"); } }

一行注解@WebServlet("/world")就替代了上面那一大段XML配置

特点:一行注解搞定,只配置访问路径

优先级规则

  • 如果注解和web.xml配置了相同的URL路径web.xml优先级高于注解

  • 如果路径不同,两者同时生效

  • 实际开发中推荐只用一种方式,避免混乱

三、总结

对比项web.xml方式注解方式
配置位置单独xml文件直接写在Java类上
代码量
可读性差(要来回翻)好(一目了然)
修改便利性需重启需重启
适用场景老项目、统一配置新项目、快速开发
http://www.jsqmd.com/news/483587/

相关文章:

  • Redis命令-Hash命令
  • SpringBoot与RocketMQ深度整合:多连接配置与动态Topic处理实战
  • 通过Linux Deploy在旧Android设备上搭建轻量级Linux开发环境
  • WIN10系统解决ST-LINK V2 驱动安装失败数字签名问题
  • TongWeb7在国产操作系统上的安装与配置实战指南
  • 基于N32G430的USB供电参数监测终端设计
  • 2026精选课题-基于springboot美食菜谱分享平台的设计与实现
  • SecGPT-14B开源可部署:提供完整Dockerfile与build.sh,支持离线环境重建镜像
  • 从零到一:基于PyTorch的ResNet34核心实现与梯度消失解析
  • Redis命令-List命令
  • 拇指大小的射频功率计设计与宽量程实现原理
  • 免费IP类API接口全解析:从归属地到行业应用
  • 2026 智能体开发全指南:主流框架盘点、实战代码与选型策略(2026智能体开发系列·第1篇)
  • 探索者STM32F4开发板硬件资源深度解析与实战应用指南
  • GD32 ADC 定时器触发+DMA搬运:构建高效数据采集链的实战指南
  • 地理空间可视化崩溃频发,R 4.5中rgdal弃用后5步无缝迁移至sf+wk+geoarrow(含完整迁移检查清单)
  • 2026精选课题-基于springboot汽车配件管理系统的设计与实现
  • Dify评估引擎升级全景图:从v0.12到v1.5,3类模型判据权重重构、5项延迟优化指标及企业级审计日志规范
  • uniapp集成腾讯播放器实现App端视频播放功能实战
  • 2.1 网络编程 异步网络库zvnet
  • Audio Pixel Studio部署教程(Serverless版):Vercel/Cloudflare Pages托管
  • 别再调戏ChatGPT了!OpenClaw正式“破壳”:那个有手的AI,真的来了
  • DeepSeek-OCR部署避坑:首次唤醒慢问题诊断与SSD缓存优化方案
  • 分离式游戏机硬件平台:GD32F470多模无线交互设计
  • RAG生成阶段优化:解决幻觉、多轮对话与引用标注,小白程序员必备收藏!
  • 从抖振到平滑:基于饱和函数sat(s)的准滑动模态滑模控制SIMULINK实践
  • 第四章 第一性原理 vs 类比思维:人类两种终极思考模式
  • 【常亮24天】立创开源:基于STC32F12K54的低功耗迷你桌面时钟4.0版硬件与软件全解析
  • RockyLinux 10.1深度解析:软重启赋能高效运维,后量子加密守护数据新纪元
  • nlp_gte_sentence-embedding_chinese-large实现Python爬虫数据智能处理:自动化采集与清洗