《Java 100 天进阶之路》第69篇:JSP与EL表达式(2026版)

📅 2026/8/4 10:26:37
《Java 100 天进阶之路》第69篇:JSP与EL表达式(2026版)
第69篇JSP与EL表达式2026版系列导航《Java 100 天进阶之路》完整目录 |⬅️ 上一篇第68篇JavaWeb核心技术之Servlet |➡️ 下一篇第70篇Cookie与Session待发布️ 本文阅读地图3 分钟速览第68篇搞定了Servlet本篇深入JSP与EL表达式。JSP曾是Java Web的“视图层王者”虽然现在新项目多用模板引擎但理解JSP仍是理解Java Web演进的关键模块核心问题一句话回答JSP本质JSP到底是什么JSP本质就是Servlet——第一次访问时被翻译成Servlet源码并编译生命周期JSP从生到死经历什么翻译→编译→加载→实例化→初始化→服务→销毁九大内置对象JSP中可以直接用哪些对象request、response、out、session、application、pageContext、config、page、exceptionEL表达式怎么简化JSP取值${表达式}替代% %自动从四大作用域取值四大作用域数据存在哪里page request session applicationJSTLJSP中怎么做循环和判断用c:forEach和c:if替代Java脚本JSP现状2026年还用JSP吗新项目少用但维护老系统必备技能面试最爱问高频考点有哪些见文末 小节一、核心知识点1. JSP是什么JSPJavaServer Pages是一种动态网页技术允许在HTML中嵌入Java代码由服务器端执行后生成动态内容返回给客户端。本质JSP本质就是Servlet。JSP页面在第一次被请求时由Web容器如Tomcat翻译成Servlet源码.java再编译成字节码.class最终执行并响应HTTP请求。2. JSP vs Servlet 核心定位对比ServletJSP角色控制器Controller——处理业务逻辑视图View——展示数据代码形式Java类输出HTML需要拼接字符串HTML Java更直观适合场景请求处理、业务逻辑页面展示、数据渲染MVC角色ControllerView核心理解Servlet负责“接活、干活”JSP负责“展示结果”。两者配合构成Java Web的MVC模式。3. 2026年JSP现状新项目Spring Boot Thymeleaf/Vue/React已很少使用JSP。但大量遗留系统ERP、CRM、政府系统仍在使用JSP掌握JSP是维护老系统的必备技能。二、通俗讲解1分钟开心学把JSP想象成“带填空的HTML模板”静态HTML一张印好的菜单内容固定不能改变。JSP一张带填空格的菜单模板。服务员服务器根据顾客请求的不同在空格里填上不同的内容动态数据再打印出来给顾客看。JSP本质就是Servlet你写了一个hello.jsp里面混着HTML和Java代码。第一次有人访问时Tomcat偷偷把hello.jsp翻译成一个hello_jsp.javaServlet源码。然后编译成hello_jsp.classServlet字节码。以后每次访问直接执行这个Servlet不再重新翻译编译。核心理解JSP是“写起来像HTML跑起来是Servlet”的混合体。三、JSP生命周期JSP的生命周期遵循“翻译→编译→初始化→服务→销毁”五个阶段。关键点翻译和编译只在第一次访问时执行后续请求直接执行已编译的Servlet。所以第一次访问JSP页面会稍慢后续速度与Servlet相同。四、JSP三大指令JSP指令用于设置页面属性、引入标签库等格式为% 指令名 属性值 %。1. page指令设置页面属性% page contentTypetext/html;charsetUTF-8 languagejava % % page importjava.util.*, java.text.* % % page errorPage/error.jsp % !-- 指定错误页面 -- % page isErrorPagetrue % !-- 当前页面为错误页面 -- % page sessiontrue % !-- 是否启用Session --2. include指令静态包含其他文件% include file/header.jsp % !-- 页面编译时合并 --注意include是静态包含编译时合并jsp:include是动态包含运行时包含更灵活。3. taglib指令引入标签库% taglib prefixc urijakarta.tags.core %五、JSP九大内置对象JSP在翻译成Servlet时容器会自动创建9个内置对象开发者可以直接使用无需显式声明。5.1 九大内置对象速查表对象名类型作用使用频率requestHttpServletRequest获取请求参数、请求头、请求属性⭐⭐⭐⭐⭐responseHttpServletResponse设置响应内容、状态码⭐⭐⭐outJspWriter输出内容到页面⭐⭐⭐⭐sessionHttpSession存储用户会话数据⭐⭐⭐⭐⭐applicationServletContext存储全局应用数据⭐⭐⭐pageContextPageContext操作所有域对象获取其他内置对象⭐⭐⭐⭐configServletConfig获取Servlet配置参数⭐pageObject当前Servlet实例当前JSP页面对象相当于this⭐exceptionThrowable获取异常信息仅错误页面⭐5.2 四大作用域与对应内置对象作用域对象生命周期使用场景pagepageContext当前页面页面内临时数据requestrequest一次请求请求间传递数据sessionsession一次会话用户登录状态、购物车applicationapplication整个应用全局配置、统计数据作用域查找顺序page → request → session → application从小到大。5.3 pageContext详解pageContext是九大内置对象中功能最强的对象它可以获取JSP页面中的其他所有内置对象% // 通过pageContext获取其他内置对象 HttpServletRequest req (HttpServletRequest) pageContext.getRequest(); HttpServletResponse resp (HttpServletResponse) pageContext.getResponse(); HttpSession ses pageContext.getSession(); ServletContext app pageContext.getServletContext(); JspWriter out2 pageContext.getOut(); // 操作四个域对象 pageContext.setAttribute(pageData, 页面数据, PageContext.PAGE_SCOPE); pageContext.setAttribute(requestData, 请求数据, PageContext.REQUEST_SCOPE); pageContext.setAttribute(sessionData, 会话数据, PageContext.SESSION_SCOPE); pageContext.setAttribute(appData, 应用数据, PageContext.APPLICATION_SCOPE); %六、EL表达式6.1 什么是ELELExpression Language表达式语言是JSP 2.0引入的一种简化页面代码的语言。它允许开发者使用简单的语法访问JavaBean属性、集合元素、请求参数等无需编写Java脚本% %。基本语法${表达式}!-- 传统JSP脚本不推荐 -- % request.getAttribute(userName) % !-- EL表达式推荐 -- ${userName}6.2 四大作用域取值EL表达式自动按page → request → session → application顺序查找属性!-- 自动按作用域查找 -- ${userName} !-- 指定作用域查找 -- ${pageScope.userName} ${requestScope.userName} ${sessionScope.userName} ${applicationScope.userName}6.3 EL支持的数据类型基本类型、字符串JavaBean属性自动调用getter数组元素${arr[0]}List/Set元素${list[0]}Map元素${map.key}或${map[key]}集合遍历配合JSTL6.4 EL中的运算符运算符示例说明算术${1 2}加、减、乘、除、取余比较${age 18}、、、、、!逻辑${empty list}、三元${score 60 ? 及格 : 不及格}条件 ? 真值 : 假值empty${empty userList}判断是否为null或空集合6.5 EL的11个隐式对象隐式对象类型说明pageScopeMappage作用域属性requestScopeMaprequest作用域属性sessionScopeMapsession作用域属性applicationScopeMapapplication作用域属性paramMap请求参数单个值paramValuesMap请求参数多个值headerMap请求头单个值headerValuesMap请求头多个值cookieMapCookie对象initParamMap上下文初始化参数pageContextPageContextJSP的pageContext对象使用示例${param.username} !-- 获取请求参数 -- ${header[User-Agent]} !-- 获取请求头 -- ${cookie.JSESSIONID.value} !-- 获取Cookie -- ${pageContext.request.contextPath} !-- 获取应用上下文路径 --七、JSTL标准标签库7.1 什么是JSTLJSTLJSP Standard Tag Library是JSP标准标签库用于替换和简化JSP页面上的Java代码。它提供了一组标准标签使JSP页面更加简洁、可读、易于维护。引入方式% taglib prefixc urijakarta.tags.core %7.2 核心标签库标签作用示例c:set设置变量c:set varname value张三/c:remove删除变量c:remove varname/c:out输出变量c:out value${name}/c:if条件判断c:if test${age 18}成年/c:ifc:choose多条件分支c:when/c:otherwisec:forEach循环遍历遍历集合、数组c:forTokens字符串分割遍历按分隔符拆分c:url构造URL自动添加Session IDc:import导入外部资源包含其他页面内容c:redirect重定向跳转到其他页面使用示例!-- 条件判断 -- c:if test${user ! null} p欢迎${user.name}/p /c:if !-- 多条件分支 -- c:choose c:when test${score 90}优秀/c:when c:when test${score 60}及格/c:when c:otherwise不及格/c:otherwise /c:choose !-- 循环遍历 -- c:forEach items${userList} varuser varStatusstatus tr td${status.index 1}/td td${user.name}/td td${user.age}/td /tr /c:forEach八、避坑要点错误/误区后果正确做法在JSP中写大量Java脚本% %代码难以维护MVC混乱用EL JSTL替代忘记设置页面编码中文乱码% page contentTypetext/html;charsetUTF-8%混淆四大作用域数据生命周期失控明确page/request/session/application的适用场景误用${}和% %语法错误或安全风险EL${}是JSP 2.0推荐方式EL表达式不输出预期值作用域顺序不对检查数据是否在正确的作用域中忽略isELIgnored属性EL表达式被当作文本设置% page isELIgnoredfalse %新项目用JSP技术栈落后新项目推荐Thymeleaf或前后端分离九、面试高频考点Q1JSP的本质是什么JSP本质就是Servlet。JSP页面第一次被访问时由Web容器翻译成Servlet源码.java再编译成字节码.class后续请求直接执行编译后的Servlet。Q2JSP的九大内置对象有哪些request、response、out、session、application、pageContext、config、page、exception。其中exception只能在错误页面isErrorPagetrue中使用。Q3JSP的四大作用域是什么page当前页面、request一次请求、session一次会话、application整个应用作用范围依次扩大。EL表达式按此顺序自动查找属性。Q4EL表达式和JSP脚本表达式% %的区别EL表达式${}是声明式的自动处理null值语法简洁JSP脚本表达式% %是命令式的需要写Java代码null值会报错。EL是JSP 2.0推荐的取值方式。Q5JSTL的作用是什么JSTL用于替代JSP中的Java脚本代码提供条件判断c:if、c:choose、循环遍历c:forEach、变量操作c:set等标签使JSP页面更加简洁、可读、易于维护。 面试官追问陷阱加分题追问1“JSP第一次访问为什么慢后续为什么快” 第一次访问时JSP需要经历**翻译.jsp → .java和编译.java → .class**两个步骤耗时较长。后续访问直接执行已编译的Servlet速度与普通Servlet相同。追问2“JSP和Servlet在MVC中分别扮演什么角色” Servlet作为控制器Controller负责接收请求、处理业务逻辑、转发到JSPJSP作为视图View负责展示数据。这种分离提高了代码的可维护性和可扩展性。十、练习题简答题JSP的本质是什么为什么第一次访问JSP比后续访问慢代码题使用EL表达式和JSTL的c:forEach遍历一个ListUser并在表格中展示。分析题在JSP中${userName}和% request.getAttribute(userName) %有什么区别哪个更好为什么 你的学习进度当前第69篇 / 共108篇 ·进阶篇JavaWeb核心技术第68~72篇✅ 已完成基础篇44篇 第45~69篇 正在学第69篇⏳ 待学习第70~108篇 完整目录 学习指南 | 订阅本专栏不错过每一篇 下一篇文章预告下一篇《第70篇Cookie与Session》内容简介Cookie与Session的原理、区别、分布式Session方案Spring Session、登录状态管理实战。JavaWeb专题持续深入拿下会话管理《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇建议收藏 关注一起100天拿offer 点击关注我更新后第一时间收到推送