复习课敲重点
⼀、考试核⼼信息
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请
◦ 求do;Post(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 {
// 实现init、doFilter、destroy⽅法
}
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"/> <!– 格式化为 2024–12–25 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/sh,Ubuntu⽤/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() 获⽤⼾
◦ 名re)direct:/路径 :重定向(如加⼊购物⻋后跳回商品列表)
•
代码模板(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,初始化测试数据(⽤⼾、商品)
•
核⼼⽰例:
代码块
— 测试⽤⼾(密码 123456,BCrypt 加密后)
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. 操作流程:商品列表→加⼊购物⻋→查看购物⻋→删除商品→结算→退出登录
通过实战流程理解各模块的交互关系,助⼒理论答题!
网硕互联帮助中心




评论前必须登录!
注册