Java Web 三大件

Java Web 三大件,也就是 Servlet,Filter,Listener

当 Tomcat 接收到请求时候,依次会经过 Listener -> Filter -> Servlet

Servlet

这里简单总结下

我尽量用大白话解释一下这个链接里的内容:

  1. Servlet是什么
  • 你可以把Servlet理解成”服务员”,专门处理网站的各种请求。比如你点外卖(发送请求),服务员(Servlet)接单后去厨房(服务器)做好,再打包(生成网页)送给你。
  1. Servlet的工作场景
  • 动态生成网页(比如淘宝的商品页面,每个人看到的都不一样)
  • 把请求转交给其他”服务员”处理(像餐厅里服务员之间交接工作)
  • 连接数据库(比如查你的快递信息)
  • 读取客户的小纸条(Cookie)
  1. 四个重要工具
  • 请求单子(HttpServletRequest):记录客户的所有要求(比如搜索关键词)
  • 回复盒子(HttpServletResponse):用来打包要返回给客户的东西
  • 个人工作牌(ServletConfig):每个服务员独有的配置(比如专属的调料配方)
  • 餐厅公告板(ServletContext):所有服务员共享的信息(比如今日特价菜)
  1. 服务员的工作流程
  • 上班签到(init()):第一次被叫时做准备
  • 处理订单(service()):根据客户要求(GET/POST)选择处理方法
  • 下班收工(destroy()):关灯关煤气,收拾东西
  1. 两种上班方式
  • 有客人叫才起床(默认)
  • 提前到岗待命(配置load-on-startup,数字越小越早上班)
  1. 配置小窍门
  • 整个餐厅的配置用(比如统一打8折)
  • 个人配置用(比如某服务员专属的围裙颜色)
  • 现在流行用@WebInitParam这种贴标签的方式配置(类似便利贴)
  1. 常用小功能
  • 获取客户要求:request.getParameter()(比如查快递单号)
  • 设置返回格式:response.setContentType()(告诉浏览器返回的是网页还是图片)
  • 存取临时数据:request.setAttribute()(像服务员之间传递小纸条)

简单来说,Servlet就是网站后台的”服务员团队”,负责接收用户请求、处理数据、生成网页,最后把结果返回给用户浏览器的整个过程。这些服务员们各司其职,有的专门处理登录,有的专门处理支付,共同维持网站的正常运作。

Tomcat

https://blog.csdn.net/qq_53287512/article/details/129278148

Tomcat 就像是一个“Java网站服务员”
你可以把它想象成餐厅里专门负责接待顾客的服务员。当你用 Java 写了一个网站(比如一个购物网站),Tomcat 的作用就是:

  1. 接电话
    当用户用浏览器访问你的网站(比如输入网址),Tomcat 会第一时间“接电话”,听懂用户想要什么(比如打开首页、提交订单)。
  2. 喊厨师干活
    Tomcat 自己不会处理复杂的业务(比如计算价格、查数据库),但它会喊你写的 Java 代码(比如 Servlet)来干活,就像服务员把订单传给后厨。
  3. 上菜
    等 Java 代码处理完数据,Tomcat 会把结果(比如生成的网页、数据)打包好,“端”回给用户的浏览器。

为什么需要 Tomcat?

  • 没有它,你的 Java 代码就像不会接客的厨师,空有功能但没人能用。
  • 它帮你处理了网络通信、多线程等复杂问题,你只需要专注写业务逻辑。

日常比喻

  • 安装 Tomcat ≈ 雇一个服务员

  • 部署网站 ≈ 把菜谱交给服务员

  • 启动 Tomcat ≈ 让服务员开始上班接客

  • 端口冲突 ≈ 服务员抢了别人的对讲机频道(比如默认用 8080 端口)

    Tomcat 中的三个 Context 的理解

    • Context:代表一个web应用,一个应用可以有多个Context,Context 就是代码的“剧组场记” —— 它记住所有环境细节,让每个组件(Servlet/Filter)不用自己带剧本,走到哪都能立刻入戏!

      Context 就是「当前环境的所有信息」,相当于拍电影时导演喊卡后,对演员说:“你刚刚是在被追杀时喊‘奥利给’,不是吃饭时喊的!” —— 这个“被追杀”的背景就是 Context。

      Java 中的 ServletContext 是什么?

      ServletContext 就是整个 Web 应用的“剧组档案库”,它保存着这个 Web 应用的所有“拍摄信息”(大概就是规定了如果要实现一个WEB容器,他的Context里面要有这些东西:获取路径,获取参数,获取当前的filter,获取当前的servlet等):

      全局道具清单(全局参数)

      // 存:setAttribute("道具名", 道具)
      context.setAttribute("database_url", "jdbc:mysql://localhost:3306/mydb");

      // 取:getAttribute("道具名")
      String dbUrl = (String) context.getAttribute("database_url");

演员名单(Servlet/Filter/Listener 配置)

// 动态添加一个“群演”(Servlet)
ServletRegistration.Dynamic servlet = context.addServlet("MyServlet", MyServlet.class);
servlet.addMapping("/my-url");

拍摄场地地图(资源路径)

// 获取文件在服务器上的真实路径(比如找剧本文件)
String realPath = context.getRealPath("/WEB-INF/config.xml");

StandardContext


StandardContext 是什么?

StandardContext 就是 Tomcat 的「包裹处理中枢」,它负责:

  1. 管理所有快递员(Servlet/Filter/Listener):记录每个快递员负责的区域(URL 路径)和操作规范(配置)
  2. 监控包裹(请求)流转:从快递车(HTTP 请求)到达分拣中心开始,到包裹派送完成(响应返回)的全流程
  3. 处理突发事件:比如包裹破损(请求错误)、超重(请求数据过大)等情况

具体功能大白话版

  1. 包裹登记处

    • 每个新到的快递(Web 应用)都要在这里注册信息,比如:

      • 📦 包裹类型:是文件(静态资源)还是生鲜(动态请求)?

        2

      • 📦 派送规则:哪些快递员(Servlet)处理哪些区域的包裹?

        2

  2. 快递员调度中心

    • 管理三大类工作人员:

      • 🚚

        卸货组(Listener)

        :包裹刚到分拣中心时检查外包装(请求初始化)


      • 🔍 分拣组(Filter):给包裹贴标签、消毒(参数处理/安全检查)

      • 🚛 派送组(Servlet):把包裹送到正确地址(生成响应)

  3. 异常处理机制

    • 如果发现危险品(恶意请求),会启动:

      • 🔒 自动拦截(返回 403 错误)

      • 📢 触发警报(记录日志/通知管理员)



和 ApplicationContext 的区别****6

StandardContext(快递分拣中心) ApplicationContext(智能中央厨房)
所属系统 Tomcat 专属 Spring 框架专属
主要功能 管理 Web 应用的请求处理流程 管理 Spring Bean 和依赖注入
数据存储 存 Servlet/Filter 配置 存业务对象和组件关系
典型操作 添加监听器、配置错误页面 加载配置文件、管理事务

实际开发中的存在感

当你在 Tomcat 的 conf/server.xml 里写这样的配置时:

<Context path="/shop" docBase="D:\myapp" reloadable="true"/>

背后的 StandardContext 就会:

  1. 📂 把 D:\myapp 文件夹识别为「shop 专区」
  2. 🔄 开启自动监控(reloadable),文件改动时自动刷新
  3. 🛡️ 给这个专区分配独立的安全策略(比如单独的登录验证)

一句话总结

StandardContext 就是 Tomcat 的「分拣中心主管」,它知道:

  • 每个包裹(请求)该走哪条流水线 🚚
  • 所有工作人员(Servlet/Filter)的排班表 📅
  • 遇到突发状况时该启动哪套应急预案 🚨

没有它,Tomcat 就像没有调度系统的快递站,包裹会乱成一锅粥!

一、三种 Context 的关系与角色

ServletContext ApplicationContext StandardContext
身份定位 官方菜单(规范)3 前台接待(门面)2****3 后厨主管(实际干活)2****6
职责 规定餐厅要有哪些功能(接口) 对外隐藏后厨细节,只展示规范功能 实际安排厨师、备菜、处理订单
存在感 顾客看不见,但所有菜品都按它制作 服务员拿菜单给顾客看 在厨房里吼着调度人员

二、具体功能大白话版

1. ServletContext —— 官方《餐饮业标准菜单》

-

作用

:国家规定所有餐厅必须支持的功能,比如:

  • 📜 必须能查菜品价格getInitParameter("折扣")

  • 📜 必须有服务员名单getServletRegistrations()

  • 📜 必须能记录客流量setAttribute("今日客流", 1000)

  • 特点

    • 所有餐厅(Web 应用)都必须遵守这套规范

      3

    • 顾客(开发者)看不到它,但菜单(功能)都是它规定的

2. ApplicationContext —— 餐厅前台服务员

-

作用

:把复杂的后厨操作包装成简单指令,比如:

  • 🧑🍳 加新菜addServlet("麻辣香锅", SpicyPot.class)

  • 🧹 换餐具addFilter("消毒过滤器", DisinfectionFilter.class)

  • 特点

    • 对顾客(开发者)隐藏了后厨切菜、炒菜的过程(底层 StandardContext 的复杂操作)

      2

    • 本质是 StandardContext 的“马甲”(门面模式)

      3

3. StandardContext —— 暴躁后厨主管

-

实际干活

  • 📌 管理所有厨师(Servlet/Filter/Listener)的排班表

  • 📌

    监控订单流程

    :从接单到上菜的每个环节(Pipeline-Valve 责任链)

    6

  • 📌 处理突发状况:比如食材不足(请求错误)时启动备用方案

  • 配置方式

    (三种后厨管理模式):

    • 📂

      默认模式

      :把菜谱(WAR 包)丢进固定柜子(webapps 目录),自动识别

      4

    • 📝

      手写模式

      :在总账本(server.xml)里写死菜单,重启生效

      4

    • 🗒️

      便利贴模式

      :在厨房墙上贴便利贴(conf/Catalina 目录下的 XML),随时修改

      4

      6


三、实际开发中的经典场景

场景 1:统计全站访问量

java

复制

// 用 ServletContext 存全局计数
ServletContext context = getServletContext();
context.setAttribute("visit_count", 0);

// 每次访问时 +1
synchronized(context) {
int count = (int) context.getAttribute("visit_count");
context.setAttribute("visit_count", count + 1);
}

场景 2:动态添加接口

java

复制

// 通过 ApplicationContext 加新功能
ServletRegistration.Dynamic servlet = context.addServlet("ApiServlet", ApiServlet.class);
servlet.addMapping("/api/*");

场景 3:紧急封禁 IP

java

复制

// 操作 StandardContext 加黑名单过滤器
StandardContext stdContext = (StandardContext) request.getContext(); // 获取后厨主管
stdContext.addFilter(new FilterDef(new IpBlockFilter())); // 塞个过滤器给他

四、一句话总结

  • ServletContext 是行业标准(菜单必须有哪些菜)
  • ApplicationContext 是服务员(按标准给顾客点菜)
  • StandardContext 是后厨(实际炒菜、处理订单)

三者就像餐厅的 「标准 → 接口 → 实现」,共同保证 Tomcat 能高效处理每个请求!

TomCat与Servlet的关系

https://blog.csdn.net/weixin_46225503/article/details/135307399

想象一个餐厅:

  • Tomcat 就像餐厅的前台和传菜员。它负责接待客人(接收浏览器发来的请求),安排座位(管理网络连接),然后把客人点的菜单交给后厨(Servlet),最后把做好的菜端回给客人(把处理结果返回给浏览器)。
  • Servlet 就像后厨的厨师。它不直接和客人打交道,但拿到菜单(HTTP请求)后,负责按需求炒菜(处理业务逻辑,比如登录、查询数据),然后把炒好的菜(生成的HTML页面或数据)交给传菜员(Tomcat)。

具体关系:

  1. Tomcat 是 Servlet 的“运行环境”
    就像手机需要安卓/iOS系统才能运行APP一样,Servlet 必须放在 Tomcat 这类“容器”里才能工作。Tomcat 负责管理 Servlet 的创建、调用和销毁。
  2. 分工明确
    • Tomcat 干粗活:处理网络通信(监听端口、解析HTTP协议)、多线程管理、安全性等底层细节。
    • Servlet 干细活:专注写业务逻辑(比如用户注册、数据查询),不用管网络怎么传数据。
  3. 协作流程
    当你在浏览器输入网址时:
    • Tomcat 先接收到请求,分析要找哪个 Servlet(比如处理登录的 LoginServlet)。
    • Tomcat 调用对应的 Servlet,把请求信息(参数、请求头等)传给它。
    • Servlet 处理完,把结果(比如生成的HTML页面)交给 Tomcat。
    • Tomcat 把结果包装成HTTP响应,发回给浏览器。

一句话总结:
Tomcat 是 Servlet 的“服务员+管家”,Servlet 是 Tomcat 的“打工人”。没有 Tomcat,Servlet 无法独立工作;没有 Servlet,Tomcat 只是个空壳。

Filter

Filter(过滤器)就像是你在网上点外卖时候的”中间商”。比如你下单后,外卖小哥送餐前会先检查你的订单是否正常,有没有违禁品,或者给你的餐盒加个保温袋,这就相当于过滤器的作用。

JavaWeb 的三大管家:

  1. Servlet:负责处理请求(像餐厅后厨)
  2. Filter:负责检查/加工请求和响应(像外卖打包员)
  3. Listener:负责监听事件(像监控摄像头)

过滤器具体能干这些事:

  • 请求到达服务器前:可以检查用户是否登录(像进小区要刷卡)
  • 服务器处理请求时:可以给请求数据消毒(像给快递消毒)
  • 服务器返回响应时:可以压缩数据(像快递打包)
  • 返回给用户前:可以屏蔽敏感词(像自动打马赛克)

举个例子:
比如你写了个论坛网站,用过滤器可以:

  1. 自动把用户发的脏话替换成***
  2. 检查用户是否登录才能发帖
  3. 记录每个访问的IP地址
  4. 给网页内容自动加上防拷贝水印

代码示例理解:
就像你雇了个保安(Filter),每个访客(请求)进公司(服务器)之前,保安会检查工牌(登录状态)。如果检查通过,就放行(chain.doFilter);如果没工牌,就拦在门外(跳转到登录页)。

整个过程就像流水线加工:
浏览器 → 过滤器1(比如检查登录)→ 过滤器2(比如记录日志)→ 服务器处理 → 过滤器3(比如压缩数据)→ 返回给浏览器

最大的好处是:不用改网站原有代码,就能批量增加各种安全检查和附加功能,就像给手机装各种滤镜APP一样方便。

Listener


Listener 大白话解释

Listener 就像快递站的「自动监控系统」,它不直接处理快递(请求/响应),但能自动感知快递站里发生的各种事件,比如:

  • 📦 有人来取件(用户创建了会话)
  • 📦 快递被退回(用户关闭了浏览器)
  • 📦 快递站开门/关门(服务器启动/关闭)
  • 📦 货架上的包裹被移动(数据被修改)

只要这些事件发生,监听器就会自动触发对应的操作,比如发短信通知你、更新库存、记录日志等等。


举个实际例子

场景:你想统计网站的在线人数
用 Listener 怎么做

  1. 当用户登录时(创建了一个 Session),自动给在线人数 +1
  2. 当用户退出或 Session 过期时,自动给在线人数 -1
  3. 当服务器重启时,自动清零在线人数

全程不需要你手动写代码去统计,监听器像个小雷达一样自动帮你盯着这些事件!


Listener 能监听哪些事?

1.

服务器级别

  • 服务器启动(比如加载数据库配置)
  • 服务器关闭(比如保存未处理完的数据)

2.

用户会话(Session)级别

  • 用户第一次访问(创建 Session)
  • 用户关闭浏览器(销毁 Session)

3.

数据变化

  • 某个数据被添加、修改、删除(比如购物车商品变化)

Listener vs Filter 区别

  • 🔧 Filter(过滤器):像保安,主动检查每个进出的人(请求/响应),不通过就拦下。
  • 📡 Listener(监听器):像监控摄像头,被动感知事件发生,默默执行后台任务。

一句话总结

Listener 就是给服务器装了个「智能感应器」,它能自动感知各种事件,并在背后帮你干活,就像你家的智能家居自动开灯关灯一样省心!

JSP 基础

JSP(Java Server Pages),是Java的一种动态网页技术。在早期Java的开发技术中,Java程序员如果想要向浏览器输出一些数据,就必须得手动println一行行的HTML代码。为了解决这一繁琐的问题,Java开发了JSP技术。

JSP可以看作一个Java Servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

当第一次访问JSP页面时,Tomcat服务器会将JSP页面翻译成一个java文件,并将其编译为.class文件。JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

JSP内置对象

JSP有九大内置对象,他们能够在客户端和服务器端交互的过程中分别完成不同的功能。其特点如下

  • 由 JSP 规范提供,不用编写者实例化

  • 通过 Web 容器实现和管理

  • 所有 JSP 页面均可使用

  • 只有在脚本元素的表达式或代码段中才能使用

  • 对 象 类型 说 明
    request javax.servlet.http.HttpServletRequest 获取用户请求信息
    response javax.servlet.http.HttpServletResponse 响应客户端请求,并将处理信息返回到客户端
    out javax.servlet.jsp.JspWriter 输出内容到 HTML 中
    session javax.servlet.http.HttpSession 用来保存用户信息
    application javax.servlet.ServletContext 所有用户共享信息
    config javax.servlet.ServletConfig 这是一个 Servlet 配置对象,用于 Servlet 和页面的初始化参数
    pageContext javax.servlet.jsp.PageContext JSP 的页面容器,用于访问 page、request、application 和 session 的属性
    page javax.servlet.jsp.HttpJspPage 类似于 Java 类的 this 关键字,表示当前 JSP 页面
    exception java.lang.Throwable 该对象用于处理 JSP 文件执行时发生的错误和异常;只有在 JSP 页面的 page 指令中指定 isErrorPage 的取值 true 时,才可以在本页面使用 exception 对象。

from:https://drun1baby.top/2022/08/19/Java%E5%86%85%E5%AD%98%E9%A9%AC%E7%B3%BB%E5%88%97-01-%E5%9F%BA%E7%A1%80%E5%86%85%E5%AE%B9%E5%AD%A6%E4%B9%A0/