java内存马基础
Java Web 三大件
Java Web 三大件,也就是 Servlet,Filter,Listener
当 Tomcat 接收到请求时候,依次会经过 Listener -> Filter -> Servlet
Servlet
这里简单总结下
我尽量用大白话解释一下这个链接里的内容:
- Servlet是什么:
- 你可以把Servlet理解成”服务员”,专门处理网站的各种请求。比如你点外卖(发送请求),服务员(Servlet)接单后去厨房(服务器)做好,再打包(生成网页)送给你。
- Servlet的工作场景:
- 动态生成网页(比如淘宝的商品页面,每个人看到的都不一样)
- 把请求转交给其他”服务员”处理(像餐厅里服务员之间交接工作)
- 连接数据库(比如查你的快递信息)
- 读取客户的小纸条(Cookie)
- 四个重要工具:
- 请求单子(HttpServletRequest):记录客户的所有要求(比如搜索关键词)
- 回复盒子(HttpServletResponse):用来打包要返回给客户的东西
- 个人工作牌(ServletConfig):每个服务员独有的配置(比如专属的调料配方)
- 餐厅公告板(ServletContext):所有服务员共享的信息(比如今日特价菜)
- 服务员的工作流程:
- 上班签到(init()):第一次被叫时做准备
- 处理订单(service()):根据客户要求(GET/POST)选择处理方法
- 下班收工(destroy()):关灯关煤气,收拾东西
- 两种上班方式:
- 有客人叫才起床(默认)
- 提前到岗待命(配置load-on-startup,数字越小越早上班)
- 配置小窍门:
- 整个餐厅的配置用(比如统一打8折)
- 个人配置用(比如某服务员专属的围裙颜色)
- 现在流行用@WebInitParam这种贴标签的方式配置(类似便利贴)
- 常用小功能:
- 获取客户要求:request.getParameter()(比如查快递单号)
- 设置返回格式:response.setContentType()(告诉浏览器返回的是网页还是图片)
- 存取临时数据:request.setAttribute()(像服务员之间传递小纸条)
简单来说,Servlet就是网站后台的”服务员团队”,负责接收用户请求、处理数据、生成网页,最后把结果返回给用户浏览器的整个过程。这些服务员们各司其职,有的专门处理登录,有的专门处理支付,共同维持网站的正常运作。
Tomcat
https://blog.csdn.net/qq_53287512/article/details/129278148
Tomcat 就像是一个“Java网站服务员”
你可以把它想象成餐厅里专门负责接待顾客的服务员。当你用 Java 写了一个网站(比如一个购物网站),Tomcat 的作用就是:
- 接电话:
当用户用浏览器访问你的网站(比如输入网址),Tomcat 会第一时间“接电话”,听懂用户想要什么(比如打开首页、提交订单)。 - 喊厨师干活:
Tomcat 自己不会处理复杂的业务(比如计算价格、查数据库),但它会喊你写的 Java 代码(比如 Servlet)来干活,就像服务员把订单传给后厨。 - 上菜:
等 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) |
拍摄场地地图(资源路径)
// 获取文件在服务器上的真实路径(比如找剧本文件) |
StandardContext
StandardContext 是什么?
StandardContext 就是 Tomcat 的「包裹处理中枢」,它负责:
- 管理所有快递员(Servlet/Filter/Listener):记录每个快递员负责的区域(URL 路径)和操作规范(配置)
- 监控包裹(请求)流转:从快递车(HTTP 请求)到达分拣中心开始,到包裹派送完成(响应返回)的全流程
- 处理突发事件:比如包裹破损(请求错误)、超重(请求数据过大)等情况
具体功能大白话版
包裹登记处
每个新到的快递(Web 应用)都要在这里注册信息,比如:
📦 包裹类型:是文件(静态资源)还是生鲜(动态请求)?
2
📦 派送规则:哪些快递员(Servlet)处理哪些区域的包裹?
2
快递员调度中心
管理三大类工作人员:
🚚
卸货组(Listener)
:包裹刚到分拣中心时检查外包装(请求初始化)
🔍 分拣组(Filter):给包裹贴标签、消毒(参数处理/安全检查)
🚛 派送组(Servlet):把包裹送到正确地址(生成响应)
异常处理机制
如果发现危险品(恶意请求),会启动:
🔒 自动拦截(返回 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 就会:
- 📂 把
D:\myapp
文件夹识别为「shop 专区」 - 🔄 开启自动监控(reloadable),文件改动时自动刷新
- 🛡️ 给这个专区分配独立的安全策略(比如单独的登录验证)
一句话总结
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 存全局计数 |
场景 2:动态添加接口
java
复制
// 通过 ApplicationContext 加新功能 |
场景 3:紧急封禁 IP
java
复制
// 操作 StandardContext 加黑名单过滤器 |
四、一句话总结
- ServletContext 是行业标准(菜单必须有哪些菜)
- ApplicationContext 是服务员(按标准给顾客点菜)
- StandardContext 是后厨(实际炒菜、处理订单)
三者就像餐厅的 「标准 → 接口 → 实现」,共同保证 Tomcat 能高效处理每个请求!
TomCat与Servlet的关系
https://blog.csdn.net/weixin_46225503/article/details/135307399
想象一个餐厅:
- Tomcat 就像餐厅的前台和传菜员。它负责接待客人(接收浏览器发来的请求),安排座位(管理网络连接),然后把客人点的菜单交给后厨(Servlet),最后把做好的菜端回给客人(把处理结果返回给浏览器)。
- Servlet 就像后厨的厨师。它不直接和客人打交道,但拿到菜单(HTTP请求)后,负责按需求炒菜(处理业务逻辑,比如登录、查询数据),然后把炒好的菜(生成的HTML页面或数据)交给传菜员(Tomcat)。
具体关系:
- Tomcat 是 Servlet 的“运行环境”
就像手机需要安卓/iOS系统才能运行APP一样,Servlet 必须放在 Tomcat 这类“容器”里才能工作。Tomcat 负责管理 Servlet 的创建、调用和销毁。 - 分工明确
- Tomcat 干粗活:处理网络通信(监听端口、解析HTTP协议)、多线程管理、安全性等底层细节。
- Servlet 干细活:专注写业务逻辑(比如用户注册、数据查询),不用管网络怎么传数据。
- 协作流程
当你在浏览器输入网址时:- Tomcat 先接收到请求,分析要找哪个 Servlet(比如处理登录的 LoginServlet)。
- Tomcat 调用对应的 Servlet,把请求信息(参数、请求头等)传给它。
- Servlet 处理完,把结果(比如生成的HTML页面)交给 Tomcat。
- Tomcat 把结果包装成HTTP响应,发回给浏览器。
一句话总结:
Tomcat 是 Servlet 的“服务员+管家”,Servlet 是 Tomcat 的“打工人”。没有 Tomcat,Servlet 无法独立工作;没有 Servlet,Tomcat 只是个空壳。
Filter
Filter(过滤器)就像是你在网上点外卖时候的”中间商”。比如你下单后,外卖小哥送餐前会先检查你的订单是否正常,有没有违禁品,或者给你的餐盒加个保温袋,这就相当于过滤器的作用。
JavaWeb 的三大管家:
- Servlet:负责处理请求(像餐厅后厨)
- Filter:负责检查/加工请求和响应(像外卖打包员)
- Listener:负责监听事件(像监控摄像头)
过滤器具体能干这些事:
- 请求到达服务器前:可以检查用户是否登录(像进小区要刷卡)
- 服务器处理请求时:可以给请求数据消毒(像给快递消毒)
- 服务器返回响应时:可以压缩数据(像快递打包)
- 返回给用户前:可以屏蔽敏感词(像自动打马赛克)
举个例子:
比如你写了个论坛网站,用过滤器可以:
- 自动把用户发的脏话替换成***
- 检查用户是否登录才能发帖
- 记录每个访问的IP地址
- 给网页内容自动加上防拷贝水印
代码示例理解:
就像你雇了个保安(Filter),每个访客(请求)进公司(服务器)之前,保安会检查工牌(登录状态)。如果检查通过,就放行(chain.doFilter);如果没工牌,就拦在门外(跳转到登录页)。
整个过程就像流水线加工:
浏览器 → 过滤器1(比如检查登录)→ 过滤器2(比如记录日志)→ 服务器处理 → 过滤器3(比如压缩数据)→ 返回给浏览器
最大的好处是:不用改网站原有代码,就能批量增加各种安全检查和附加功能,就像给手机装各种滤镜APP一样方便。
Listener
Listener 大白话解释
Listener 就像快递站的「自动监控系统」,它不直接处理快递(请求/响应),但能自动感知快递站里发生的各种事件,比如:
- 📦 有人来取件(用户创建了会话)
- 📦 快递被退回(用户关闭了浏览器)
- 📦 快递站开门/关门(服务器启动/关闭)
- 📦 货架上的包裹被移动(数据被修改)
只要这些事件发生,监听器就会自动触发对应的操作,比如发短信通知你、更新库存、记录日志等等。
举个实际例子
场景:你想统计网站的在线人数
用 Listener 怎么做:
- 当用户登录时(创建了一个 Session),自动给在线人数 +1
- 当用户退出或 Session 过期时,自动给在线人数 -1
- 当服务器重启时,自动清零在线人数
全程不需要你手动写代码去统计,监听器像个小雷达一样自动帮你盯着这些事件!
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 对象。