期末速查手册

JavaWeb 核心知识点总结

Servlet · JSP · JDBC · AJAX · Filter · Maven

12 核心考点
6 知识模块
1 完整闭环
Q01

Servlet 完整的生命周期有哪些阶段?

Servlet 生命周期分 三个核心阶段:

  1. 初始化(init):容器创建实例后,仅执行一次 init() 方法。
  2. 服务(service):客户端请求到来,反复调用 service()(内部分发 doGet/doPost)处理请求。
  3. 销毁(destroy):服务器关闭 / 项目移除前,执行一次 destroy() 释放资源。
Q02

JSP 的三个内置对象的作用域区别

作用域 = 数据存活范围、共享范围。四作用域完整排序:

page< request< session< application
作用域对应对象范围生命周期常见场景
pagepageContext当前页面有效仅当前 JSP 页面页面内临时数据
requestrequest一次客户端请求请求 → 响应结束表单提交、页面间单次传参
sessionsession同一个浏览器会话浏览器打开 → 会话结束登录用户信息、个人会话数据
applicationapplication整个 Web 项目全局服务器启动 → 关闭网站全局配置、在线人数
核心速记
page 仅当前页;request 一次请求内(forward 可共享,刷新就没了);session 整个浏览器会话(关浏览器消失);application 全体用户共享(停服才销毁)。
Q03

HTTP 请求转发和重定向的区别

维度转发 forward重定向 redirect
请求次数1 次请求2 次请求
地址栏变化不变,显示原 URL更新为新 URL
数据共享共享 request 数据不共享,原 request 销毁
跳转位置服务器内部完成客户端重新发起请求
跳转范围仅限当前项目内内部 / 外部网址均可
状态码200(正常响应)302(临时重定向)

语法对比

// 转发(服务器内部跳转)
request.getRequestDispatcher("目标地址").forward(request, response);

// 重定向(客户端二次请求)
response.sendRedirect("目标地址");
速记口诀
一次请求地址不变,转发共享数据;两次请求地址改变,重定向跨站可行。
Q04

Session 工作原理以及失效的常见原因

一、工作原理

  1. 客户端首次访问,服务器创建 Session,生成唯一 SessionID。
  2. 服务器把 SessionID 以 Cookie 形式发给浏览器(默认名 JSESSIONID)。
  3. 浏览器每次请求,自动携带 JSESSIONID 发给服务器。
  4. 服务器根据 SessionID 找到对应 Session,实现同一用户跨页面共享数据。
核心
依靠 Cookie 传递 SessionID 来识别同一个会话。Cookie 禁用时,自动使用 URL 重写(地址栏拼接 ;jsessionid=xxx)。

二、常见失效原因

原因说明
会话超时(最常见)Tomcat 默认 30 分钟无请求自动销毁
手动销毁session.invalidate() 立即销毁
关闭浏览器临时 Cookie 丢失,再次打开为新会话
清除 CookieJSESSIONID 丢失,会话失效
服务器重启内存 Session 全部清空(除非持久化)
跨浏览器/隐身模式Cookie 隔离,视为不同会话
Q05

Cookie 从创建到客户端再次请求的完整工作流程

整体分为服务端创建响应 → 客户端保存 → 下次请求自动携带三大阶段。

完整流程

  1. 客户端首次发起 HTTP 请求:此时请求头不携带 Cookie。
  2. 服务端创建 Cookie:
    Cookie cookie = new Cookie("username", "test");
    cookie.setMaxAge(60 * 60); // 有效期 1 小时
    cookie.setPath("/");
    response.addCookie(cookie);
  3. 服务器返回响应:响应头携带 Set-Cookie 字段。
    Set-Cookie: username=test; Max-Age=3600; Path=/
  4. 浏览器接收并存储:
    • 会话 Cookie(未设置 MaxAge / 负值):存于浏览器内存,关闭即销毁。
    • 持久 Cookie(MaxAge > 0):写入本地磁盘,到期自动删除。
  5. 客户端再次请求同域名:浏览器自动筛选匹配的 Cookie。
  6. Cookie 放入请求头发送:
    Cookie: username=test
  7. 服务器读取 Cookie:
    Cookie[] cookies = request.getCookies();
    for (Cookie c : cookies) {
        if ("username".equals(c.getName())) { ... }
    }
Max-Age 取值说明
  • 正数:持久化,指定存活秒数
  • 负数(默认):会话 Cookie,浏览器关闭即失效
  • 0:立即删除对应 Cookie
Q06

Servlet 和 JSP 的关系和区别

核心关系
JSP 本质就是 Servlet。JSP 页面运行时,服务器先翻译成 Servlet 源代码,再编译成 class 执行。

执行流程:

.jsp→ Servlet .java→ .class→ 容器运行
维度ServletJSP
写法与侧重点纯 Java 类,Java 代码为主HTML 为主,内嵌 Java 代码
职责分工控制器(Controller)视图(View)
运行方式需手动配置映射路径容器自动识别,直接访问
内置对象无,需手动获取自带 9 大内置对象
一句话总结
JSP = 披着 HTML 外衣的 Servlet;Servlet 做控制,JSP 做展示,二者配合实现 JavaWeb 开发。
Q07

JDBC 操作 MySQL 数据库的完整步骤

六步核心流程

  1. 导入驱动包(mysql-connector-java)
  2. 加载数据库驱动
    Class.forName("com.mysql.cj.jdbc.Driver");
  3. 建立数据库连接
    String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
    Connection conn = DriverManager.getConnection(url, "root", "123456");
  4. 创建 SQL 执行对象
    // Statement(不推荐,易 SQL 注入)
    Statement stmt = conn.createStatement();
    
    // PreparedStatement(推荐)
    String sql = "select * from user where id = ?";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    pstmt.setInt(1, 1);
  5. 执行 SQL、处理结果
    • executeQuery():执行查询,返回 ResultSet
    • executeUpdate():执行增删改,返回受影响行数
  6. 关闭资源(逆序关闭)
    if (rs != null) rs.close();
    if (pstmt != null) pstmt.close();
    if (conn != null) conn.close();
关键注意
资源关闭写在 finally 中,保证一定执行;MySQL 8 必须加 serverTimezone=UTC。
Q08

连接池的作用

传统 JDBC 问题:每次操作数据库都要 创建连接 → 使用 → 关闭连接,开销大、耗时高。

连接池本质:提前初始化一批数据库连接,放入容器统一管理、重复复用。

核心作用

  1. 减少资源开销:连接只创建一次,循环复用,避免频繁创建、销毁的损耗。
  2. 提升响应速度:直接从池中获取连接,无需等待创建。
  3. 控制最大并发数:限制最大连接数量,防止数据库被压垮。
  4. 统一管理连接:自动回收空闲、超时、异常连接。

常见连接池

DBCP(Apache 经典) C3P0(自动重连) Druid 德鲁伊(阿里,企业主流) HikariCP(性能最高,SpringBoot 默认)
一句话速记
连接池就是数据库连接的 "缓存池",复用连接、提性能、控并发、护数据库。
Q09

PreparedStatement 和 Statement 的区别

维度StatementPreparedStatement
编译机制每次执行重新编译,效率低SQL 预编译一次,重复执行效率高
SQL 注入风险极易注入,不安全彻底防 SQL 注入(重点考点)
传参方式字符串拼接,繁琐易出错占位符 ? + setXxx() 赋值
批量操作批量处理能力弱原生支持批量添加/更新
数据类型处理手动转换、拼接引号自动匹配类型

传参示例对比

// Statement:字符串拼接(危险!)
String sql = "select * from user where name='" + name + "'";

// PreparedStatement:占位符(安全)
String sql = "select * from user where name=?";
pstmt.setString(1, name);
SQL 注入示例
恶意输入:' or '1'='1
Statement 拼接后 SQL 逻辑恒成立,泄露全部数据;PreparedStatement 会把整段内容当作普通参数,避免攻击。
Q10

AJAX 异步请求的完整流程(基于 XMLHttpRequest)

前端完整流程(7 步)

  1. 创建 XMLHttpRequest 对象
    let xhr = new XMLHttpRequest();
  2. 绑定状态监听事件
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4 &&& xhr.status === 200) {
            let res = xhr.responseText;
            console.log(res);
        }
    };

    readyState:0 未初始化 → 1 连接已建立 → 2 请求已接收 → 3 正在接收 → 4 请求完成

  3. 初始化请求 open()
    xhr.open("POST", "/ajaxServlet", true); // true = 异步
  4. POST 设置请求头
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  5. 发送请求 send()
    xhr.send("name=zhangsan&age=20");
  6. 后端处理并返回响应
  7. 前端回调渲染页面

后端处理要点(Servlet)

  • 接收参数:request.getParameter("name")
  • 设置编码:
    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
  • 禁止页面跳转:AJAX 场景不能使用 forward / redirect
  • 返回数据:JSON 为主流格式
GET vs POST(前端)
  • GET:参数拼在 URL 后,受长度限制,会被缓存
  • POST:参数放请求体,无长度限制,需手动设置 Content-Type
Q11

过滤器的使用原理及其场景

核心原理(链式过滤)

  1. 客户端发起请求访问 Servlet/JSP。
  2. 请求先经过匹配路径的 Filter,执行 doFilter()。
  3. chain.doFilter(request, response) 放行请求:
    • 放行前:对请求预处理
    • 放行后:资源处理完毕,对响应后处理
  4. 多个过滤器按注册顺序形成 过滤器链(FilterChain),依次执行。
  5. 所有过滤器放行后,才执行目标 Servlet/JSP。
  6. 响应原路倒序经过过滤器,最终返回浏览器。

三大生命周期方法

  • init():服务器启动时只执行一次
  • doFilter():每次匹配请求都执行,核心方法
  • destroy():项目停止时执行一次

常用使用场景

场景作用
统一编码设置拦截所有请求,统一设置 UTF-8,解决全站中文乱码
登录权限校验未登录用户禁止访问后台,无登录则重定向
URL 资源权限控制区分普通用户/管理员,校验角色权限
过滤敏感词汇替换评论、留言中的违规词
请求日志记录记录访问 IP、地址、时间、参数
跨域统一处理统一添加跨域响应头
压缩响应数据减小传输体积,提升速度
静态资源防盗链校验 Referer,拦截非法盗链

JavaWeb 完整业务闭环

flowchart TD
    A[浏览器客户端] -->|1.发起HTTP请求
携带Cookie/JSESSIONID| B[Filter过滤器链] B -->|预处理:编码/登录校验/跨域/日志| C{chain.doFilter
放行?} C -->|不放行:重定向/直接返回| Z[响应返回浏览器] C -->|放行| D[Servlet控制器] D -->|分支1:普通页面跳转| E[JSP视图] D -->|分支2:AJAX异步请求| F[处理业务,返回JSON文本] E -->|页面渲染完成| Z F -->|输出流返回数据| Z D --> G[业务Service] G --> H[数据库连接池] H --> I[Connection连接] I --> J[PreparedStatement预编译SQL] J --> K[MySQL数据库] K -->|查询/增删改结果| I I -->|归还连接到池| H D -.->|读取/写入session域数据| L[Session会话] L -.->|依靠Cookie存储JSESSIONID| A D -.->|response.addCookie设置Cookie| A E & F --> B B -->|后置处理:压缩、敏感词过滤| Z
JavaWeb 完整业务请求处理流程图
Q12

Maven 的优势和作用

Maven 是 Java 项目 项目构建 + 依赖管理工具,通过 pom.xml 统一管理项目。

核心作用

  1. 依赖管理(最核心):自动导入 jar 包,只需写坐标(groupId、artifactId、version),自动处理依赖传递、版本冲突。
  2. 标准化项目目录结构:
    • src/main/java:业务代码
    • src/main/resources:配置文件
    • src/test/java:测试代码
    • webapp:存放页面
  3. 统一项目构建生命周期:
    clean compile test package install deploy
  4. 仓库机制统一管理 jar:本地仓库 → 私服仓库 → 中央仓库,jar 只下载一次,多个项目共用。
  5. 多模块项目拆分管理:大型项目拆分子模块,统一父工程管理版本。
  6. 插件扩展:内置编译、测试、打包插件,可自定义实现代码生成、热部署等。
速记总结
  • 管 jar:依赖自动下载、解决冲突
  • 管目录:统一标准项目结构
  • 管构建:一键编译测试打包部署
  • 管仓库:本地/私服/中央三级仓库复用 jar
  • 管多模块:大型项目拆分、统一版本管理
YU FENGYUAN