云计算百科
云计算领域专业知识百科平台

【华工2025版】网络应用架构PPT笔记(可以在专栏下载格式规整的pdf)

复习课敲重点

⼀、考试核⼼信息

1. 考试时间:2026年1⽉12⽇(星期⼀)9:00-11:00

2. 考试地点:A1-201、A1-202

3. 答题要求:

试卷含试题卷(4⻚)和答题卷(6⻚),答案必须写在答题卷上,试题卷答题⽆效

需在试题卷和答题卷指定位置填写姓名、学号、专业班级、座位号(座位号考前公布)

4. 题型结构:

单项选择题(10道)

填空题(5个)

简答题(4-5道)

编程题

⼆、核⼼复习模块

(⼀)Web基础知识

1. HTML基本概念(核⼼标签、⽂档结构、常⽤属性)

2. HTTP协议(请求⽅法、响应状态码、请求/响应头结构、⽆状态特性)

3. Tomcat相关:

基本概念(Java Web服务器的作⽤、核⼼功能)

配置(端⼝配置、虚拟主机配置、环境变量配置)

部署(war包部署、⽬录部署⽅式、部署流程)

(⼆)Servlet

1. 基本概念(定义、作⽤、与Java类的区别、核⼼特性)

2. HttpServlet类(继承关系、核⼼⽅法、请求处理流程)

3. 核⼼接⼝:

ServletConfig接⼝(获取Servlet配置参数、获取ServletContext对象)

ServletContext接⼝(全局上下⽂、共享数据、获取资源路径)

4. 核⼼对象:

HttpServletRequest对象(获取请求参数、请求头、Cookie、Session关联)

HttpServletResponse对象(设置响应头、响应数据、Cookie写⼊、重定向)

5. 核⼼⽅法:

doGet()⽅法(请求处理逻辑、参数传递⽅式、适⽤场景)

doPost()⽅法(与doGet()的区别、参数传递特点、数据安全性)

6. 其他关键组件:

RequestDispatch对象(请求转发、资源跳转、数据共享)

Cookie对象(创建、设置属性、发送与获取、⽣命周期)

Session对象(创建机制、会话维持、数据存储与获取、失效策略)

7. Servlet的⽣命周期(初始化init()、服务service()、销毁destroy()、各阶段触发条件)

8. Filter过滤器(定义、作⽤、⽣命周期、配置⽅式、过滤链流程)

9. Listener监听器(核⼼类型、监听事件、作⽤场景、配置⽅式)

(三)JSP

1. 基本概念(定义、作⽤、与Servlet的关系、优势)

2. JSP语法(脚本⽚段<% %>、表达式<%= %>、声明<%! %>、注释格式)

3. 执⾏过程(翻译阶段、编译阶段、运⾏阶段、结果输出流程)

4. 与Servlet的区别(开发⽅式、运⾏机制、适⽤场景、优缺点对⽐)

5. JSP指令(page指令、include指令、taglib指令,各指令核⼼属性)

6. JSP内置对象(request、response、session、application、out、config、page、

pageContext、exception,每个对象的作⽤与常⽤⽅法)

7. JSP动作(<jsp:include>、<jsp:forward>、<jsp:useBean>、<jsp:setProperty>、

<jsp:getProperty>,动作标签的⽤法与特点)

8. include与forward的区别(静态包含vs动态包含、请求转发的跳转机制、数据传递差异)

(四)EL和JSTL

1. JavaBean的基本概念(定义规范、属性封装、getter/setter⽅法、作⽤)

2. EL表达式:

基本概念(作⽤、语法格式、优势)

标识符、保留字(合法标识符规则、常⻅保留字)

变量、常量(数据类型、取值⽅式)

运算符(算术运算符、⽐较运算符、逻辑运算符、empty运算符、三元运算符)

3. JSTL:

基本概念(JSP标准标签库的作⽤、核⼼标签库分类)

核⼼标签(循环标签<c:forEach>、条件标签<c:if>、<c:choose>、URL标签<c:url>等的⽤法)

标签使⽤前提(引⼊taglib指令、依赖jar包)

(五)JDBC

1. 基本概念(定义、作⽤、Java访问数据库的核⼼技术、优势)

2. 常⽤API(DriverManager、Connection、Statement、PreparedStatement、ResultSet)

3. 程序实现流程(加载驱动、建⽴连接、创建Statement对象、执⾏SQL语句、处理结果集、关闭资

源,各步骤异常处理)

4. 关键细节(SQL注⼊防范、事务处理、批处理操作、连接池概念)

(六)MVC设计模式

1. 基本概念(Model、View、Controller的职责划分、核⼼思想)

2. 两种常⽤设计模式(具体模式名称、实现原理、适⽤场景、优缺点)

3. MVC在Java Web中的应⽤(各层对应组件、数据流转流程)

(七)Spring

1. 基本概念(定义、核⼼特性、优势、适⽤场景)

2. 依赖注⼊(DI的概念、实现⽅式、作⽤、注⼊类型)

3. ⾯向切⾯的编程(AOP的概念、核⼼术语、作⽤、实现原理)

三、复习建议

1. 侧重基础知识:重点掌握各模块核⼼概念、定义、核⼼⽅法/标签/API的作⽤,确保选择题、填空题

不丢分。

2. 强化实践编程:针对Servlet、JSP、JDBC相关知识点,结合案例练习编程题(如表单提交处理、

数据库增删改查、会话管理等场景)。

3. 梳理逻辑关联:明确Servlet与JSP的协作流程、MVC各层的交互关系、HTTP请求从客⼾端到服务

器的处理链路。

4. 关注细节差异:如doGet()与doPost()的区别、include指令与动作的差异、Cookie与Session的适

⽤场景等,应对简答题。5. 规范答题习惯:牢记答题卷书写要求,编程题注意代码格式规范、注释清晰,避免因格式问题丢

分。

Web基础知识复习笔记

说明:本笔记聚焦Web开发核⼼基础知识点,涵盖HTML、HTTP协议、Tomcat三⼤核⼼模块,梳理各

模块核⼼概念、重点内容及关键考点,助⼒复习巩固。

Ch1 ⽹络应⽤架构设计与开发概论

⼀、考试核⼼信息

1. 考试时间:12⽉16⽇(暂定)

2. 成绩构成:期末卷⾯成绩60% + 实验报告40%

3. 考试内容:基础理论和概念 + 编程能⼒(与实验紧密关联)

4. 关键注意事项:考试前务必按时提交实验报告

⼆、核⼼知识点梳理

(⼀)⽹络基础概念

1. 互联⽹与因特⽹

互联⽹:泛指任何能彼此通信的设备组成的⽹络集合

因特⽹(Internet):特指采⽤TCP/IP协议构建的全球性、开放的计算机互联⽹络

发展关键节点:

1960年:ARPA⽹(DARPA主导)奠基

1974年:罗伯特·卡恩与⽂顿·瑟夫提出TCP/IP协议(获2004年图灵奖)

1983年:ARPA⽹正式采⽤TCP/IP作为核⼼协议

1991年:蒂姆·伯纳斯-李推出万维⽹(WWW)公共服务

1994年:万维⽹联盟(W3C)成⽴

2. ⽹络层结构模型

模型

层级划分(⾃上⽽下)

核⼼功能

OSI参考模型

应⽤层→表⽰层→会话层→传

输层→⽹络层→数据链路层→

物理层

应⽤层:提供应⽤服务;表⽰

层:数据格式转换/加密;传

输层:端到端连接管理;⽹络

层:IP选址与路由TCP/IP模型

应⽤层→传输层→⽹络层→链

路层

各层基于下层服务,为上层提

供⽀撑,通过协议栈协同⼯作

3. TCP/IP协议簇核⼼协议

TCP(传输控制协议):⾯向连接、可靠、全双⼯通信,负责数据分割、重组,适⽤于需要可靠传

输的场景(如HTTP)

UDP(⽤⼾数据报协议):⽆连接、简单、可靠性低,适⽤于实时通信(如视频通话)

IP(⽹际协议):⽆连接,负责计算机间数据包路由,IPv4采⽤32位地址(点分⼗进制表⽰,共42

亿+地址)

辅助协议:ICMP(错误与状态反馈)、DHCP(动态寻址)、DNS(域名解析)

(⼆)万维⽹(WWW)核⼼技术

1. 万维⽹基础

定义:基于互联⽹的超⽂本系统,通过URI标识资源,采⽤HTTP协议通信,是信息空间⽽⾮⽹络本

核⼼三要素:

URI(统⼀资源标识符):标识资源的字符串(含URL、URN⼦类型)

HTTP(超⽂本传输协议):客⼾端与服务器通信标准

HTML(超⽂本标记语⾔):定义⽹⻚结构与格式

2. URL与URI

URL(统⼀资源定位器):组成=协议名称+主机地址+端⼝号+资源名称(例:

http://www.scut.edu.cn:80/index.html

默认端⼝:HTTP为80,HTTPS为443,可省略

主机地址:⽀持域名(如www.google.com)或IP地址(如[12.45.56.67](12.45.56.67))

URI与URL关系:URL是URI的⼦集,所有URL都是URI,但URI不⼀定是URL

3. HTTP协议

核⼼特性:

⽆连接:⼀次连接处理⼀个请求,响应后断开

媒体独⽴:⽀持任意数据类型(通过MIME-type指定)

⽆状态:协议⽆事务记忆能⼒,需通过Cookie/Session补充状态

请求-响应流程:

a. 客⼾端(浏览器)建⽴TCP连接,发送HTTP请求b. 服务器处理请求,返回HTTP响应

c. 客⼾端接收响应,关闭连接并渲染内容

请求消息结构:请求⾏(⽅法+URL+协议版本)+ 请求头部 + 空⾏ + 请求数据

响应消息结构:状态⾏ + 消息报头 + 空⾏ + 响应正⽂

8种请求⽅法(常⽤核⼼):

GET:获取资源(参数在URL中,⻓度有限)

POST:提交数据(参数在请求体,⽀持⼤⽂件/敏感数据)

PUT:更新资源;DELETE:删除资源

常⻅状态码:

200:请求成功;301:资源永久重定向

404:请求资源不存在;500:服务器内部错误

(三)Web前端开发技术

1. HTML(超⽂本标记语⾔)

核⼼作⽤:定义⽹⻚结构与内容,⾮编程语⾔

常⽤标签:

⽂档结构: <html> (根标签)、 <head> (头部)、 <body> (主体)

内容标签: <h1>-<h6> (标题)、 <p> (段落)、 <a> (超链接)、 <img> (图

⽚)、 <table> (表格)、 <form> (表单)

HTML5新特性:

媒体元素: <canvas> (绘画)、 <video> / <audio> (⾳视频)

语义标签: <article> <footer> <header> <nav> <section>

新表单控件:calendar、date、email、url、search

功能API:地理定位(Geolocation)、本地存储(localStorage/sessionStorage)、设备传感

2. CSS(层叠样式表)

核⼼思想:分离内容(HTML)与表现(样式),⽀持样式重⽤与层叠

三种引⼊⽅式:

a. 内联样式:通过元素 style 属性(优先级最⾼,仅作⽤于当前元素)

b. 内部样式表: <style> 标签(作⽤于当前⻚⾯)

c. 外部样式表: .css ⽂件+ <link> 引⼊(优先级最低,可复⽤)

核⼼知识点:

选择器:类型选择器(如 p )、类选择器(如 .class )、ID选择器(如 #id )、伪类

(如 a:hover

盒模型:content(内容区)→ padding(内边距)→ border(边框)→ margin(外边距)

关键特性:继承性、优先级、响应式设计(媒体查询)、动画与过渡

3. JavaScript(JS)

核⼼定位:客⼾端脚本语⾔,为⽹⻚添加动态交互功能

组成部分:

ECMAScript:语法与基础对象(核⼼标准)

DOM(⽂档对象模型):操作⽹⻚内容/结构/样式的API

BOM(浏览器对象模型):与浏览器交互的API

核⼼功能:

操作DOM:获取元素( getElementById )、修改内容( textContent )、绑定事件

onclick

BOM对象: window (核⼼)、 location (URL信息)、 navigator (浏览器信

息)、 history (历史记录)

应⽤场景:表单验证、动态更新⻚⾯、动画效果、AJAX请求

(四)Web后端与动态⽂档技术

1. 动态⽂档与静态⽂档

静态⽂档:固定内容,服务器直接返回⽂件(如静态HTML)

动态⽂档:内容按需⽣成,分两类:

服务器端:CGI、ASP.NET、PHP、JSP、Servlet(核⼼)

客⼾端:JavaScript+DOM(⽆需服务器参与)

2. Servlet与JSP

Servlet:

定义:运⾏在Web容器(如Tomcat)中的Java程序,作为客⼾端与服务器资源的中间层

优势:相⽐CGI性能更⾼(常驻内存)、跨平台(Java特性)、安全可靠

核⼼功能:处理HTTP请求、与数据库交互、动态⽣成响应

JSP(Java Server Pages):

定义:HTML中嵌⼊Java脚本的动态⽹⻚技术,⽂件后缀 .jsp

优势:兼顾HTML的⻚⾯展⽰与Java的业务处理,移植性强(跨平台)、⽀持企业级Java API

(JDBC、EJB等)

与Servlet关系:JSP本质会被编译为Servlet执⾏,互补分⼯(JSP侧重视图,Servlet侧重控

制)

3. MVC设计模式

核⼼思想:将应⽤分为三⼤组件,松耦合设计

Model(模型):处理业务逻辑与数据管理(如JavaBean)

View(视图):展⽰数据(如JSP⻚⾯)

Controller(控制器):接收请求、转发处理、返回响应(如Servlet)

两种体系结构:

Model 1:JSP+JavaBean(⽆独⽴控制器,适⽤于⼩型项⽬,维护性差)

Model 2:JSP(View)+ Servlet(Controller)+ JavaBean(Model)(推荐,结构清晰,可

扩展性强)

4. Tomcat服务器

定位:开源Web容器(⽀持Servlet/JSP),兼具Web服务器功能

关键配置:

下载安装:需先安装Java运⾏时环境(JRE/JDK),官⽹:http://tomcat.apache.org/

端⼝配置:默认HTTP端⼝8080,可修改 conf/server.xml 的Connector端⼝属性(如改为

80)

核⼼⽬录:

bin:可执⾏⽂件与脚本;conf:配置⽂件;lib:依赖jar包;webapps:部署应⽤程序;

logs:⽇志⽂件

(五)AJAX技术

定义:异步JavaScript和XML(现主流⽤JSON),⽆需刷新整个⻚⾯即可与服务器交换数据并局

部更新

核⼼原理:基于 XMLHttpRequest 对象或 Fetch API ,实现异步通信

⼯作流程:

a. 创建请求对象( new XMLHttpRequest() fetch()

b. 配置请求参数(⽅法、URL、异步标识)

c. 绑定回调函数(监听请求状态变化)

d. 发送请求( send() ,POST可附带数据)e. 处理响应(解析JSON/XML,通过DOM更新⻚⾯)

核⼼价值:提升⽤⼾体验(⽆刷新)、减少⽹络带宽消耗

三、复习建议

1. 理论重点:

吃透TCP/IP协议栈、HTTP协议(请求⽅法、状态码、消息结构)

掌握MVC设计模式、Servlet/JSP⼯作原理

区分核⼼概念:互联⽹vs万维⽹、TCPvsUDP、URIvsURL、DOMvsBOM

2. 编程实践(与实验紧密关联):

前端:HTML/CSS布局、JavaScript DOM操作、简单BOM应⽤

后端:Servlet接收请求/处理响应、JSP⻚⾯动态渲染

综合:AJAX异步请求(原⽣XHR或Fetch API)、前后端数据交互

3. 实验报告关联:

重点回顾实验中涉及的编程案例(如Servlet配置、AJAX请求实现、MVC结构搭建)

确保实验报告中核⼼代码与理论知识点对应(如HTTP请求处理、数据库连接逻辑)

4. 易错点提醒:

HTTP⽆状态特性的影响与解决⽅案

CSS选择器优先级与层叠规则

Servlet⽣命周期与Tomcat部署注意事项

AJAX异步回调的执⾏顺序

祝各位同学复习顺利,考试成功!如需进⼀步答疑,可通过课程QQ群(群号:1041862736)交流。

Ch2 Servlet

⼀、核⼼概念

1. Servlet定义与定位

本质:运⾏在Web服务器端(如Tomcat)的Java程序,基于HTTP协议,是Java Web开发的基

础。

与JSP的关系:JSP⻚⾯运⾏前会被JSP容器翻译成Servlet,服务器端实际运⾏的是Servlet。

核⼼依赖:Servlet API(⼀组接⼝和类),提供Servlet与容器的标准通信框架,独⽴于平台。

2. 主要功能1. 读取客⼾提交的显式数据(HTML表单输⼊、hidden标签数据);

2. 读取浏览器发送的隐式请求数据(HTTP报⽂头、Cookie、浏览器⽀持的媒体类型等);

3. ⽣成响应结果(访问数据库、调⽤Web服务、直接计算);

4. 向客⼾发送显式数据(HTML、XML、⼆进制图像等);

5. 发送隐式HTTP响应数据(响应头、Cookie、缓存参数等)。

⼆、Servlet优势

1. ⾃⾝核⼼优势

基于Java语⾔:继承跨平台、⾯向对象、强类型、垃圾回收、丰富类库等特性;

模块化与可扩展性:便于功能扩展和代码重⽤,可维护性强;

安全可靠:Java安全管理器限制资源访问,可信度⾼。

2. 与CGI的对⽐优势

特性

Servlet

CGI

线程模型

多线程(每个请求⼀个线程)

多进程(每个请求⼀个进程)

运⾏状态

启动时加载,驻留服务器内存

每次请求重新创建进程,效率

运⾏空间

Web服务器地址空间内执⾏

独⽴进程,资源消耗⼤

平台依赖性

跨平台(Java编写)

依赖平台,可移植性差

三、Servlet⼯作原理

1. Web服务器(Servlet容器)接收客⼾端请求,创建“请求(HttpServletRequest)”和“响应

(HttpServletResponse)”对象;

2. 判断请求对应的Servlet对象是否存在:

存在:直接调⽤其 service() ⽅法(间接调⽤ doGet() / doPost() ),传⼊请求和响应

对象;

不存在:加载Servlet类→创建实例→调⽤ init() ⽅法初始化→调⽤ service() ⽅法;

3. service() ⽅法处理请求(获取客⼾端数据、业务逻辑处理),通过响应对象返回结果;

4. 请求处理完成后,线程销毁或回收到线程池,请求/响应对象失效。

四、Servlet API核⼼组件1. 四⼤核⼼包

包名

功能描述

javax.servlet

定义协议⽆关的Servlet接⼝

和类

javax.servlet.http

定义HTTP协议相关的Servlet

接⼝和类

javax.servlet.annotat

ion

定义9个注解类型和2个枚举

类型

javax.servlet.descrip

tor

定义访问Web应⽤配置信息的

类型

2. 核⼼接⼝与类的继承关系

代码块

Servlet接⼝ 实现 GenericServlet抽象类 继承 HttpServlet抽象类

ServletConfig接⼝ 实现 GenericServlet抽象类

ServletRequest接⼝ 扩展 HttpServletRequest接⼝

ServletResponse接⼝ 扩展 HttpServletResponse接⼝

3. 核⼼接⼝详解

(1)Servlet接⼝(核⼼)

所有Servlet必须直接/间接实现,定义5个核⼼⽅法:

⽅法

类型

功能描述

init(ServletConfig

config)

⽣命周期

初始化Servlet实例,仅调⽤1

service(ServletRequest

req, ServletResponse

res)

⽣命周期

处理客⼾端请求,每次请求调

⽤1次

destroy()

⽣命周期

销毁Servlet,释放资源,仅

调⽤1次

getServletConfig()

普通⽅法

获取Servlet配置信息

1

2

3

4getServletInfo()

普通⽅法

返回Servlet描述信息

(2)GenericServlet抽象类

实现 Servlet ServletConfig 接⼝,提供除 service() 外的所有⽅法默认实现;

核⼼作⽤:将 ServletConfig 赋给类级变量,可直接调⽤ ServletConfig ⽅法;

极少直接使⽤,需重写 service() ⽅法。

(3)HttpServlet抽象类(最常⽤)

扩展 GenericServlet ,针对HTTP协议封装,新增 service(HttpServletRequest,

HttpServletResponse) ⽅法;

针对HTTP请求类型(GET、POST、PUT、DELETE)提供对应处理⽅法,常⽤:

doGet(HttpServletRequest req, HttpServletResponse resp) :处理GET请

doPost(HttpServletRequest req, HttpServletResponse resp) :处理POST

请求;

开发时⽆需重写 service() ,直接重写 doGet() / doPost() 即可。

五、Servlet创建⽅式(含代码⽰例)

1. 实现Servlet接⼝(基础⽅式)

代码块

public class ServletDemo implements Servlet {

// 初始化:仅调⽤1

@Override

public void init(ServletConfig arg0) throws ServletException {

System.out.println("=======init=========");

}

// 处理请求:每次请求调⽤1

@Override

public void service(ServletRequest arg0, ServletResponse arg1) throws

ServletException, IOException {

System.out.println("处理请求…");

}

// 销毁:仅调⽤1次(服务器关闭时)

@Override

public void destroy() {

System.out.println("******destroy**********");

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18@Override

public ServletConfig getServletConfig() { return null; }

@Override

public String getServletInfo() { return null; }

}

2. 继承GenericServlet类(极少使⽤)

代码块

public class ServletDemo extends GenericServlet {

@Override

public void service(ServletRequest arg0, ServletResponse arg1) throws

ServletException, IOException {

System.out.println("通过GenericServlet处理请求");

}

}

3. 继承HttpServlet类(主流⽅式)

代码块

public class ServletDemo extends HttpServlet {

// 处理GET请求

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

System.out.println("处理GET请求");

}

// 处理POST请求(可调⽤doGet统⼀处理)

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

System.out.println("处理POST请求");

doGet(req, resp);

}

}

六、Servlet⽣命周期(重点考点)

19

20

21

22

23

24

25

1

2

3

4

5

6

1

2

3

4

5

6

7

8

9

10

11

12

13

141. 四个阶段

阶段

触发时机

核⼼⽅法

调⽤次数

加载与实例化

服务器启动时或第⼀次访

问时

类构造⽅法(容器调⽤)

1次

初始化

实例创建后⽴即执⾏

init(ServletConfig

)

1次

服务阶段

每次接收客⼾端请求

service() doGet(

) / doPost()

多次

销毁阶段

服务器关闭或应⽤卸载时

destroy()

1次

2. 关键说明

⽣命周期完全由Web容器管理,程序员⽆法直接调⽤⽣命周期⽅法;

init() ⽅法⽤于初始化资源(如数据库连接), destroy() ⽅法⽤于释放资源(如关闭连

接);

Servlet实例在⽣命周期内唯⼀(单例模式)。

七、核⼼辅助接⼝:ServletConfig与ServletContext

1. ServletConfig接⼝(Servlet专属配置)

作⽤:封装单个Servlet的初始化配置信息(Servlet名称、初始化参数、ServletContext对象);

核⼼⽅法:

String getServletName() :获取Servlet在web.xml中的配置名称;

String getInitParameter(String name) :获取指定名称的初始化参数值;

Enumeration<String> getInitParameterNames() :获取所有初始化参数名称;

ServletContext getServletContext() :获取Web应⽤的ServletContext对象;

配置⽅式(web.xml):

代码块

<servlet>

<servlet-name>ServletConfigDemo</servlet-name>

<servlet-class>gacl.servlet.study.ServletConfigDemo</servlet-class>

<!– 初始化参数 –>

<init-param>

1

2

3

4

5<param-name>name</param-name>

<param-value>gacl</param-value>

</init-param>

<init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

</servlet>

2. ServletContext接⼝(Web应⽤全局配置)

作⽤:代表整个Web应⽤,封装Web应⽤的全局信息,全局共享(所有Servlet可访问);

核⼼优势:配置信息可通过web.xml修改,⽆需改动代码,维护性强;

核⼼⽅法:

String getInitParameter(String name) :获取全局初始化参数值;

void setAttribute(String name, Object obj) :设置全局共享属性;

Object getAttribute(String name) :获取全局共享属性;

获取⽅式:

代码块

// ⽅式1:通过ServletConfig获取

ServletContext context = getServletConfig().getServletContext();

// ⽅式2:直接获取(GenericServlet提供)

ServletContext context = getServletContext();

全局配置(web.xml):

代码块

<context-param>

<param-name>dname</param-name>

<param-value>com.mysql.jdbc.Driver</param-value>

</context-param>

3. 两者区别

特性

ServletConfig

ServletContext

作⽤范围

单个Servlet专属

整个Web应⽤全局共享

6

7

8

9

10

11

12

13

1

2

3

4

1

2

3

4配置标签

<init-param> (Servlet内

部)

<context-param> (Web

应⽤根节点)

实例数量

每个Servlet对应1个实例

每个Web应⽤对应1个实例

⼋、Request与Response核⼼操作(⾼频考点)

1. HttpServletRequest接⼝(封装客⼾端请求)

核⼼功能:获取HTTP请求的所有信息(请求⾏、请求头、请求参数、客⼾机信息等);

常⽤⽅法分类:

功能类别

代表⽅法

客⼾机信息

getRemoteAddr() (IP地

址)、 getRequestURL()

(完整URL)

请求⾏信息

getMethod() (请求⽅式

GET/POST)、

getRequestURI() (资源

路径)

请求参数

getParameter(String

name) (单个参数)、

getParameterValues(Str

ing name) (多个同名参

数)

请求头信息

getHeader(String

name) (单个请求头)、

getHeaderNames() (所有

请求头)

GET与POST请求区别(重点):

特性

GET请求

POST请求

数据位置

附在URL后(?分割,&连接参

数)

封装在HTTP请求体中

可⻅性

地址栏可⻅,安全性低

地址栏不可⻅,安全性⾼

数据类型限制

仅⽀持ASCII字符

⽀持ISO10646全字符集主要⽤途

从服务器获取数据

向服务器提交数据(增删改)

2. HttpServletResponse接⼝(封装服务器响应)

核⼼功能:向客⼾端发送响应(响应头、状态码、响应体);

常⽤操作:

a. 输出数据:

getOutputStream() :输出⼆进制数据(如⽂件下载);

getWriter() :输出字符数据(如HTML、中⽂);

注意:两者互相排斥,调⽤⼀个后不能再调⽤另⼀个;

b. 中⽂乱码解决:确保服务端与客⼾端编码⼀致(如UTF-8);

c. 状态码设置: setStatus(int sc) (如200成功、404未找到);

d. Cookie操作: addCookie(Cookie cookie)

e. ⽂件下载:设置响应头 Content-Type (MIME类型)和 Content-Disposition (附件

下载)。

⽂件下载⽰例代码:

代码块

public class ResponseDemo02 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// 设置响应头:附件下载

resp.setHeader("Content-Disposition", "attachment;filename=" +

URLEncoder.encode("中⽂⽂件.txt", "UTF-8"));

// 设置MIME类型

resp.setContentType("text/plain");

// 读取⽂件并输出

InputStream in = new FileInputStream("⽂件路径");

OutputStream out = resp.getOutputStream();

byte[] buf = new byte[1024];

int len;

while ((len = in.read(buf)) != –1) {

out.write(buf, 0, len);

}

in.close();

out.close();

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19九、⾼频考点总结

1. Servlet⽣命周期:三个⽣命周期⽅法(init、service、destroy)的调⽤时机和次数;

2. Servlet与CGI的区别:多线程vs多进程、驻留内存vs临时进程;

3. HttpServlet核⼼⽅法:doGet()与doPost()的作⽤及调⽤关系;

4. ServletConfig与ServletContext的区别:作⽤范围(单个Servlet vs 全局应⽤)、配置标签;

5. GET与POST请求的区别:数据位置、安全性、字符⽀持、⽤途;

6. Response输出流:getOutputStream与getWriter的区别,中⽂乱码解决;

7. 代码题:编写基础HttpServlet(重写doGet/doPost)、获取初始化参数、⽂件下载功能。

⼗、复习建议

1. 重点掌握⽣命周期、核⼼接⼝/类的继承关系、Request/Response常⽤⽅法;

2. 熟记关键配置(web.xml中的Servlet注册、初始化参数、全局参数);

3. 结合代码⽰例理解实际应⽤场景(如表单提交处理、⽂件下载、Cookie操作);

4. 区分易混淆概念(ServletConfig vs ServletContext、GET vs POST、两种输出流)。

Ch3 Servlet⾼级

⼀、核⼼考点框架

本次期末考查重点围绕Servlet⾼级特性展开,核⼼模块包括:请求转发与重定向、过滤器

(Filter)、监听器(Listener),占⽐约70%,需重点掌握三者的定义、⽤法、⽣命周期、核⼼区别

及实战配置。

⼆、模块⼀:请求转发(RequestDispatcher)与重定向

(sendRedirect)

(⼀)核⼼定义

1. 重定向(sendRedirect):客⼾端请求服务器后,服务器返回新的URL地址,客⼾端重新发起新

请求(两次独⽴请求)。

2. 请求转发(RequestDispatcher):服务器内部将请求传递给其他资源(Servlet/JSP/HTML),

全程仅⼀次客⼾端请求,客⼾端⽆感知。

(⼆)实现⽅式

1. 重定向(sendRedirect)

直接调⽤ response ⽅法(推荐):代码块

response.sendRedirect("http://www.scut.edu.cn"); // 可跨域

间接通过 setStatus+setHeader 实现:

代码块

response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); // 302临时重定

response.setHeader("Location", "⽬标URL");

2. 请求转发(RequestDispatcher)

步骤:获取对象 → 调⽤ forward include ⽅法

代码块

// 1. 通过request获取RequestDispatcher对象(路径为服务器内部相对路径)

RequestDispatcher rd = request.getRequestDispatcher("/servlet2");

// 2. 转发请求(请求与响应对象传递给⽬标资源)

rd.forward(request, response);

// 或包含⽬标资源内容(当前响应中拼接⽬标资源输出)

rd.include(request, response);

(三)核⼼区别(⾼频考点)

对⽐维度

请求转发

(RequestDispatcher)

重定向(sendRedirect)

客⼾端请求次数

1次(服务器内部转发)

2次(客⼾端重新发起请求)

URL地址栏

显⽰初始请求URL(不改变)

显⽰⽬标URL(改变)

数据共享

可通过

request.setAttribute(

) 共享

两次请求独⽴,⽆法共享

request数据

适⽤范围

仅服务器内部资源(同Web应

⽤)

可跨域、跨Web应⽤

⽅法调⽤者

request 对象

response 对象

资源访问⽅式

服务器直接访问⽬标资源

客⼾端重新访问⽬标资源

1

1

2

1

2

3

4

5

6(四)实战场景

重定向:登录成功后跳转到主⻚(需改变URL,避免刷新重复提交)。

请求转发:登录验证失败后,转发回登录⻚并保留错误信息

request.setAttribute("error", "密码错误") )。

三、模块⼆:过滤器(Filter)

(⼀)核⼼定义

Filter是Servlet技术的拦截器,⽤于预处理请求(如权限校验、敏感词过滤)和后处理响应(如数据压

缩、字符编码设置),不直接⽣成响应,仅对请求/响应进⾏修改或拦截。

(⼆)核⼼特点

1. 拦截范围:可关联Servlet、JSP、HTML,⽀持URL模式匹配(如 /* 拦截所有请求)。

2. 串联效应:多个Filter可按配置顺序形成过滤链,依次处理请求/响应。

3. 协议⽆关:基于 ServletRequest ServletResponse ,不依赖HTTP协议。

(三)⽣命周期(⾼频考点)

1. 加载与实例化:Web容器启动时,按 web.xml filter 声明顺序实例化(每个Filter仅⼀个实

例)。

2. 初始化(init):容器调⽤ init(FilterConfig) ,读取初始化参数,仅执⾏⼀次。

代码块

public void init(FilterConfig config) throws ServletException {

String encoding = config.getInitParameter("encoding"); // 获取配置参数

}

3. 拦截处理(doFilter):客⼾端请求匹配URL时触发,核⼼⽅法(必须调⽤ FilterChain 传递

请求):

代码块

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain

chain)

throws IOException, ServletException {

// 1. 请求预处理(如设置字符编码)

req.setCharacterEncoding("UTF-8");

// 2. 传递请求到下⼀个Filter或⽬标资源(不可或缺)

chain.doFilter(req, resp);

// 3. 响应后处理(如压缩响应数据)

1

2

3

1

2

3

4

5

6

7}

4. 销毁(destroy):Web容器关闭或Web应⽤卸载时调⽤,释放资源(仅执⾏⼀次)。

(四)配置⽅式(两种任选)

1. 注解配置(Servlet 3.0+)

代码块

@WebFilter(filterName = "LogFilter", urlPatterns = "/*") // 拦截所有请求

public class LogFilter implements Filter {

// 实现initdoFilterdestroy⽅法

}

2. web.xml配置(兼容所有版本)

代码块

<!– 1. 声明Filter –>

<filter>

<filter-name>AuthorityFilter</filter-name>

<filter-class>com.mucfc.AuthorityFilter</filter-class>

<!– 可选:初始化参数 –>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<!– 2. 映射Filter(指定拦截规则) –>

<filter-mapping>

<filter-name>AuthorityFilter</filter-name>

<url-pattern>/*</url-pattern> <!– 拦截所有请求 –>

<!– 可选:指定拦截⽅式(默认REQUEST–>

<dispatcher>REQUEST</dispatcher> <!– 直接请求触发 –>

<dispatcher>FORWARD</dispatcher> <!– 转发请求触发 –>

</filter-mapping>

(五)常⻅应⽤场景

1. ⾝份验证过滤器:未登录⽤⼾拦截到登录⻚。

2. 数据压缩过滤器:压缩响应内容,提升传输效率。

3. 敏感词过滤:替换请求参数中的敏感词汇。

8

1

2

3

4

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

184. 字符编码过滤器:统⼀设置请求/响应编码为UTF-8。

(六)关键注意点

FilterChain.doFilter() 必须调⽤,否则请求会被拦截在当前Filter,⽆法到达⽬标资源。

多个Filter的执⾏顺序由 web.xml filter-mapping 的声明顺序决定(注解配置顺序不确

定)。

四、模块三:监听器(Listener)

(⼀)核⼼定义

Listener是实现特定接⼝的Java程序,⽤于监听Web应⽤中对象的状态变化(如Session创建/销毁、

属性增减),当事件触发时⾃动执⾏对应⽅法。

(⼆)分类(⾼频考点)

按监听对象分为两类,共6个核⼼接⼝:

监听类型

核⼼接⼝

监听事件

⽣命周期监听

ServletContextListener

Web应⽤启动/关闭

HttpSessionListener

Session创建/销毁

ServletRequestListener

请求初始化/销毁

属性变化监听

ServletContextAttributeList

ener

application域属性增/删/改

HttpSessionAttributeListen

er

session域属性增/删/改

ServletRequestAttributeList

ener

request域属性增/删/改

(三)⽣命周期

1. 实例化:Web容器启动时,读取 web.xml listener 配置,实例化监听器(仅⼀次)。

2. 事件触发:当监听对象发⽣对应事件时,调⽤接⼝⽅法(如 sessionCreated() )。

3. 销毁:Web容器关闭或Web应⽤卸载时,销毁监听器实例。

(四)实现步骤

1. 定义监听器类:实现对应接⼝,重写事件⽅法。代码块 // ⽰例:监听Web应⽤启动/关闭(ServletContextListener

public class ServletContextListenerImpl implements ServletContextListener {

// 应⽤启动时触发

@Override

public void contextInitialized(ServletContextEvent sce) {

System.out.println("Web应⽤启动成功!");

}

// 应⽤关闭时触发

@Override

public void contextDestroyed(ServletContextEvent sce) {

System.out.println("Web应⽤关闭!");

}

}

2. 配置监听器:

web.xml配置(推荐):

代码块

<listener>

<listener-class>com.mucfc.ServletContextListenerImpl</listener-class>

</listener>

注解配置(Servlet 3.0+): @WebListener (直接加在监听器类上)。

(五)典型实战案例

统计在线⼈数(综合考点)

需实现3个接⼝: HttpSessionListener (监听Session创建/销毁)、

ServletContextListener (初始化在线⼈数)、 ServletContextAttributeListener

(监听在线⼈数变化):

代码块

public class OnlineUserListener implements HttpSessionListener,

ServletContextListener {

private long onlineCount = 0;

// 应⽤启动时初始化在线⼈数为0

@Override

public void contextInitialized(ServletContextEvent sce) {

sce.getServletContext().setAttribute("onlineCount", 0);

}

// Session创建(⽤⼾上线),⼈数+1

@Override

1

2

3

4

5

6

7

8

9

10

11

12

13

1

2

3

1

2

3

4

5

6

7

8

9public void sessionCreated(HttpSessionEvent se) {

ServletContext context = se.getSession().getServletContext();

onlineCount = (Long) context.getAttribute("onlineCount") + 1;

context.setAttribute("onlineCount", onlineCount);

}

// Session销毁(⽤⼾下线),⼈数-1

@Override

public void sessionDestroyed(HttpSessionEvent se) {

// 逻辑类似,⼈数减1

}

}

JSP⻚⾯展⽰:

代码块

在线⼈数:<h1><%= request.getServletContext().getAttribute("onlineCount") %>

</h1>

五、⾼频考点与易错点总结

(⼀)必背考点

1. 请求转发与重定向的5个核⼼区别(URL、请求次数、数据共享等)。

2. Filter的⽣命周期(init→doFilter→destroy)及 FilterChain 的作⽤。

3. Listener的分类(6个接⼝)及典型应⽤(在线⼈数统计)。

4. 三种技术的配置⽅式(注解+web.xml)。

(⼆)易错点

1. 混淆 RequestDispatcher forward include

forward :⽬标资源替代当前资源输出,当前资源后续代码不执⾏。

include :⽬标资源输出拼接在当前资源之后,当前资源后续代码仍执⾏。

2. 重定向时使⽤ request.setAttribute() 传递数据(错误,两次请求独⽴,需⽤Session或数

据库)。

3. Filter中忘记调⽤ chain.doFilter() (请求被拦截,⽆法到达⽬标资源)。

4. Listener未配置 web.xml 或注解(监听器⽆法⽣效)。

六、复习建议

1. 优先掌握“区别类”考点(转发vs重定向),可通过画图梳理流程。

10

11

12

13

14

15

16

17

18

19

20

12. 动⼿实现3个实战案例:登录验证Filter、在线⼈数统计Listener、转发/重定向对⽐Demo。

3. 熟记核⼼API(如 request.getRequestDispatcher() Filter.doFilter()

ServletContextListener )。

4. 注意配置⽂件语法( web.xml filter-mapping listener 的节点顺序)。

祝各位同学考试顺利!如有疑问可通过课程QQ群交流。

Ch4 Cookie与Session

⼀、核⼼概念梳理

1. 会话(Session)与会话跟踪

会话定义:⽤⼾打开浏览器→访问服务器多个资源→关闭浏览器的整个过程,称为⼀次会话(如登

录⽹站→浏览商品→退出浏览器)。

HTTP协议特点:HTTP是“⽆状态”协议,不保存连接交互信息,⼀次响应后连接断开,服务器⽆

法识别后续请求是否来⾃同⼀⽤⼾。

会话跟踪技术(解决HTTP⽆状态问题):

a. URL重写:URL结尾附加会话ID(如 index.jsp;jsessionid=xxx )。

b. 隐藏表单域:会话ID埋⼊HTML隐藏域,不显⽰在⻚⾯。

c. Cookie:服务器发送给浏览器的纯⽂本信息,客⼾端存储并随后续请求带回。

d. Session(Java领域特有):服务器为每个⽤⼾创建内存级会话对象,通过SessionID关联客⼾

端。

⼆、Cookie技术详解

1. 定义与核⼼特点

定义:服务器发送给浏览器的体积很⼩的纯⽂本信息,客⼾端下次访问同⼀服务器时⾃动附带,⽤

于标识⽤⼾、记录状态。

核⼼特点:

存储位置:客⼾端(浏览器/硬盘)。

数据类型:仅⽀持⾮中⽂字符串。

数量限制:浏览器最多存300个,每个站点最多20个。

⼤⼩限制:单个Cookie≤4KB。

2. ⼯作原理1. 第⼀次请求:客⼾端→服务器,服务器创建Cookie对象(存储会话数据,如⽤⼾ID)→发送给客⼾

端。

2. 客⼾端存储Cookie(内存/硬盘,取决于有效时间)。

3. 后续请求:客⼾端⾃动将该服务器的Cookie附带在请求中→服务器读取Cookie,识别⽤⼾。

3. 核⼼⽅法(Servlet环境)

操作

关键代码

创建Cookie

Cookie cookie = new Cookie("name", "value"); (name/value均为⾮

中⽂)

设置有效路径

cookie.setPath("/"); (仅访问该路径时,浏览器才发送Cookie)

设置有效时间

cookie.setMaxAge(int expiry)

正整数:存硬盘,单位秒(如3600=1⼩时)

负整数:存内存,浏览器关闭即消失<br>- 0:删除同名Cookie

发送给客⼾端

response.addCookie(cookie);

读取Cookie

Cookie[] cookies = request.getCookies(); (遍历数组查找⽬标

Cookie)

修改Cookie

新建同名、同路径的Cookie,重新设置value并发送(覆盖原Cookie)

删除Cookie

新建同名、同路径的Cookie, setMaxAge(0) ,并发送给客⼾端

4. 典型实例:记录上次访问时间

代码块

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=utf-8");

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String currentTime = sdf.format(new Date());

Cookie[] cookies = request.getCookies();

if (cookies == null) { // ⾸次访问

Cookie cookie = new Cookie("lastTime", currentTime);

cookie.setMaxAge(30*24*60*60); // 保存30

response.addCookie(cookie);

response.getWriter().write("⾸次访问,当前时间:" + currentTime);

} else { // ⾮⾸次访问

for (Cookie cookie : cookies) {

1

2

3

4

5

6

7

8

9

10

11

12

13if ("lastTime".equals(cookie.getName())) {

String lastTime = cookie.getValue();

response.getWriter().write("上次访问时间:" + lastTime + ",当前时

间:" + currentTime);

cookie.setValue(currentTime); // 更新时间

cookie.setMaxAge(30*24*60*60);

response.addCookie(cookie);

break;

}

}

}

}

5. 注意细节

Cookie由服务器创建,客⼾端仅被动存储和传递。

默认情况下(未设置 setMaxAge ),Cookie为会话级(存内存,关闭浏览器丢失)。

⼀个Cookie仅标识⼀种信息(name-value键值对)。

三、Session技术详解

1. 定义与核⼼特点

定义:服务器为每个会话创建的内存级对象,⽤于存储⽤⼾会话数据,是客⼾端与服务器间保持状

态的核⼼⽅案。

核⼼特点:

存储位置:服务器端(内存)。

数据类型:⽀持任意Java对象(字符串、集合、⾃定义对象等),可存中⽂。

⼤⼩限制:⽆4KB限制,取决于服务器内存。

依赖关系:依赖Cookie传递SessionID(Cookie禁⽤则需URL重写)。

2. ⼯作原理

1. 第⼀次请求:客⼾端→服务器,服务器创建Session对象(⽣成唯⼀SessionID)→创建Cookie

(name=JSESSIONID,value=SessionID)→发送给客⼾端。

2. 客⼾端存储该Cookie(默认会话级)。

3. 后续请求:客⼾端附带JSESSIONID Cookie→服务器通过SessionID找到对应的Session对象→读

取/修改会话数据。

3. 核⼼接⼝与⽅法(Servlet环境)

14

15

16

17

18

19

20

21

22

23

24

获取Session对象:

HttpSession session = request.getSession(); :⽆Session则创建。

HttpSession session = request.getSession(false); :⽆Session则返回

null。

数据操作:

存数据: session.setAttribute("key", 对象);

取数据: Object obj = session.getAttribute("key");

删数据: session.removeAttribute("key");

⽣命周期控制:

⼿动销毁: session.invalidate(); (如退出登录)。

超时销毁:默认30分钟(Tomcat配置),可通过 web.xml 修改:

代码块

<session-config>

<session-timeout>60</session-timeout> <!– 单位:分钟 –>

</session-config>

4. 典型实例

(1)Session跟踪(访问统计)

代码块

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

PrintWriter out = response.getWriter();

HttpSession session = request.getSession(true); // ⽆则创建

// 统计访问次数

Integer visitCount = (Integer) session.getAttribute("visitCount");

if (visitCount == null) {

visitCount = 0;

}

visitCount++;

session.setAttribute("visitCount", visitCount);

// 输出Session信息

out.println("Session ID" + session.getId() + "<br>");

out.println("创建时间:" + new SimpleDateFormat("yyyy-MM-dd

HH:mm:ss").format(new Date(session.getCreationTime())) + "<br>");

1

2

3

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16out.println("访问次数:" + visitCount);

}

(2)验证码验证(核⼼场景)

⽣成验证码: CreateCode Servlet⽣成验证码字符串,存⼊Session。

校验逻辑:

代码块

// 客⼾端输⼊的验证码

String inputCode = request.getParameter("checkcode");

// 服务器Session中存储的正确验证码

String correctCode = (String)

request.getSession().getAttribute("checkcode");

if (inputCode.toLowerCase().equals(correctCode)) {

// 验证码正确,继续验证账号密码

} else {

request.setAttribute("error", "验证码错误");

request.getRequestDispatcher("/Login").forward(request, response);

}

(3)简易购物⻋(核⼼场景)

核⼼逻辑:⽤Session存储购物⻋数据( HashMap<BookID, Book> ),实现“添加商品→查

看购物⻋”。

5. Cookie禁⽤时的Session解决⽅案:URL重写

作⽤:Cookie禁⽤后,客⼾端⽆法传递SessionID,通过URL附加SessionID维持Session。

实现⽅式:

a. ⼿动追加: href='index.jsp;jsessionid=<%=session.getId() %>'

b. ⾃动编码(推荐): href='<%=response.encodeURL("index.jsp") %>' (⾃动判

断Cookie是否禁⽤,禁⽤则追加SessionID)

四、Cookie与Session的核⼼区别与联系

1. 核⼼区别

对⽐维度

Cookie

Session

存储位置

客⼾端(浏览器/硬盘)

服务器端(内存)

17

18

1

2

3

4

5

6

7

8

9

10

11数据类型

仅⾮中⽂字符串

任意Java对象(⽀持中⽂)

⼤⼩限制

单个≤4KB,数量有限制

⽆⼤⼩限制,取决于服务器内

安全性

较低(客⼾端可修改/删除)

较⾼(数据存储在服务器)

⽣命周期

可设置(内存级/硬盘级)

会话级(默认30分钟超时)

依赖关系

独⽴存在

依赖Cookie传递SessionID

(或URL重写)

2. 联系

Session依赖Cookie实现:服务器通过Cookie将SessionID发送给客⼾端,客⼾端后续请求通过

Cookie带回SessionID,服务器才能找到对应的Session对象。

Cookie禁⽤时,Session可通过URL重写维持功能。

五、考试重点考点

1. 选择题/填空题⾼频考点

HTTP协议的“⽆状态”特性(会话跟踪技术的核⼼⽬的)。

Cookie的数量/⼤⼩限制(300个/站点20个/单个4KB)。

Session默认超时时间(30分钟)及配置⽅式。

Cookie有效时间的三种参数含义(正整数/负整数/0)。

Session依赖Cookie传递的关键标识(SessionID/JSESSIONID)。

2. 简答题⾼频考点

简述Cookie的⼯作原理。

简述Session的⼯作原理及⽣命周期。

对⽐Cookie与Session的核⼼区别。

当Cookie禁⽤时,如何保证Session正常⼯作?(URL重写)。

3. 编程题⾼频考点

使⽤Cookie实现“记住⽤⼾名”或“上次访问时间”功能。

使⽤Session实现验证码验证、简易购物⻋、⽤⼾登录状态维持。

Cookie的创建、读取、修改、删除操作。

Session的属性操作(setAttribute/getAttribute)及⼿动销毁(invalidate)。六、易错点提醒

1. Cookie的name和value不能直接存储中⽂(需编码解码,考试默认不考中⽂处理)。

2. Session的 getSession() getSession(false) 的区别(前者⽆则创建,后者⽆则返回

null)。

3. 删除Cookie必须保证“同名、同路径”,否则⽆法删除。

4. Session的超时时间是“两次请求的间隔时间”,⽽⾮会话总时⻓。

5. 关闭浏览器不会直接销毁Session,仅销毁客⼾端存储的SessionID Cookie,服务器端Session仍会

超时后销毁。

Ch5 JSP基础

⼀、JSP核⼼概念

1. 定义与本质

全称:Java Server Pages,动态⽹⻚开发技术

本质:⼀种Java Servlet,专注于Java Web应⽤的⽤⼾界⾯层

核⼼特性:在HTML/XHTML/XML中嵌⼊Java代码,通过JSP标签( <% 代码 %> )实现动态内容

⽣成

核⼼功能:处理⽤⼾表单输⼊、访问数据库/数据源、动态创建⽹⻚

2. JSP的优势(⾼频考点)

对⽐对象

核⼼优势

CGI程序

性能更优(直接嵌⼊动态元

素,⽆需单独引⽤CGI⽂

件)、编译后执⾏(⽆需重复

载⼊解释器)

ASP

动态部分⽤Java编写(跨平

台、功能更强)、可移植到⾮

MS平台

纯Servlet

⽆需⼤量 println 语句,便

于编写/修改HTML界⾯

SSI

⽀持表单数据处理、数据库连

JavaScript可与服务器交互,⽀持复杂服

务(数据库访问、图像处理

等)

静态HTML

包含动态信息,可实时响应数

据变化

额外特性:属于Java EE核⼼组件,⽀持JDBC、JNDI、EJB等企业级API,可与业务逻辑Servlet协

同⼯作

⼆、JSP⼯作原理与⽣命周期

1. 运⾏环境

依赖JSP引擎(容器) :与Web服务器协同,提供运⾏环境,识别JSP特殊元素

核⼼流程(4步):

a. 浏览器发送HTTP请求到Web服务器

b. 服务器识别JSP请求,传递给JSP引擎,将JSP⽂件转为Servlet(模板⽂本→ println()

JSP元素→Java代码)

c. 编译Servlet为可执⾏类,Servlet引擎执⾏该类,⽣成HTML格式响应

d. 服务器以静态HTML形式返回响应,浏览器解析展⽰

2. JSP⽣命周期(必考知识点)

(1)四个阶段

阶段

核⼼操作

关键⽅法

编译阶段

解析JSP⽂件→转为Servlet→

编译Servlet(仅⾸次请求或

⽂件修改后执⾏)

初始化阶段

容器载⼊JSP后,服务请求前

执⾏,仅执⾏1次

jspInit() (可重写,⽤于

初始化数据库连接、打开⽂件

等)

执⾏阶段

处理每个⽤⼾请求,是⽣命周

期中与请求相关的核⼼阶段

_jspService(HttpServle

tRequest request,

HttpServletResponse

response) (⾃动⽣成,不

可重写,⽀持GET/POST等7

种HTTP⽅法)销毁阶段

JSP从容器中移除时执⾏,仅

执⾏1次

jspDestroy() (可重写,

⽤于释放数据库连接、关闭⽂

件等)

(2)⽣命周期实例关键代码(理解记忆)

代码块

<%!

// 成员变量(共享于所有⽤⼾线程)

private int initVar=0;

private int serviceVar=0;

private int destroyVar=0;

// 初始化⽅法

public void jspInit(){ initVar++; System.out.println("JSP初始化"+initVar+"");

}

// 销毁⽅法

public void jspDestroy(){ destroyVar++; System.out.println("JSP

"+destroyVar+""); }

%>

<%

// 服务⽅法中执⾏(每次请求+1

serviceVar++;

System.out.println("响应请求"+serviceVar+"");

%>

三、JSP基本语法

1. ⻚⾯组成

元素:JSP定义的核⼼内容(指令、脚本、动作、表达式语⾔),容器会转为Java代码

模板数据:HTML/XHTML等⾮JSP元素,容器不处理,直接返回客⼾端

2. 脚本元素(编程题⾼频考点)

(1)分类与语法

类型

语法格式

核⼼⽤途

注意事项

声明(Declarations)

<%! 声明; [

;]… %>

<jsp:declaration>

声明⻚⾯成员变量、⽅

法、内部类

变量为共享变量(多⽤⼾

线程共享),⽅法为

Servlet类⽅法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16表达式(Expressions)

<%= 表达式 %> (⽆空

格、⽆分号)

计算表达式并插⼊输出

流,返回客⼾端

表达式结果⾃动转为字符

脚本⼩程序

(Scriptlets)

<% Java代码 %>

<jsp:scriptlet>

嵌⼊执⾏逻辑(条件判

断、循环等)

代码插⼊

_jspService() ⽅法,

变量为局部变量

(2)⽰例

声明变量/⽅法:

代码块

<%! int a=0; // 成员变量 %>

<%! public String checkAnswer(boolean flag){ return flag?"正确":"错误"; } //

⽅法 %>

表达式:

代码块

<p>今天是:<%=(new java.util.Date()).toLocaleString()%></p>

3. 注释

JSP注释(容器忽略,不返回客⼾端): <%– 注释内容 –%>

注意:区别于HTML注释( <!– 注释 –> ,会返回客⼾端,可在⻚⾯源码中看到)

4. 指令元素(3种核⼼指令)

(1)语法格式

<%@ 指令名 属性名1="1" 属性名2="2"… %> <%@ ⽆空格)或XML格式(如

<jsp:directive.page>

(2)分类与⽤途

指令名

核⼼功能

关键属性

⽰例

page

配置当前⻚⾯(容器使⽤

说明)

language(语⾔)、

contentType(内容类

型)、pageEncoding

(编码)、import(导⼊

<%@ page

language="java"

contentType="text/h

tml; charset=UTF-

8"

1

2

1类)、session(是否⽀

持会话)

import="java.util.*

" %>

include

编译阶段合并外部⽂件

(JSP/HTML/⽂本)

file(相对URL路径)

<%@ include

file="header.html"

%>

taglib

引⼊⾃定义标签库

uri(标签库路径)、

prefix(标签前缀)

<%@ taglib

uri="http://java.su

n.com/jsp/jstl/core

" prefix="c" %>

5. 动作元素(核⼼动作)

(1)通⽤属性

id :唯⼀标识,可通过 PageContext 调⽤

scope :⽣命周期(page/request/session/application)

(2)常⽤动作及⽤途

动作元素

核⼼功能

关键属性

⽰例

<jsp:include>

运⾏时包含静态/动态⽂

page(⽬标⽂件URL)、

flush(是否刷新缓冲区)

<jsp:include

page="date.jsp"

flush="true" />

<jsp:useBean>

装载JavaBean组件

id(Bean标识)、class

(Bean全类名)

<jsp:useBean

id="test"

class="action.TestB

ean" />

<jsp:setProperty>

设置Bean属性

name(Bean标识)、

property(属性名)、

value(属性值)

<jsp:setProperty

name="test"

property="message"

value="Hello" />

<jsp:getProperty>

获取Bean属性并输出

name(Bean标识)、

property(属性名)

<jsp:getProperty

name="test"

property="message"

/>

<jsp:forward>

转发请求到另⼀个⻚⾯

page(⽬标URL)

<jsp:forward

page="login.jsp" />

<jsp:text>

嵌⼊⽂本模板(⽀持EL表

达式)

<jsp:text><!

[CDATA[<!DOCTYPE

html>]]></jsp:text>

四、JSP隐含对象(必考重点)

1. 核⼼特性

容器⾃动创建,开发者可直接使⽤(⽆需显式声明),共9个

核⼼对象及⽤法:

对象名

类型

核⼼⽤途

常⽤⽅法

request

HttpServletRequest

接收客⼾端请求数据(表

单、URL参数、HTTP

头)

getParameter()、

getParameterValues()、

getHeader()、

getHeaderNames()

response

HttpServletResponse

向客⼾端发送响应(设置

HTTP头、Cookie、状态

码)

setIntHeader()、

setRefreshHeader()、

addCookie()

out

JspWriter

输出内容到响应流

print()、println()、

flush()

session

HttpSession

跟踪⽤⼾会话(存储跨请

求数据)

getCreationTime()、

getLastAccessedTime()

、setAttribute()、

getAttribute()、

invalidate()

application

ServletContext

共享应⽤级数据(所有⽤

⼾可⻅)

setAttribute()、

getAttribute()、

getRealPath()

config

ServletConfig

访问Servlet/JSP初始化

参数

getServletName()、

getInitParameter()

pageContext

PageContext

访问⻚⾯所有对象

(request/response/ses

sion等),管理属性作⽤

setAttribute()、

getAttribute()、

removeAttribute()

page

Object(当前JSP⻚⾯实

例)

代表当前JSP⻚⾯(等价

于this)

exception

Throwable

处理⻚⾯异常(需page指

令指定errorPage)

getMessage()、

printStackTrace()

五、表单处理与数据交互

1. 数据提交⽅式(GET vs POST)

特性

GET⽅法

POST⽅法

数据传输

拼接在URL后( ?

key1=value1&key2=value

2

隐式传输(请求体中)

安全性

低(数据可⻅),不适合敏感

信息(密码)

⾼(数据不可⻅),适合敏感

信息

数据⼤⼩限制

最⼤1024字节

⽆限制(取决于服务器配置)

核⼼⽤途

简单查询、⾮敏感数据提交

表单提交、⽂件上传、敏感数

据传输

2. 表单数据获取⽅法

⽅法名

⽤途

⽰例

getParameter(String name)

获取单个值参数(⽂本框、单

选框)

String name =

request.getParameter("

username");

getParameterValues(String

name)

获取多值参数(复选框、下拉

多选)

String[] hobbies =

request.getParameterVa

lues("hobby");

getParameterNames()

获取所有参数名(遍历表单所

有字段)

Enumeration<String>

params =

request.getParameterNa

mes();

getInputStream()

读取客⼾端⼆进制数据流(⽂

件上传)

3. ⽰例:复选框数据处理

前端表单(CheckBox.htm):代码块

<form action="main.jsp" method="POST">

<input type="checkbox" name="subject" value="maths" checked> 数学

<input type="checkbox" name="subject" value="physics"> 物理

<input type="submit" value="提交">

</form>

后端处理(main.jsp):

代码块

<% String[] subjects = request.getParameterValues("subject"); %>

<p>选中的科⽬:<% for(String s : subjects) out.print(s+" "); %></p>

六、Session会话跟踪

1. 核⼼概念

⽤于识别同⼀⽤⼾的多次请求,存储⽤⼾专属数据(如登录状态、购物⻋)

默认⽀持会话跟踪,可通过page指令关闭: <%@ page session="false" %>

2. 核⼼⽅法

数据操作: session.setAttribute(String key, Object value)

session.getAttribute(String key)

会话管理: session.isNew() (判断是否新会话)、 session.invalidate() (销毁会

话有 )效期设置: session.setMaxInactiveInterval(int seconds) (秒),或在

web.xml中配置:

代码块

<session-config>

<session-timeout>15</session-timeout> <!– 15分钟 –>

</session-config>

3. 应⽤⽰例:访问次数统计

代码块

<%

Date createTime = new Date(session.getCreationTime());

Date lastAccessTime = new Date(session.getLastAccessedTime());

1

2

3

4

5

1

2

1

2

3

1

2

3Integer visitCount = (Integer)session.getAttribute("visitCount");

if(visitCount == null) visitCount = 0;

visitCount++;

session.setAttribute("visitCount", visitCount);

%>

<p>会话ID<%=session.getId()%></p>

<p>⾸次访问时间:<%=createTime%></p>

<p>累计访问次数:<%=visitCount%></p>

七、⾼频考点总结

1. 概念类:JSP本质、优势(与其他技术对⽐)、⽣命周期四阶段

2. 语法类:脚本元素(声明/表达式/脚本⼩程序)、指令(page/include/taglib)、核⼼动作元素

3. 对象类:9个隐含对象的类型、⽤途、常⽤⽅法(request/response/session/out重点)

4. 应⽤类:表单处理(GET/POST区别、参数获取)、Session会话管理、JavaBean组件调⽤

5. 编程题:动态⽣成⻚⾯内容、表单数据处理、Session数据存储与展⽰、JSP与JavaBean结合

⼋、复习建议

1. 重点掌握⽣命周期、隐含对象、表单处理、Session四⼤模块,占考试分值60%以上

2. 结合实例代码理解语法(如⽣命周期实例、表单处理实例),避免死记硬背

3. 区分易混淆知识点(如JSP注释vs HTML注释、GET vs POST、page指令vs include指令)

4. 练习编程题:动态显⽰时间、表单数据提交与验证、会话访问次数统计、JavaBean属性操作

Ch6 JavaBean & EL & JSTL

⼀、JavaBean 核⼼知识点

(⼀)定义与核⼼作⽤

JavaBean 是遵循 JavaBeans API 规范 的 Java 类,核⼼作⽤是封装数据和功能,实现“⼀次编写,

到处运⾏”,便于数据移植和复⽤。

(⼆)必背规范(考试⾼频考点)

1. 提供 public 修饰的⽆参构造⽅法(⽤于实例化对象);

2. 实现 java.io.Serializable 接⼝(⽤于保存对象状态,序列化);

3. 包含可读写、只读或只写的属性(⽀持任意合法 Java 数据类型,含⾃定义类);

4. 提供对应属性的 getter/setter ⽅法(读取/设置属性值):

4

5

6

7

8

9

10

11

只读属性:仅提供 getPropertyName()

只写属性:仅提供 setPropertyName()

(三)JSP 中访问 JavaBean

1. 声明 JavaBean: <jsp:useBean> 标签

语法:

代码块

<jsp:useBean id="beanId" scope="作⽤域" class="全类名"/>

id :Bean 实例名称(唯⼀,不可重复);

scope :作⽤域(可选值: page (默认)、 request session application );

⽰例: <%@ page import="java.util.Date" %><jsp:useBean id="date"

class="java.util.Date" />

2. 操作属性: <jsp:getProperty> <jsp:setProperty>

语法(嵌套在 <jsp:useBean> 主体中):

代码块

<jsp:useBean id="beanId" class="全类名">

<jsp:setProperty name="beanId" property="属性名" value=""/> <!– 调⽤

setter –>

<jsp:getProperty name="beanId" property="属性名"/> <!– 调⽤getter –>

</jsp:useBean>

name 必须与 <jsp:useBean> id ⼀致;

⽰例:访问 StudentsBean 的属性(⽂档核⼼⽰例,需掌握)。

(四)典型⽰例代码(需能默写核⼼结构)

代码块

public class StudentsBean implements java.io.Serializable {

private String firstName;

private int age;

// ⽆参构造(必写)

public StudentsBean() {}

1

1

2

3

4

1

2

3

4

5

6

7// getter ⽅法

public String getFirstName() { return firstName; }

public int getAge() { return age; }

// setter ⽅法

public void setFirstName(String firstName) { this.firstName = firstName; }

public void setAge(Integer age) { this.age = age; }

}

⼆、EL 表达式(Expression Language)

(⼀)核⼼作⽤与特点

1. 替换 JSP 脚本表达式 <%= %> ,简化数据访问(JavaBean、数组、集合、请求参数等);

2. ⾃动类型转换(⽆需⼿动强制转换,如 request 域中 Object 类型数据);

3. ⽀持算术、逻辑、关系操作符,⽀持隐式对象直接访问。

(⼆)基础语法

表达式格式: ${表达式内容}

停⽤ EL:在 JSP 头部添加 <%@ page isELIgnored="true" %> (默认 false ,计算表

达式)。

(三)核⼼操作符(⾼频考点)

操作符

⽤途

关键区别/注意事项

.

访问 JavaBean 属性、集合元

属性名⽆特殊字符时使⽤

[]

访问特殊字符属性(如

user-agent )、动态取值

例: ${header["user

agent"]}

${map[key]}

算术/逻辑操作符:⽀持 +*/%&&||!==!= 等(与 Java ⼀致);

括号优先级: ${(1+2)*3} 结果为 9(需掌握运算优先级)。

(四)EL 隐含对象(需熟记⽤途)

隐含对象

⽤途

⽰例

8

9

10

11

12

13

14

15pageContext

访问 JSP 内置对象(如

request、session)

${pageContext.request.

queryString}

pageScope/requestScope

/sessionScope/applicat

ionScope

显式访问指定作⽤域的变量

${applicationScope.bo

x} (访问 application 域的

box 变量)

param

访问单个请求参数(对应

request.getParameter(

)

${param.username} (获

取 username 参数)

paramValues

访问多个同名请求参数(返回

字符串数组)

${paramValues.hobby[0

]} (获取第⼀个 hobby 参

数)

header

访问单个请求头(对应

request.getHeader()

${header["user

agent"]}

headerValues

访问多个同名请求头(返回字

符串数组)

${headerValues.accept

[1]}

(五)EL 函数

语法: ${ns:func(参数1, 参数2,…)} ns 为命名空间, func 为函数名);

常⽤⽰例: fn:length (获取字符串/集合⻓度):

代码块

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

${fn:length("Hello EL")} <!– 结果为 6 –>

注意:使⽤前需通过 <taglib> 引⼊对应标签库。

三、JSTL 标签库(JavaServer Pages Standard Tag Library)

(⼀)核⼼概念与安装

1. 定义:JSP 标准标签集合,封装通⽤核⼼功能(迭代、条件判断、格式化、XML 操作等);

2. 安装步骤(需掌握):

下载 jakarta-taglibs-standard 包,解压后将 standard.jar jstl.jar

⻉到 WEB-INF/lib 下;

每个 JSP ⽂件头部需通过 <taglib> 引⼊对应标签库(核⼼标签库为必考)。

(⼆)核⼼标签库(前缀 c ,必考重点)

1

2引⼊语法:

代码块

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

1. 表达式控制标签

标签

⽤途

核⼼语法

<c:out>

输出数据(替换 <%=

%> ),⽀持默认值

<c:out value="数据"

default="默认值"

escapeXml="true"/>

escapeXml 控制是否转

义特殊字符)

<c:set>

存储变量到指定作⽤域或

JavaBean 属性

① 存变量: <c:set

var="name" value=""

scope="page"/> ;② 存

JavaBean: <c:set

target="beanId"

property="属性名"

value=""/>

<c:remove>

移除指定作⽤域的变量

<c:remove var="变量

" scope="page"/>

scope 可选)

<c:catch>

捕获⻚⾯异常

<c:catch var="ex">可能

出错的代码</c:catch>

var 存储异常信息)

2. 流程控制标签(考试代码题⾼频)

<c:if> :单条件判断(类似 Java 的 if):

代码块

<c:if test="${param.age > 18}" var="isAdult" scope="request">

成年⼈

</c:if>

test :条件(必须⽤ EL 表达式); var 存储判断结果(true/false)。

<c:choose><c:when><c:otherwise> :多条件判断(类似 Java 的 if-else if-else):

1

1

2

3

多条件判断(类似

代码块

<c:choose>

<c:when test="${score >= 90}">优秀</c:when>

<c:when test="${score >= 60}">及格</c:when>

<c:otherwise>不及格</c:otherwise>

</c:choose>

注意: <c:choose> 是⽗标签, <c:otherwise> 只能出现⼀次。

3. 循环标签

标签

⽤途

核⼼属性与语法

<c:forEach>

遍历集合(List、Map)或数

<c:forEach var="item"

items="${list}"

begin="0" end="4"

step="1"

varStatus="status">${i

tem}</c:forEach>

属性说明: var (当前元素

变量)、 items (待遍历集

合)、 begin (起始索

引)、 end (结束索引)、

step (步⻓)、

varStatus (状态对象,

index (索引)、

count (计数)等)

<c:forTokens>

按分隔符截取字符串

<c:forTokens

items="a,b,c"

delims=","

var="str">${str}

</c:forTokens>

delims 为分隔符)

4. URL 操作标签

标签

⽤途

核⼼语法

<c:import>

包含外部资源(⽀持跨 web

应⽤、⽹络资源)

<c:import

url="http://localhost:

8080/books.xml"

1

2

3

4

5var="bookInfo"/> (区别

<jsp:include> :仅能

包含本应⽤资源)

<c:redirect>

重定向⻚⾯(⽀持带参数)

<c:redirect

url="login.jsp">

<c:param name="msg"

value="error"/>

</c:redirect>

<c:url>

动态⽣成 URL(⽀持存储到

作⽤域)

<c:url

value="user.jsp"

var="userUrl"

scope="request">

<c:param name="id"

value="1"/></c:url>

(三)格式化标签库(前缀 fmt ,重点考查⽇期/数字格式化)

引⼊语法:

代码块

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

核⼼标签:

1. <fmt:formatNumber> :格式化数字、货币、百分⽐:

代码块

<fmt:formatNumber value="1234.56" type="currency" currencyCode="CNY"/> <!–

格式化为⼈⺠币 –>

2. <fmt:formatDate> :格式化⽇期/时间:

代码块

<fmt:formatDate value="${new java.util.Date()}" pattern="yyyy-MM-dd

HH:mm:ss"/> <!– 格式化为 20241225 14:30:00 –>

3. <fmt:parseNumber> / <fmt:parseDate> :将格式化字符串解析为数字/⽇期对象(需掌握

语法结构)。

1

1

1(四)XML 标签库(前缀 x

1. 引⼊语法:

代码块

<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

2. 依赖包:需将 XercesImpl.jar xalan.jar 拷⻉到 WEB-INF/lib 下;

3. 核⼼标签:

<x:parse> :解析 XML 数据(如从⽂件或变量读取);

<x:transform> :使⽤ XSLT 样式表格式化 XML(需掌握⽰例代码结构)。

(五)SQL 标签库(前缀 sql

引⼊语法: <%@ taglib prefix="sql"

uri="http://java.sun.com/jsp/jstl/sql" %>

作⽤:简化 JSP 与关系型数据库(Oracle、MySQL、SQL Server)的交互(需了解核⼼⽤途,掌

握标签库引⼊语法)。

四、JSP 处理 XML 数据

(⼀)发送 XML 内容

核⼼:设置⻚⾯ contentType 为 text/xml

代码块

<%@ page contentType="text/xml" %>

<books>

<book><name>Padam History</name></book>

</books>

(⼆)解析 XML 数据( <x:parse>

代码块

<c:import var="bookXml" url="http://localhost:8080/books.xml"/>

<x:parse xml="${bookXml}" var="xmlObj"/>

<x:out select="$xmlObj/books/book[1]/name"/> <!– 输出第⼀本书的名称 –>

1

1

2

3

4

1

2

3(三)格式化 XML( <x:transform>

需结合 XSLT 样式表:

代码块

<c:set var="xmlData"><books>…</books></c:set>

<c:import var="xsltStyle" url="style.xsl"/>

<x:transform xml="${xmlData}" xslt="${xsltStyle}"/> <!– XSLT 格式输出 –>

五、⾃定义标签(必考流程)

(⼀)核⼼步骤(需默写完整流程)

1. 创建标签处理类:继承 SimpleTagSupport ,重写 doTag() ⽅法:

代码块

import javax.servlet.jsp.tagext.SimpleTagSupport;

import javax.servlet.jsp.JspException;

import java.io.IOException;

public class HelloTag extends SimpleTagSupport {

private String message; // ⾃定义属性

// 属性的 setter ⽅法(必须与属性名⼀致)

public void setMessage(String message) { this.message = message; }

@Override

public void doTag() throws JspException, IOException {

getJspContext().getOut().println(message); // 输出内容

}

}

2. 创建 TLD(标签库描述⽂件):放在 WEB-INF ⽬录下(如 custom.tld ):

代码块

<taglib>

<<tlib-version>1.0</</tlib-version>

<jsp-version>2.0</jsp-version>

<short-name>ex</short-name> <!– 标签前缀 –>

<tag>

<name>Hello</name> <!– 标签名 –>

1

2

3

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

1

2

3

4

5

6<tag-class>com.tutorialspoint.HelloTag</tag-class> <!– 处理类全类名

->

<body-content>scriptless</body-content> <!– 标签体类型

empty/scriptless–>

<attribute> <!– ⾃定义属性配置 –>

<name>message</name> <!– 属性名 –>

<required>true</required> <!– 是否必填 –>

</attribute>

</tag>

</taglib>

3. 在 JSP 中使⽤⾃定义标签:

代码块

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld" %>

<ex:Hello message="Hello Custom Tag!"/> <!– 输出结果 –>

(⼆)标签体访问

若标签体需传⼊内容( body-content="scriptless" ),修改 doTag()

代码块

StringWriter sw = new StringWriter();

getJspBody().invoke(sw); // 读取标签体内容

getJspContext().getOut().println(sw.toString());

六、考试重点提⽰与题型预测

(⼀)选择题/填空题⾼频考点

1. JavaBean 的 4 个核⼼规范;

2. EL 操作符 . [] 的区别;

3. JSTL 核⼼标签的⽤途(如 <c:forEach> 遍历、 <c:choose> 多条件判断);

4. EL 隐含对象的对应功能(如 param 访问请求参数);

5. ⾃定义标签的 TLD ⽂件配置(如 <tag-class> <attribute> 标签)。

(⼆)简答题必考

1. 简述 JavaBean 的定义及核⼼规范;

2. 简述 EL 表达式的作⽤与特点;

7

8

9

10

11

12

13

14

1

2

1

2

33. 简述⾃定义标签的创建流程;

4. 对⽐ <jsp:include> <c:import> 的区别。

(三)代码题必考

1. 编写 JavaBean 类,并在 JSP 中使⽤ <jsp:useBean> / <jsp:getProperty> 访问其属性;

2. 使⽤ JSTL 标签实现循环遍历集合、多条件判断;

3. 使⽤ EL 表达式获取请求参数、请求头或 JavaBean 属性;

4. 编写简单的⾃定义标签(含属性)并使⽤。

七、复习建议

1. 重点背诵核⼼语法(如标签语法、EL 表达式格式、⾃定义标签流程);

2. 熟练掌握⽰例代码(如 JavaBean ⽰例、JSTL 循环/条件判断⽰例);

3. 区分易混淆知识点(如 EL 隐含对象、JSTL 标签⽤途、操作符差异);

4. 结合实操题练习(如编写 JSP ⻚⾯实现数据展⽰、格式化、⾃定义标签)。

Ch7 JDBC与JSP数据库操作

⼀、核⼼概念与架构

1. JDBC定义与作⽤

全称:Java Data Base Connectivity(Java数据库连接)

本质:⽤于执⾏SQL语句的标准Java API,由接⼝和类组成,实现Java程序与关系型数据库的数据

库⽆关连接(同⼀代码可适配不同数据库,仅需修改驱动和URL)。

与ODBC的关系:功能⼀致,均⽀持数据库⽆关代码,但JDBC是Java专属API。

2. 驱动的重要性

驱动是接⼝的实现,由数据库⼚商提供(如MySQL的 com.mysql.jdbc.Driver ),⽆驱动则

⽆法建⽴数据库连接。

作⽤:满⾜Java程序与数据库的通信数据格式要求。

3. JDBC架构

两层架构:

a. JDBC API:应⽤程序→JDBC管理器(提供连接⼊⼝)。

b. JDBC驱动程序API:JDBC管理器→数据库驱动(实现接⼝通信)。⼆、JDBC核⼼组件(接⼝/类)及功能

组件

核⼼作⽤

DriverManager

管理数据库驱动列表,匹配连

接请求与对应驱动,通过

getConnection() 获取连

接。

Driver

处理与数据库服务器的通信,

⽆需直接交互,由

DriverManager管理。

Connection

数据库通信上下⽂,所有数据

库操作(执⾏SQL、事务管

理)均通过该对象完成。

Statement

提交SQL语句到数据库,提

executeQuery() (查

询)和 executeUpdate()

(增删改)⽅法。

ResultSet

存储查询结果(⼆维表格),

通过 next() 遍历⾏,

getXXX() (如

getInt() )获取列数据。

SQLException

处理数据库操作中的所有异常

(如连接失败、SQL语法错

误)。

三、SQL基础语法(必背)

1. 数据库操作

创建: CREATE DATABASE 数据库名;

删除: DROP DATABASE 数据库名;

使⽤: USE 数据库名;

2. 表操作

创建:

代码块CREATE TABLE 表名(

列名 数据类型 [约束],

);

⽰例: CREATE TABLE category(cid INT PRIMARY KEY AUTO_INCREMENT,

cname VARCHAR(100));

删除: DROP TABLE 表名;

3. 数据操作(CRUD)

操作

语法

插⼊

INSERT INTO 表名

VALUES(1, 2, …);

(或指定列: INSERT

INTO 表名(1)

VALUES();

查询

SELECT 列名1, 列名2…

FROM 表名 [WHERE 条件];

(查询所有列⽤ *

更新

UPDATE 表名 SET 列名1=

1, 列名2=2…

[WHERE 条件]; (⽆WHERE

则更新所有⾏)

删除

DELETE FROM 表名

[WHERE 条件]; (⽆WHERE

则删除所有⾏)

四、JDBC核⼼操作流程(必考)

1. 依赖导⼊

代码块

import java.sql.*; // 核⼼JDBC

import java.math.*; // ⽀持BigDecimal等(可选)

2. 完整操作步骤(以查询为例)

1

2

3

4

1

2代码块// 1. 注册驱动(MySQL驱动类名固定)

Class.forName("com.mysql.jdbc.Driver");

// 2. 获得连接(URL格式:jdbc:数据库名://IP:端⼝/数据库名)

String url = "jdbc:mysql://localhost:3306/mydb";

Connection conn = DriverManager.getConnection(url, "⽤⼾名", "密码");

// 3. 创建语句执⾏者

Statement st = conn.createStatement();

// 4. 执⾏SQL(查询⽤executeQuery,返回ResultSet;增删改⽤executeUpdate,返回影响⾏

数)

ResultSet rs = st.executeQuery("SELECT * FROM category");

// 5. 处理结果集(仅查询需要)

while(rs.next()){ // 遍历⾏,⾸次调⽤指向第⼀⾏

int cid = rs.getInt("cid"); // 按列名获取数据

String cname = rs.getString("cname");

}

// 6. 释放资源(关键!后获取先释放:ResultSet Statement Connection

rs.close();

st.close();

conn.close();

3. 关键注意点

URL格式: jdbc:数据库类型://服务器IP:端⼝号/数据库名 (MySQL默认端⼝3306)。

驱动类名:MySQL为 com.mysql.jdbc.Driver (固定写法)。

⽅法区别:

executeQuery(String sql) :仅⽤于查询,返回 ResultSet

executeUpdate(String sql) :⽤于增删改,返回受影响的⾏数(int类型)。

资源释放:必须在 finally 块中执⾏(避免异常时未释放),⼯具类可简化该操作。

五、JDBC⼯具类(重点应⽤)

1. ⼯具类核⼼功能

封装重复操作:注册驱动(静态代码块)、获取连接、释放资源。

作⽤:简化代码,避免重复编写注册驱动、释放资源等冗余代码。

2. 核⼼代码实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23代码块public class JdbcUtils {

// 配置参数(可抽取到配置⽂件)

private static String driver = "com.mysql.jdbc.Driver";

private static String url = "jdbc:mysql://localhost:3306/mydb";

private static String user = "root";

private static String password = "root";

// 静态代码块:加载驱动(程序启动时执⾏⼀次)

static {

try {

Class.forName(driver);

} catch (ClassNotFoundException e) {

throw new RuntimeException(e);

}

}

// 获取连接

public static Connection getConnection() throws SQLException {

return DriverManager.getConnection(url, user, password);

}

// 释放资源(适配查询/增删改场景,rs可传null

public static void closeResource(Connection conn, Statement st, ResultSet

rs) {

if (rs != null) try { rs.close(); } catch (SQLException e) {}

if (st != null) try { st.close(); } catch (SQLException e) {}

if (conn != null) try { conn.close(); } catch (SQLException e) {}

}

}

3. ⼯具类使⽤⽰例(以插⼊为例)

代码块

@Test

public void insertDemo() {

Connection conn = null;

Statement st = null;

ResultSet rs = null; // 增删改⽆结果集,传null

try {

// 1. 获取连接(⼯具类封装)

conn = JdbcUtils.getConnection();

// 2. 创建语句执⾏者

st = conn.createStatement();

// 3. 执⾏SQL(增删改⽤executeUpdate

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

1

2

3

4

5

6

7

8

9

10

11int affectedRows = st.executeUpdate("INSERT INTO category(cname)

VALUES('测试')");

System.out.println("影响⾏数:" + affectedRows);

} catch (SQLException e) {

throw new RuntimeException(e);

} finally {

// 4. 释放资源(⼯具类封装)

JdbcUtils.closeResource(conn, st, rs);

}

}

六、JSP与JSTL SQL标签(数据库操作)

1. 核⼼依赖

引⼊JSTL SQL标签库(必须写在JSP⻚⾯顶部):

代码块

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!– 配合遍

历结果集 –>

2. 核⼼标签与操作

标签

作⽤

关键属性

<sql:setDataSource>

配置数据库连接信息(数据

源)

var (数据源变量名)、

driver url

user password

<sql:query>

执⾏查询SQL,返回结果集

dataSource (数据源)、

var (结果集变量名)

<sql:update>

执⾏增删改SQL,返回影响⾏

dataSource var (影

响⾏数变量名)

<sql:param>

为SQL语句中的 ? 占位符传

参(防注⼊)

value (参数值)

3. ⽰例:JSP查询数据库(Employees表)

代码块

12

13

14

15

16

17

18

19

20

1

2<%@ page import="java.sql.*" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<html>

<body>

<!– 1. 配置数据源 –>

<sql:setDataSource var="dbSource"

driver="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost/TEST"

user="root" password="pass123"/>

<!– 2. 执⾏查询SQL –>

<sql:query dataSource="${dbSource}" var="resultSet">

SELECT * FROM Employees;

</sql:query>

<!– 3. 遍历结果集并展⽰ –>

<table border="1">

<tr><<th>ID</</th><<th>姓名</</th><<th>姓⽒</</th><<th>年龄</</th></tr>

<c:forEach var="row" items="${resultSet.rows}">

<tr>

<td><c:out value="${row.id}"/></td>

<td><c:out value="${row.first}"/></td>

<td><c:out value="${row.last}"/></td>

<td><c:out value="${row.age}"/></td>

</tr>

</c:forEach>

</table>

</body>

</html>

七、易错点与考点总结

1. ⾼频易错点

URL格式错误:漏写端⼝、数据库名拼写错误(如 jdbc:mysql://localhost/mydb 默认

3306可省略端⼝)。

驱动类名错误:MySQL驱动类名必须是 com.mysql.jdbc.Driver (不可少 jdbc. )。

资源未释放:未在 finally 块中关闭资源,导致数据库连接泄露。

Statement ⽅法混⽤:查询⽤ executeUpdate (⽆返回结果)、增删改⽤

executeQuery (报错)。

结果集遍历:未调⽤ rs.next() 直接获取数据(默认指向⾏⾸,⽆数据)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

312. 核⼼考点

JDBC操作完整流程(代码填空题,如注册驱动、获取连接、释放资源)。

核⼼组件功能匹配(选择题,如“哪个组件⽤于提交SQL语句?”→Statement)。

SQL语法(简答题/代码题,如创建表、插⼊数据、条件查询)。

⼯具类编写与使⽤(编程题,如⽤⼯具类实现⽤⼾信息查询)。

JSP+JSTL SQL标签(代码填空题,如引⼊标签库、配置数据源)。

⼋、复习建议

1. 牢记JDBC“注册驱动→获取连接→执⾏SQL→处理结果→释放资源”五步流程,默写核⼼代码。

2. 熟练掌握SQL增删改查语法,结合JDBC代码场景练习。

3. 理解⼯具类的设计思想(封装、复⽤),能独⽴编写简化版⼯具类。

4. 练习JSP⻚⾯中⽤JSTL标签完成数据库操作,注意标签属性和结果集遍历。

5. 重点关注易错点,避免考试中因细节失误丢分。

Ch8 Spring框架

⼀、Spring框架概述(基础考点)

核⼼概念

Spring是开源的企业级Java应⽤开发框架,2003年6⽉基于Apache 2.0许可发布,核⼼⽬标是简化

J2EE开发,⽀持POJO编程模型。

核⼼特性:⾮侵⼊式(应⽤对象不依赖Spring API)、IOC(控制反转)、DI(依赖注⼊)、AOP

(⾯向切⾯编程)、容器特性(管理对象⽣命周期)、组件化(XML/注解组合对象)、⼀站式(整

合各类框架及⾃⾝MVC/JDBC模块)。

优势:⽆需EJB容器,依赖轻量级Servlet容器;模块组织清晰,按需使⽤;复⽤现有技术(ORM、

⽇志等);简化测试;统⼀事务管理和异常处理。

架构体系

分层架构,核⼼模块分为8类:Core Container(核⼼容器)、Data Access/Integration(数据访

问/集成)、Web(Web层)、AOP、Aspects、Messaging、Instrumentation、Test。

核⼼容器模块:spring-core(IOC/DI核⼼)、spring-beans(BeanFactory实现)、spring

context(对象访问)、spring-expression(SpEL表达式)。

⼆、IOC与DI(核⼼⾼频考点)核⼼概念

IOC(控制反转):对象创建权从应⽤程序转移到Spring容器,解决组件依赖耦合问题。

DI(依赖注⼊):IOC的具体实现,容器动态为对象注⼊所需外部资源(对象、常量、资源),核

⼼是“组件创建与使⽤分离”。

关系:IOC是设计思想,DI是具体实现;⼆者描述同⼀概念的不同⻆度。

IOC容器

容器类型

特点

适⽤场景

BeanFactory

基础容器,提供DI基本⽀持

资源有限场景(移动设备、

Applet)

ApplicationContext

继承BeanFactory,新增企业

级功能(属性⽂件解析、事件

发布)

绝⼤多数企业应⽤

常⽤ApplicationContext实现:FileSystemXmlApplicationContext(读取⽂件系统XML)、

ClassPathXmlApplicationContext(读取类路径XML)、WebXmlApplicationContext(Web应

⽤)。

Bean相关核⼼知识点

配置⽅式:XML配置(<bean>标签)、注解配置(@Component、@Bean等)、Java配置

(@Configuration+@Bean)。

作⽤域:默认singleton(容器内唯⼀实例,启动时创建)、prototype(每次请求创建新实例,获

取时创建);request/session/global session(Web应⽤专⽤)。

⽣命周期:Bean定义→初始化→使⽤→销毁。

初始化回调:实现InitializingBean接⼝(afterPropertiesSet⽅法)或XML中指定init

method。

销毁回调:实现DisposableBean接⼝(destroy⽅法)或XML中指定destroy-method。

⾃动装配:通过<bean>的autowire属性实现,⽀持byName(按属性名匹配Bean)、byType(按

属性类型匹配)、constructor(按构造函数参数类型匹配)。

依赖注⼊⽅式

1. 构造函数注⼊:通过构造函数参数注⼊依赖,XML中⽤<constructor-arg>标签,⽀持index(参数

索引)、type(参数类型)指定。2. Setter⽅法注⼊:通过setter⽅法注⼊依赖,XML中⽤<property>标签,⽀持p-namespace简化配

置。

3. 注解注⼊:@Autowired(按类型匹配)、@Qualifier(指定Bean名称,解决类型冲突)、

@Resource(按名称匹配,JSR-250标准)。

三、AOP(核⼼⾼频考点)

核⼼概念

定义:⾯向切⾯编程,将⽇志、权限、事务等横切关注点从业务逻辑中分离,实现模块化。

核⼼术语:

JointPoint(连接点):程序执⾏的特定点(如⽅法调⽤、类初始化)。

Pointcut(切⼊点):定义通知执⾏的连接点集合(如“所有service包下的⽅法”)。

Advice(通知):切⼊点执⾏时的逻辑,包括前置(before)、后置(after)、环绕

(around)、返回后(after-returning)、抛出异常后(after-throwing)。

Aspect(切⾯):通知+切⼊点的组合。

Weaving(织⼊):将切⾯融⼊⽬标对象的过程(静态织⼊:编译期;动态织⼊:运⾏时,

Spring AOP采⽤)。

实现⽅式

1. XML配置⽅式:通过<aop:config>标签声明切⾯、切⼊点、通知,依赖aspectj相关jar包

(aspectjrt.jar、aspectjweaver.jar)。

2. @AspectJ注解⽅式:

启⽤注解⽀持:<aop:aspectj-autoproxy/>。

声明切⾯:@Aspect注解类。

声明切⼊点:@Pointcut注解⽅法(表达式如execution(* [com.xxx](com.xxx).service..

(..)))。

声明通知:@Before、@After、@Around等注解⽅法。

与AspectJ的关系

AspectJ是完整AOP标准,⽀持编译期织⼊;Spring AOP是基于代理的轻量级实现,⽆侵⼊性。

Spring AOP借⽤@AspectJ注解⻛格,依赖AspectJ进⾏切⼊点解析,但运⾏时不依赖AspectJ编译

器/织⼊器。

四、事务管理(重要考点)

事务核⼼属性(ACID)

原⼦性(Atomicity):事务操作要么全成,要么全回滚。

⼀致性(Consistency):事务前后数据完整性⼀致。

隔离性(Isolation):多个事务并发执⾏互不⼲扰。

持久性(Durability):事务提交后结果永久有效。

事务管理类型

类型

特点

实现⽅式

编程式

灵活性⾼,代码侵⼊性强

直接使⽤

PlatformTransactionManag

er API

声明式

⽆侵⼊,与业务逻辑分离

XML配置(<tx:advice>)或

注解(@Transactional)

核⼼配置

事务管理器:DataSourceTransactionManager(JDBC/MyBatis)、

HibernateTransactionManager(Hibernate)。

声明式事务注解:@Transactional,可指定隔离级别(如ISOLATION_READ_COMMITTED)、传

播⾏为(如REQUIRED)、超时时间、是否只读。

五、Spring MVC(Web层考点)

核⼼架构

MVC模式:模型(POJO封装数据)、视图(呈现模型数据,如JSP)、控制器(处理请求,构建

模型并跳转视图)。

核⼼DispatcherServlet:接收所有HTTP请求,协调HandlerMapping(选择控制器)、

Controller(处理请求)、ViewResolver(解析视图)。

请求处理流程

1. 客⼾端发送请求⾄DispatcherServlet。

2. DispatcherServlet通过HandlerMapping找到对应Controller。

3. Controller处理请求,构建模型数据,返回视图名称。

4. ViewResolver根据视图名称解析实际视图(如JSP路径)。

5. DispatcherServlet将模型数据传⼊视图,渲染后响应客⼾端。核⼼配置与注解

配置⽂件:web.xml(配置DispatcherServlet)、[servlet-name]-servlet.xml(组件扫描、视图

解析器配置)。

控制器注解:@Controller(声明控制器)、@RequestMapping(映射URL与请求⽅法,⽀持

value/method属性)。

视图解析器:InternalResourceViewResolver(配置prefix前缀和suffix后缀,如/WEB-INF/jsp/

和.jsp)。

常⻅功能

表单处理:通过@ModelAttribute绑定请求参数到POJO。

⻚⾯重定向:返回“redirect:⽬标URL”。

静态资源访问:通过<mvc:resources>标签映射(如mapping="/pages/**",location="/WEB

INF/pages/")。

六、注解汇总(易错考点)

注解

作⽤

适⽤场景

@Component

声明Spring组件(通⽤)

普通Java类

@Controller

声明控制器组件

Web层控制器类

@Service

声明服务层组件

业务逻辑层类

@Repository

声明数据访问层组件

DAO层类

@Autowired

按类型注⼊依赖

构造函数、setter⽅法、字段

@Qualifier

配合@Autowired,指定

Bean名称

同⼀类型多个Bean时

@Resource

按名称注⼊依赖(JSR-250)

字段、setter⽅法

@Configuration

声明Java配置类

配置类(配合@Bean)

@Bean

声明Bean(Java配置)

配置类中的⽅法

@Transactional

声明事务(声明式事务)

服务层⽅法/类

@Aspect

声明AOP切⾯

切⾯类

@Pointcut

声明AOP切⼊点

切⾯类中的⽅法@Before/@After

声明AOP前置/后置通知

切⾯类中的⽅法

七、易错点与⾼频考点总结

1. 区分Bean的singleton与prototype作⽤域的创建时机和适⽤场景。

2. 区分@Autowired、@Qualifier、@Resource的注⼊规则。

3. AOP通知类型的执⾏顺序(环绕通知包裹前置/后置通知)。

4. 声明式事务的传播⾏为(如REQUIRED:当前⽆事务则创建,有则加⼊)。

5. Spring MVC的请求处理流程及DispatcherServlet的作⽤。

6. IOC容器与Bean的⽣命周期回调⽅法的实现⽅式。

要不要我帮你整理⼀份Spring核⼼考点真题演练及答案解析?包含选择题、简答题和编程题,贴合期

末考试题型,帮助你巩固重点知识。

Docker

⼀、核⼼基础(概念+原理,必考)

1. 为什么需要 Docker?(核⼼痛点)

解决环境⼀致性问题:避免“开发环境能跑,⽣产环境跑不了”(JDK版本、依赖、配置不⼀致)

优势:轻量(⽐虚拟机资源占⽤低、启动快)、部署简单(⽆需⼿动安装依赖)

核⼼⽬标: Build once, Run anywhere

2. 诞⽣与发展(了解关键节点)

2013年:开源发布(基于Linux内核容器技术)

2014年:1.0正式版,掀起容器化热潮

2017年:Docker Desktop发布(⽀持Windows/Mac,⽆需⼿动配置Linux内核)

定位:云原⽣开发基础⼯具,与Java、Spring⽣态深度集成

3. 核⼼⼯作原理(重点)

基于Linux内核两⼤核⼼技术实现轻量级隔离:

Namespace(命名空间):给容器提供独⽴“环境视⻆”(PID、⽹络、⽂件系统),让容器误以

为是独⽴主机

Cgroups(控制组):限制容器资源使⽤(CPU、内存、磁盘IO),避免资源抢占

通俗类⽐:容器=“集装箱”(装应⽤+依赖),宿主机=“船”,共享基础资源,⽐虚拟机(单独

开船)更⾼效4. 四⼤核⼼概念(辨析题⾼频)

概念

定义/作⽤

类⽐

镜像(Image)

应⽤+依赖(JDK、库、配

置)的“安装包”,只读

Windows安装光盘、APP安

装包

容器(Container)

镜像运⾏后的实例,可启停、

暂停、删除

已安装的软件、运⾏中的APP

Dockerfile

构建镜像的“配⽅⽂件”,明

⽂指令集合

菜谱(可重复执⾏)

仓库(Registry)

存储镜像的云平台(公开/私

有),⽤于分享下载

App Store、Docker Hub

⼆、安装与基础命令(实操题核⼼)

1. Linux安装(Ubuntu/Debian⽰例)

代码块

# 安装Docker

curl -fsSL https://get.docker.com | bash -s — –dry-run

# root操作(关键,避免权限问题)

sudo usermod -aG docker $USER

newgrp docker

# 验证安装

docker –version

docker info

2. 镜像操作命令(⾼频)

功能

命令⽰例

注意事项

拉取镜像

docker pull openjdk:8-

jdk-alpine

格式:镜像名:版本(默认

latest)

查看本地镜像

docker images

显⽰仓库名、版本、镜像ID、

⼤⼩

删除本地镜像

docker rmi 镜像ID/镜像

:版本

需先删除依赖该镜像的容器

1

2

3

4

5

6

7

83. 容器操作命令(必考实操)

代码块

# 1. 运⾏容器(最核⼼,参数必须记)

docker run -d -p 主机端⼝:容器端⼝ –name 容器名 镜像名:版本

# 参数解释:

# -d:后台运⾏(不占⽤终端)

# -p:端⼝映射(外部通过主机端⼝访问容器)

# –name:容器别名(⽅便后续操作)

# 2. 查看容器

docker ps # 运⾏中的容器

docker ps -a # 所有容器(含停⽌的)

# 3. 启停/删除

docker stop 容器名/ID # 停⽌

docker start 容器名/ID # 启动

docker rm 容器名/ID # 删除(需先停⽌)

# 4. 排查错误

docker logs 容器名/ID # 查看容器⽇志

# 5. 进⼊容器(调试⽤)

docker exec -it 容器名/ID /bin/sh # alpine系统⽤/bin/shUbuntu/bin/bash

exit # 退出容器

三、Dockerfile(编程题⾼频)

1. 基础指令(必须掌握)

指令

作⽤

⽰例

FROM

指定基础镜像(第⼀⾏必须是

FROM)

FROM openjdk:8-jdk

alpine

COPY

本地⽂件/⽬录复制到容器

COPY target/myapp.jar

/app.jar

RUN

构建镜像时执⾏命令(安装依

赖等)

RUN rm -rf

/usr/local/tomcat/weba

pps/ROOT

EXPOSE

声明容器暴露端⼝(仅说明,

⾮映射)

EXPOSE 8080

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22CMD/ENTRYPOINT

容器启动时执⾏命令(启动应

⽤)

CMD ["java", "-jar",

"/app.jar"]

区别:CMD可被 docker run 后参数覆盖,ENTRYPOINT不可覆盖

2. 多阶段构建(Spring Boot项⽬必考)

核⼼:分离构建阶段和运⾏阶段,减⼩镜像体积

代码块

# 构建阶段(编译打包)

FROM maven:3.9-eclipse-temurin-17 AS build

WORKDIR /app

COPY pom.xml .

COPY src ./src

RUN mvn -B clean package -DskipTests

# 运⾏阶段(仅保留运⾏依赖)

FROM eclipse-temurin:17-jre-alpine

WORKDIR /app

COPY –from=build /app/target/*.jar app.jar # 从构建阶段复制Jar

EXPOSE 8080

ENTRYPOINT ["java","-jar","app.jar"]

3. 构建与运⾏命令

代码块

# 构建镜像(-t 指定名称和版本,末尾.不可少)

docker build -t spring-demo:1.0 .

# 运⾏镜像

docker run -d -p 8080:8080 –name myapp spring-demo:1.0

# 测试访问

curl http://localhost:8080/hello

四、Spring Boot + Docker 集成(应⽤题)

1. 基础镜像选择(优化考点)

官⽅: openjdk:17-jdk-slim (200MB+,稳定)

社区: eclipse-temurin:17-jre-alpine (更⼩,适合⽣产)

1

2

3

4

5

6

7

8

9

10

11

12

13

1

2

3

4

5

6

7

82. 核⼼要求

能独⽴编写Spring Boot项⽬的Dockerfile(多阶段构建)

掌握构建、运⾏、测试的完整流程

理解端⼝映射、容器命名的作⽤

五、Docker Compose(多容器管理,综合题)

1. 核⼼作⽤

管理多容器应⽤(如Spring Boot + MySQL),简化配置和启动流程

2. docker-compose.yml ⽰例(重点)

代码块

version: "3.9" # 版本需与Docker兼容

services:

db: # MySQL服务

image: mysql:8.0

environment: # 环境变量(数据库密码、库名)

MYSQL_ROOT_PASSWORD: root

MYSQL_DATABASE: demo

volumes: # 数据持久化(避免容器删除数据丢失)

db_data:/var/lib/mysql

app: # Spring Boot服务

build: . # 本地构建镜像(当前⽬录Dockerfile

ports:

"8080:8080"

depends_on: # 依赖db服务,启动顺序:先启动db再启动app

db

environment: # 数据库连接配置

SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/demo

volumes:

db_data: # 定义数据卷(持久化MySQL数据)

3. 核⼼命令

代码块

docker compose up -d # 后台启动所有服务

docker compose logs -f app # 查看app服务⽇志

六、最佳实践与技巧(提升题)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

1

21. 镜像优化:多阶段构建 + Alpine/JRE镜像(减⼩体积)

2. 版本锁定:基础镜像⽤具体版本(如 17.0.8_7-jre-alpine ),避免latest版本兼容问题

3. 敏感信息:⽤ env_file 存储,禁⽌硬编码到Dockerfile或compose⽂件

4. 开发热加载: docker run -v "$PWD:/app" -p 8080:8080 … (挂载本地源码,修改

⽆需重新构建)

5. 容器调试: docker exec -it <容器ID> sh (进⼊容器终端排查问题)

七、考点分布与复习建议

1. 题型预测

概念题(20%):核⼼概念辨析、⼯作原理(Namespace/Cgroups)、Docker与虚拟机区别

命令题(30%):镜像/容器操作、构建运⾏命令、参数含义

编程题(30%):编写Dockerfile(Spring Boot项⽬)、编写docker-compose.yml(多容器)

应⽤题(20%):容器化部署流程、问题排查(⽇志查看)、镜像优化

2. 复习重点

优先掌握:核⼼概念、镜像/容器命令、Dockerfile基础指令、Spring Boot多阶段构建

重点练习:独⽴完成“Spring Boot项⽬容器化”和“MySQL+Spring Boot多容器部署”

注意细节:命令参数(如 -p 映射格式)、Dockerfile指令顺序、compose配置中的依赖和持久化

3. 常⽤资源(备查)

Docker官⽅⽂档、Docker Hub(镜像查询)、Spring Boot Docker指南、Compose规范

敏捷开发

⼀、核⼼概念:敏捷开发与传统开发模式对⽐

(⼀)敏捷软件开发(Agile Software Development)

1. 定义:⼜称敏捷开发,是应对快速变化需求的软件开发模式,核⼼是⼀套价值体系和实践原则。

2. 核⼼⽬标:快速交付⾼质量软件,通过频繁反馈与迭代适应需求变化,提升客⼾满意度和开发效

率。

(⼆)瀑布式开发(Waterfall Development)

1. 定义:传统线性开发模型,流程分为需求分析、设计、开发、测试、部署、维护等阶段,阶段间严

格顺序推进。2. 核⼼特点:

线性顺序:前⼀阶段完成后才能进⼊下⼀阶段

⽂档驱动:各阶段需产出详细⽂档

3. 核⼼缺点:

灵活性差:难以融⼊后期需求变更

测试滞后:缺陷晚发现导致修复成本⾼

⽤⼾反馈延迟:仅项⽬完成后可介⼊

⼆、敏捷开发的核⼼基础

(⼀)四⼤价值观(必考重点)

1. 个体和互动胜过流程和⼯具

2. ⼯作的软件胜过详尽的⽂档

3. 客⼾协作胜过合同谈判

4. 响应变化胜过遵循计划

(⼆)⼗⼆条原则(核⼼考点)

1. 优先通过持续交付有价值软件保障客⼾满意,快速响应需求变化

2. 拥抱变化,即使开发后期也接受需求变更并创造竞争优势

3. 频繁交付⼯作软件(周期⼏周到⼏个⽉,越短越好)

4. 开发⼈员与业务⼈员每⽇协作

5. 建⽴有动⼒的团队,提供必要⽀持并信任其完成任务

6. ⾯对⾯沟通是最有效的信息传递⽅式

7. ⼯作的软件是进度衡量的主要标准

8. 保持可持续开发节奏,⻓期稳定推进

9. 技术卓越与良好设计提升敏捷性和效率

10. 简洁(减少⽆⽤⼯作)是关键

11. ⾃组织团队产出最优架构、设计和需求

12. 定期反思团队效率并调整⾏为

三、敏捷开发的关键要素

(⼀)迭代与增量开发1. 迭代:每次开发周期(2-4周),结束时交付可⼯作软件版本

2. 增量:每个迭代交付产品的部分功能,累加构建完整软件

(⼆)⽤⼾故事(User Story)

1. 定义:描述功能需求的简洁⽅式,⾮技术语⾔表达

2. 标准格式:作为某类⽤⼾,我希望做到某个功能,以便实现某个⽬的

(三)⾃组织团队

1. 核⼼特征:成员⾃主决定⼯作⽅式和问题解决⽅案

2. 优势:主动性强、创新性⾼,快速响应变化

(四)持续集成与持续交付(CI/CD)

1. 持续集成:团队频繁将代码集成到主分⽀,确保功能可测试、可交付

2. 持续交付:通过⾃动化⼯具,将测试通过的功能随时部署到⽣产环境

(五)迭代回顾

1. 定义:每次迭代结束后的回顾会议(Retrospective)

2. ⽬的:反思⼯作中的问题,识别改进点,提升下⼀轮迭代效率

四、敏捷开发的主要框架(重点掌握)

(⼀)Scrum(应⽤最⼴泛)

1. 定义:⽤于复杂产品开发、交付与维护的敏捷框架,适⽤于多领域

2. 核⼼⻆⾊:

产品负责⼈(Product Owner):负责需求与优先级设定

Scrum Master:保障Scrum流程执⾏,协助团队克服障碍

开发团队(Developers):实现产品功能

3. 核⼼事件:

Sprint(冲刺):2-4周的迭代周期,聚焦单⼀⽬标

Sprint Planning(冲刺规划会)

Daily Standup(每⽇站会):检视进度、调整计划

Sprint Review(冲刺评审会):与利益相关⼈检视成果

Sprint Retrospective(冲刺回顾会):持续改进

(⼆)看板(Kanban)1. 起源:1940年代丰⽥汽⻋发明的精益制造⼯艺

2. 核⼼定位:可视化⼯作流、限制在制品,提升效率

3. 核⼼原则:

可视化⼯作(看板⾯板+状态卡⽚)

限制在制品(WIP):避免任务堆积

管理⼯作流程(明确待处理、进⾏中、完成等阶段)

专注于完成:先收尾当前任务再启动新任务

反馈与改进:定期回顾优化

基于拉动的系统:有能⼒时才接收新任务

透明化:项⽬进展对所有相关⽅可⻅

(三)极限编程(XP – Extreme Programming)

1. 核⼼⽬标:提升软件质量和响应变化的能⼒

2. 关键特征:

客⼾全程参与:提供实时反馈和优先级设置

短迭代周期(1-3周):交付可⽤软件增量

持续反馈:频繁发布+快速调整

3. 主要实践:

结对编程:两名开发者协作编写代码

测试驱动开发(TDD):先写测试⽤例再编码

频繁集成:每⽇多次将代码集成到主⼲

简单设计:避免过度设计

重构:优化代码结构(不改变外部⾏为)

五、敏捷开发的优缺点分析(案例分析题⾼频考点)

(⼀)优点

1. 快速响应需求变化,降低变更⻛险

2. 持续交付早期价值,客⼾提前使⽤功能并反馈

3. 客⼾满意度⾼(持续参与+影响产品形态)

4. 团队⼠⽓提升(快速看到⼯作成果)

5. 早期发现问题,降低最终交付⻛险(⼆)缺点

1. 需求不确定性:频繁变更可能导致项⽬⽬标模糊

2. 规划与控制难度⼤:周期和交付时间难预测,影响预算

3. 对团队要求⾼:依赖强协作、⾼⾃驱⼒和沟通能⼒

4. 适⽤范围有限:不适合需求稳定、规划完备的⼤型/流程固定项⽬

六、常⻅考点与复习提⽰

(⼀)名词解释⾼频考点

敏捷开发、迭代开发、增量开发、⽤⼾故事、Sprint、CI/CD、看板、结对编程、TDD

答题要点:定义+核⼼特征/作⽤

(⼆)简答题⾼频考点

1. 对⽐敏捷开发与瀑布式开发的核⼼差异(从流程、灵活性、反馈机制、⽂档要求等⻆度)

2. 简述敏捷开发的四⼤价值观和核⼼原则

3. 说明Scrum框架的核⼼⻆⾊与关键事件

4. 看板的核⼼原则与实践是什么?

5. 敏捷开发中"持续集成"与"持续交付"的区别与联系

(三)案例分析题答题思路

1. 场景判断:给定项⽬背景(如创业公司创新产品、⼤型企业固定流程项⽬),判断适合的开发模式

并说明理由

2. 问题分析:针对敏捷实施中的问题(如需求频繁变更导致进度延误、团队协作不畅),结合敏捷原

则提出解决⽅案

3. 框架选择:根据项⽬特点(如需求变化频率、团队规模、交付周期要求),选择合适的敏捷框架并

设计核⼼流程

(四)复习建议

1. 重点记忆四⼤价值观、⼗⼆条原则、三⼤框架的核⼼要素(⻆⾊、事件、实践)

2. 理解"迭代""增量""⾃组织""拉动式"等核⼼概念的本质

3. 结合实际项⽬场景,练习敏捷与传统开发模式的选择与应⽤分析

4. 关注各框架的适⽤场景差异(如Scrum适⽤于复杂产品、看板适⽤于流程优化、XP适⽤于快速变化

的⼩型团队)Ex 实验

⼀、实验核⼼任务与功能要求(必考重点)

1. 核⼼任务

设计并实现在线购物⽹站,完成指定基本功能、数据库设计(推荐MySQL)、上线部署,是期末考试

核⼼考核载体(占实验成绩30%)。

2. 两⼤核⼼功能模块

(1)顾客端功能(基础必实现)

⾝份管理:注册、登录、注销(需实现会话保持、权限验证)

产品交互:产品列表展⽰、产品查询(⽀持关键词/分类筛选)

购买流程(完整业务链):浏览/查询 → 添加⾄购物⻋ → 付款(模拟或对接⽀付逻辑) → 电⼦邮

件发货确认

订单管理:查看订单状态(待付款/已付款/已发货等)、订单历史记录

(2)销售管理端功能(管理类核⼼)

商品⽬录管理:商品的添加、删除、修改、查询(CRUD完整实现)

订单管理:订单状态更新、订单信息查询

销售统计:⽣成销售统计报表(需结合数据库聚合查询)

⼆、技术选型与核⼼技术考点

1. 数据库设计(MySQL为主)

核⼼数据表设计(必考):

⽤⼾表(存储顾客/管理员信息:账号、密码、邮箱、权限⻆⾊等)

产品表(商品信息:ID、名称、价格、库存、分类、描述等)

购物⻋表(关联⽤⼾ID、产品ID、数量、选中状态等)

订单表(关联⽤⼾ID、订单号、下单时间、总⾦额、订单状态等)

订单明细表(关联订单ID、产品ID、购买数量、单价等)

数据关系:⼀对⼀(⽤⼾-订单基础信息)、⼀对多(⽤⼾-多个订单、订单-多个明细)、多对多

(⽤⼾-产品通过购物⻋关联)

关键操作:查询(产品筛选、订单统计)、更新(库存扣减、订单状态变更)、事务处理(付款流

程中库存与订单的原⼦操作)2. 前后端交互与业务逻辑

前端:产品列表渲染、购物⻋交互、订单提交表单、登录注册界⾯(需保证界⾯可⽤性)

后端:接⼝设计(⽤⼾操作接⼝、商品管理接⼝、订单处理接⼝)、会话管理(登录状态保持,避

免未登录访问受限功能)

关键技术点:

购物⻋数据存储(会话存储/数据库存储,需考虑登录状态同步)

邮件发送功能(SMTP协议应⽤,实现发货确认通知)

权限控制(区分顾客与管理员⻆⾊,限制管理端功能访问)

三、代码提交规范(占实验成绩30%)

1. 提交平台(⼆选⼀)

Github:https://github.com/

码云:https://gitee.com/

2. 提交要求(考试需验证合规性)

实验报告中必须注明代码仓库地址(地址⽆效视为未完成)

仓库需包含 readme.md ⽂件:

必填内容:学号、姓名

核⼼内容:源代码⽂件说明(⽬录结构、核⼼模块作⽤)、运⾏环境要求、启动⽅式

代码规范:结构清晰、模块化设计、关键代码添加注释

四、在线部署要点(必考)

1. 部署平台

阿⾥云、AWS或其他正规云服务商

2. 部署要求(直接影响实验完成度判定)

实验报告中注明⽹站访问地址、测试账⼾(含顾客/管理员⻆⾊)及⼝令

访问有效性:提交报告后3个⽉内,校园⽹环境可正常访问

部署关键步骤(需在报告中详细记录+截图):

a. 云服务器环境配置(如LAMP/WAMP、Python虚拟环境等)

b. MySQL数据库部署与数据导⼊

c. 项⽬⽂件上传(通过FTP/命令⾏⼯具)d. 服务启动与端⼝配置(确保外⽹可访问)

e. 功能测试(验证所有核⼼功能可正常使⽤)

五、实验报告规范(占实验成绩40%)

1. 格式与命名

格式模板:参照课程QQ群共享⽂件

⽂件名:学号_姓名.doc 或 学号_姓名.pdf

提交截⽌⽇期:2025年12⽉16⽇(逾期按未提交处理)

2. 核⼼内容(缺⼀不可)

实验题⽬与要求(明确核⼼任务)

设计思路:架构设计(前后端分离/单体架构)、技术选型理由、数据库设计(表结构、关系

图)、业务流程图(如购买流程)

实验代码:核⼼模块代码⽚段(如登录验证、购物⻋添加、订单⽣成)+ 代码解释

功能测试:测试⽤例(覆盖所有核⼼功能)、测试结果、关键步骤截图

应⽤部署:详细部署步骤、服务器配置截图、⽹站访问截图

3. 纪律要求(严重影响成绩)

报告内容雷同、在线部署⽹站雷同,均视为抄袭,按相关规定处理

未按时提交、代码地址⽆效、部署⽹站⽆法访问,均按未完成实验处理

六、复习建议

1. 功能优先:确保顾客端核⼼流程(注册-登录-加购-下单-查订单)完整实现,再补充管理端功能

2. 数据库先⾏:先设计合理的数据表结构,明确字段含义与关联关系,避免后续业务逻辑返⼯

3. 部署提前练:提前熟悉云服务器配置、项⽬部署流程,留存关键步骤截图,确保部署后可稳定访问

4. 规范记于⼼:严格遵守代码提交、报告格式要求,避免因规范问题影响成绩

5. 避坑重点:拒绝抄袭(代码、报告、⽹站均需原创),确保代码仓库可访问、部署⽹站⻓期有效

“凡事豫则⽴,不豫则废”,结合实验安排(B3-138实验室,14:00-17:00第5-8节),合理规划时

间,逐⼀攻克功能模块与技术难点,确保实验顺利完成!

课程QQ群:(及时关注群内模板⽂件与通知)

Docker + Spring Boot 电商系统开发⼀、复习总纲

本次考试围绕「中⼩型电商系统的容器化开发与部署」核⼼展开,重点考察 Spring Boot 分层架构设

计、核⼼模块实现、Docker 容器化配置及完整业务流程(登录-商品-购物⻋)。考试形式包括选择

题、简答题、代码填空题、配置题,需掌握从项⽬搭建到部署测试的全流程,重点关注注解使⽤、业

务逻辑实现、容器化配置三⼤核⼼板块。

⼆、核⼼技术栈与必备⼯具(必考基础)

1. 核⼼技术栈

分层

技术选型

核⼼作⽤

后端核⼼

Spring Boot 2.7.18

快速构建 Web 应⽤,⾃动配

认证授权

Spring Security

实现⽤⼾登录认证,密码加密

数据库操作

Spring Data JPA

简化 CRUD,⽆需⼿写 SQL

前端模板

Thymeleaf + Bootstrap 5

后端渲染⻚⾯,快速实现响应

式样式

数据库

MySQL 8.0(Docker 容器

化)

存储⽤⼾、商品、购物⻋数据

容器化

Docker + Docker Compose

应⽤与数据库容器化,⼀键启

简化⼯具

Lombok(@Data 注解)

⾃动⽣成 getter/setter,简化

实体类代码

2. 必备⼯具与版本要求

JDK 8+/11(项⽬指定 1.8)

Maven(项⽬构建⼯具)

Docker + Docker Compose(容器化环境)

IDE(IDEA/Eclipse)

浏览器(功能测试)

考点:技术栈对应作⽤(如 Spring Security 负责什么)、⼯具版本匹配(如 JDK 版本与 Spring Boot

2.7.x 兼容)。三、项⽬分层架构(重中之重)

1. 分层设计原则

核⼼思想:解耦、职责分离、便于维护扩展

架构类⽐:⼯⼚流⽔线(实体层=原材料规格→仓库层=原材料仓库→服务层=⽣产⻋间→控制器层=

前台窗⼝)

2. 各层核⼼职责、注解与代码模板

(1)实体层(Entity)

核⼼职责:映射数据库表,定义数据结构(⽆业务逻辑)

核⼼注解:

@Entity :标记为 JPA 实体(对应数据库表)

@Table(name="表名") :指定数据库表名(如 users products

@Id + @GeneratedValue(strategy=GenerationType.IDENTITY) :主键 + ⾃增

@Column :字段约束( unique=true 唯⼀、 nullable=false ⾮空)

@OneToMany/@ManyToOne :表关联(⽤⼾-购物⻋项:⼀对多;购物⻋项-商品:多对⼀)

@Data (Lombok):简化代码

代码模板(User 实体核⼼⽚段):

代码块

@Data

@Entity

@Table(name = "users")

public class User {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

@Column(unique = true, nullable = false)

private String username; // ⽤⼾名(唯⼀)

@Column(nullable = false)

private String password; // 加密存储

// 关联购物⻋项(⼀对多)

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)

private Set<CartItem> cartItems;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18(2)仓库层(Repository)

核⼼职责:数据访问接⼝,实现 CRUD(依赖 Spring Data JPA)

核⼼规范:

继承 JpaRepository<实体类, 主键类型> (内置 findAll() findById()

save() delete()

⾃定义查询⽅法:按「⽅法名规则」⾃动⽣成 SQL(如 findByUsername 按⽤⼾名查询)

代码模板(UserRepository):

代码块

public interface UserRepository extends JpaRepository<User, Long> {

// ⾃定义查询:根据⽤⼾名查询⽤⼾(登录认证⽤)

Optional<User> findByUsername(String username);

}

(3)服务层(Service)

核⼼职责:业务逻辑处理(如加⼊购物⻋、密码加密)、事务管理

核⼼注解:

@Service :标记为业务层组件(Spring ⾃动管理实例)

构造器注⼊:⽆需 @Autowired ,Spring ⾃动装配 Repository 实例

关键要求:

实现 UserDetailsService 接⼝(Spring Security 认证要求),重写

loadUserByUsername ⽅法

密码加密:通过 PasswordEncoder 加密(Spring Security 强制要求)

代码模板(UserService 核⼼⽚段):

代码块

@Service

public class UserService implements UserDetailsService {

private final UserRepository userRepository;

private final PasswordEncoder passwordEncoder;

// 构造器注⼊

public UserService(UserRepository userRepository, PasswordEncoder

passwordEncoder) {

this.userRepository = userRepository;

this.passwordEncoder = passwordEncoder;

1

2

3

4

1

2

3

4

5

6

7

8

9}

// 登录认证核⼼⽅法:根据⽤⼾名查询⽤⼾并封装为 UserDetails

@Override

public UserDetails loadUserByUsername(String username) throws

UsernameNotFoundException {

User user = userRepository.findByUsername(username)

.orElseThrow(() -> new UsernameNotFoundException("⽤⼾不存在"));

// 封装⽤⼾名、加密密码、权限(新⼿简化为⽆权限)

return new org.springframework.security.core.userdetails.User(

user.getUsername(), user.getPassword(), Collections.emptyList()

);

}

// 保存⽤⼾(密码加密)

public User saveUser(User user) {

user.setPassword(passwordEncoder.encode(user.getPassword()));

return userRepository.save(user);

}

}

(4)控制器层(Controller)

核⼼职责:接收前端请求、调⽤服务层、⻚⾯跳转/数据传递

核⼼注解:

@Controller :标记为 Web 控制器(处理⻚⾯请求)

@GetMapping("/路径") :处理 GET 请求(如⻚⾯访问)

@PostMapping("/路径") :处理 POST 请求(如表单提交)

@RequestMapping("/前缀") :统⼀接⼝前缀(如购物⻋接⼝ /cart/*

Model :传递数据到前端( model.addAttribute("key", 数据)

Authentication :获取当前登录⽤⼾信息( authentication.getName() 获⽤⼾

redirect:/路径 :重定向(如加⼊购物⻋后跳回商品列表)

代码模板(CartController 核⼼⽚段):

代码块

@Controller

@RequestMapping("/cart")

public class CartController {

private final CartService cartService;

public CartController(CartService cartService) {

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

1

2

3

4

5

6this.cartService = cartService;

}

// 加⼊购物⻋(POST 请求)

@PostMapping("/add")

public String addToCart(@RequestParam Long productId,

@RequestParam(defaultValue = "1") Integer quantity,

Authentication authentication) {

String username = authentication.getName();

cartService.addToCart(username, productId, quantity);

return "redirect:/products"; // 重定向到商品列表

}

// 查看购物⻋(GET 请求)

@GetMapping

public String viewCart(Model model, Authentication authentication) {

String username = authentication.getName();

model.addAttribute("cartItems", cartService.getCartItems(username));

return "cart"; // 渲染 templates/cart.html

}

}

(5)配置层(Config)

核⼼职责:项⽬配置(认证、数据库、前端缓存等)

核⼼配置:Spring Security 配置( SecurityConfig

注解: @Configuration (标记配置类)、 @EnableWebSecurity (启⽤安全配置)

核⼼ Bean:

PasswordEncoder :返回 BCryptPasswordEncoder (密码加密器)

SecurityFilterChain :配置登录规则、请求权限、退出逻辑

代码模板(SecurityConfig 核⼼⽚段):

代码块

@Configuration

@EnableWebSecurity

public class SecurityConfig {

// 密码加密器(Spring 容器管理)

@Bean

public PasswordEncoder passwordEncoder() {

return new BCryptPasswordEncoder();

}

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

1

2

3

4

5

6

7

8

9// 安全过滤链:配置登录、权限、退出

@Bean

public SecurityFilterChain securityFilterChain(HttpSecurity http) throws

Exception {

http

.csrf().disable() // 新⼿简化(⽣产环境需开启)

.authorizeHttpRequests(auth -> auth

.antMatchers("/login", "/css/**", "/js/**").permitAll() // 匿名

访问

.anyRequest().authenticated() // 其他请求需登录

)

.formLogin(form -> form

.loginPage("/login") // ⾃定义登录⻚

.defaultSuccessUrl("/products", true) // 登录成功跳商品列表

.permitAll()

)

.logout(logout -> logout

.logoutSuccessUrl("/login?logout") // 退出跳登录⻚

.permitAll()

);

return http.build();

}

}

(6)前端层(Templates)

核⼼技术:Thymeleaf(后端模板引擎)+ Bootstrap(样式)

关键语法:

数据渲染: [[${变量名}]] (如 [[${username}]] 显⽰登录⽤⼾名)

循环遍历: th:each="product : ${products}" (遍历商品列表)

条件判断: th:if="${#lists.isEmpty(cartItems)}" (购物⻋为空判断)

表单提交: th:action="@{/接⼝路径}" (如加⼊购物⻋提交到 /cart/add

图⽚/链接: th:src="${product.imageUrl}"

th:href="@{/cart/remove/{id}(id=${item.id})}"

核⼼⻚⾯:

login.html :登录⻚(表单提交到 /login ,⽀持错误/退出提⽰)

products.html :商品列表⻚(导航栏、商品卡⽚、加⼊购物⻋表单)

cart.html :购物⻋⻚(商品列表、删除、结算功能)

考点:分层职责、核⼼注解匹配、代码⽚段补全(如实体类缺少的注解、控制器缺少的请求映射)、

表关联关系设计。

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30四、核⼼业务流程实现(综合应⽤题)

1. 登录流程

1. 访问 /login → 控制器返回 login.html ⻚⾯

2. 输⼊⽤⼾名/密码提交表单 → Spring Security 调⽤ UserService.loadUserByUsername

询⽤⼾

3. 密码校验(Spring Security ⾃动对⽐加密后的密码)

4. 校验成功 → 跳转到 /products (商品列表);失败 → 显⽰错误提⽰

2. 加⼊购物⻋流程

1. 商品列表⻚选择商品,输⼊数量 → 提交表单到 /cart/add (POST 请求)

2. 控制器接收 productId quantity → 调⽤ CartService.addToCart

3. 服务层逻辑:

查询当前⽤⼾和商品

检查商品是否已在购物⻋:已存在则更新数量,不存在则新增 CartItem

调⽤ CartItemRepository.save 保存数据

4. 重定向到 /products ⻚⾯

3. 购物⻋结算流程

1. 购物⻋⻚点击「结算购物⻋」→ 访问 /cart/checkout

2. 服务层调⽤ cartService.clearCart (清空当前⽤⼾购物⻋)

3. 重定向到 /products?checkout=success → 显⽰结算成功提⽰

考点:业务流程步骤描述、服务层核⼼逻辑(如加⼊购物⻋的判断逻辑)。

五、Docker 容器化部署(配置题重点)

1. 核⼼配置⽂件

(1)Dockerfile(应⽤容器化)

多阶段构建:先打包 Jar 包,再⽤轻量镜像运⾏(减⼩体积)

核⼼指令:

代码块

# 阶段1:构建 Jar

FROM maven:3.8.5-openjdk-8 AS build

1

2WORKDIR /app

COPY pom.xml .

COPY src ./src

RUN mvn clean package -DskipTests

# 阶段2:运⾏ Jar 包(alpine 镜像轻量)

FROM openjdk:8-jdk-alpine

WORKDIR /app

COPY –from=build /app/target/ecommerce-1.0.0.jar app.jar

EXPOSE 8080 # 暴露端⼝(与 application.properties ⼀致)

ENTRYPOINT ["java", "-jar", "app.jar"] # 启动命令

(2)docker-compose.yml(多容器编排)

功能:同时启动 Spring Boot 应⽤和 MySQL 容器,配置⽹络和数据持久化

核⼼配置:

代码块

version: '3.8'

services:

# MySQL 服务

mysql:

image: mysql:8.0

container_name: ecommerce-mysql

restart: always

environment:

MYSQL_ROOT_PASSWORD: root123 # 根密码(与 application.properties ⼀致)

MYSQL_DATABASE: ecommerce_db # ⾃动创建数据库

MYSQL_CHARACTER_SET_SERVER: utf8mb4

ports:

"3306:3306"

volumes:

mysql-data:/var/lib/mysql # 数据持久化

networks:

ecommerce-network

# 应⽤服务

app:

build: . # 构建当前⽬录的 Dockerfile

container_name: ecommerce-app

restart: always

ports:

"8080:8080"

depends_on:

mysql # 依赖 MySQL,先启动 MySQL

3

4

5

6

7

8

9

10

11

12

13

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27networks:

ecommerce-network

# ⽹络(容器互通)

networks:

ecommerce-network:

driver: bridge

# 数据卷(持久化 MySQL 数据)

volumes:

mysql-data:

2. 关键配置说明

spring.datasource.url jdbc:mysql://mysql:3306/ecommerce_db?xxx

mysql 是 Docker Compose 中 MySQL 容器名,⽀持内部域名解析)

数据持久化: volumes: mysql-data:/var/lib/mysql (容器删除后数据不丢失)

依赖顺序: depends_on: – mysql (确保应⽤启动前 MySQL 已就绪)

3. 核⼼命令(必考)

功能

命令

构建并启动容器(后台)

docker compose up —

build -d

查看运⾏中的容器

docker compose ps

查看应⽤⽇志(排错)

docker compose logs

app

停⽌并删除容器(保数据)

docker compose down

停⽌并删除容器+数据

docker compose down –

v (谨慎使⽤)

考点:Dockerfile 指令含义、docker-compose.yml 配置项解释(如 depends_on

volumes )、核⼼命令使⽤。

六、项⽬配置⽂件(application.properties)

核⼼配置项(需记忆关键参数):

28

29

30

31

32

33

34

35

36

37

38# 服务器端⼝

server.port=8080

# 数据库配置(连接 Docker 中的 MySQL

spring.datasource.url=jdbc:mysql://mysql:3306/ecommerce_db?

useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC

spring.datasource.username=root

spring.datasource.password=root123

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA 配置(⾃动建表、显⽰ SQL

spring.jpa.hibernate.ddl-auto=update # 启动时⾃动创建/更新表

spring.jpa.show-sql=true # 显⽰ SQL 语句

spring.jpa.properties.hibernate.format_sql=true # 格式化 SQL

# Thymeleaf 开发模式(禁⽤缓存)

spring.thymeleaf.cache=false # 修改⻚⾯⽆需重启项⽬

考点: spring.jpa.hibernate.ddl-auto=update 的作⽤、

spring.thymeleaf.cache=false 的意义、数据库 URL 中的 mysql 含义。

七、数据初始化(data.sql)

作⽤:项⽬启动时⾃动执⾏ SQL,初始化测试数据(⽤⼾、商品)

核⼼⽰例:

代码块

测试⽤⼾(密码 123456BCrypt 加密后)

INSERT INTO users (username, password, full_name)

VALUES ('testuser',

'$2a$10$8H9w5f8G7y6D4s3a2q1z0b9n8m7l6k5j4h3g2f1d0s9a8s7d6f5g4h3j2k1l0', '测试⽤

');

测试商品

INSERT INTO products (name, description, price, image_url)

VALUES ('⼩⽶⼿机', '⾼性能智能⼿机', 2999.00, 'https://picsum.photos/200/200?

random=1');

考点:data.sql 的作⽤、测试⽤⼾的⽤⼾名/密码(testuser/123456)。

⼋、易错点与⾼频考点总结

1. 易错点

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

1

2

3

4

5

6

7

注解混淆: @Entity (实体层) vs @Service (服务层) vs @Controller (控制器层)

数据库 URL 错误:将 mysql 写成 localhost (Docker 环境下需⽤容器名)

密码未加密:Spring Security 强制要求密码加密,需通过 PasswordEncoder 处理

Thymeleaf 缓存未关闭:开发时修改⻚⾯不⽣效(需设置

spring.thymeleaf.cache=false

表关联注解错误: @OneToMany(mappedBy="user") mappedBy 对应关联字段名

2. ⾼频考点

1. 分层架构的职责与注解(如 Service 层⽤什么注解,作⽤是什么)

2. Spring Security 登录流程与密码加密( PasswordEncoder UserDetailsService

3. Spring Data JPA ⾃定义查询⽅法(如 findByUsername 的作⽤)

4. Docker 容器化配置(Dockerfile、docker-compose.yml 核⼼配置)

5. 核⼼业务逻辑(加⼊购物⻋的判断逻辑、结算流程)

6. 控制器的请求映射与⻚⾯跳转( @GetMapping redirect

7. 实体类的 JPA 注解与表关联( @OneToMany @ManyToOne

3. 答题技巧

代码填空题:先明确分层(如实体层补 @Entity ,服务层补 @Service

配置题:围绕「⼀致性」原则(如 MySQL 密码在 application.properties docker

compose.yml 中必须⼀致)

简答题:按「步骤+核⼼组件」描述(如登录流程:⻚⾯提交→Security 调⽤

loadUserByUsername →查询⽤⼾→密码校验→跳转)

九、实战测试流程(辅助理解)

1. 启动容器: docker compose up –build -d

2. 访问登录⻚: http://localhost:8080/login

3. 登录:⽤⼾名 testuser ,密码 123456

4. 操作流程:商品列表→加⼊购物⻋→查看购物⻋→删除商品→结算→退出登录

通过实战流程理解各模块的交互关系,助⼒理论答题!

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【华工2025版】网络应用架构PPT笔记(可以在专栏下载格式规整的pdf)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!