【JavaWeb学习 | 第20篇】EL表达式与JSTL标签

张开发
2026/5/23 21:49:58 15 分钟阅读
【JavaWeb学习 | 第20篇】EL表达式与JSTL标签
【JavaWeb学习 | 第20篇】EL表达式与JSTL标签在前面几篇文章中我们已经学习了JSP内置对象、Servlet MVC模式、Filter过滤器。但如果你仔细观察之前的JSP页面示例会发现里面还残留着大量的% %Java脚本和% %表达式这会导致页面非常混乱前后端不分离的问题依然存在。EL表达式和JSTL标签库的出现就是为了彻底减少甚至消除JSP中的Java脚本让页面变得干净、优雅、专业。一、EL表达式Expression LanguageEL表达式是 JSP 2.0 引入的一种简化表达式语言用于从四大作用域中取出数据并输出。1. 基本语法${表达式}2. EL表达式的四大作用域搜索顺序非常重要EL会按照以下顺序自动查找属性pageScope → requestScope → sessionScope → applicationScope如果找到就立即返回不再继续查找。3. 常用EL表达式写法%-- 1. 输出作用域中的数据 --% ${user} %-- 直接输出对象调用toString() --% ${user.username} %-- 调用user.getUsername() --% ${user[username]} %-- 另一种写法等价上面 --% %-- 2. 四大作用域显式指定推荐避免歧义 --% ${pageScope.msg} ${requestScope.errorMsg} ${sessionScope.user.username} ${applicationScope.onlineCount} %-- 3. 获取请求参数 --% ${param.username} %-- 相当于 request.getParameter(username) --% ${paramValues.hobby[0]} %-- 获取同名参数的第一个值 --% %-- 4. 获取请求头、Cookie等 --% ${header[User-Agent]} ${cookie.JSESSIONID.value} %-- 5. 运算支持 --% ${10 5} %-- 15 --% ${empty user} %-- 判断是否为空null或空字符串、空集合 --% ${user null ? 未登录 : 已登录}小技巧${pageContext.request.contextPath}→ 动态获取项目根路径强烈推荐在form的action和超链接中使用${pageContext.request.method}→ 获取请求方式二、JSTL标签库JavaServer Pages Standard Tag LibraryJSTL 是 Apache 提供的标准标签库包含四大标签库。我们最常用的是核心标签库c标签和格式化标签库fmt标签。1. 引入JSTL标签库必须先导入在JSP页面顶部添加%-- 核心标签库最常用 --% % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % %-- 格式化标签库日期、数字格式化 --% % taglib prefixfmt urihttp://java.sun.com/jsp/jstl/fmt %2. 核心标签库c标签常用标签%-- 1. c:out输出内容比${}更安全可防XSS --% c:out value${user.username} default未知用户 / %-- 2. c:set向作用域存值 --% c:set varmsg valueHello JSTL scoperequest / %-- 3. c:if单条件判断 --% c:if test${not empty user} h2欢迎 ${user.username} 回来/h2 /c:if %-- 4. c:choose c:when c:otherwise多条件判断类似switch --% c:choose c:when test${score 90}优秀/c:when c:when test${score 80}良好/c:when c:when test${score 60}及格/c:when c:otherwise不及格/c:otherwise /c:choose %-- 5. c:forEach循环遍历最常用 --% table border1 trth编号/thth姓名/thth年龄/th/tr c:forEach items${userList} varu varStatusstatus tr td${status.count}/td %-- 从1开始 --% td${u.username}/td td${u.age}/td /tr /c:forEach /table %-- 6. c:forTokens按分隔符分割字符串 --% c:forTokens itemsjava,php,python delims, varlang ${lang}br /c:forTokens %-- 7. c:redirect重定向 --% c:redirect url/login.jsp /3. 格式化标签fmt简单示例%-- 日期格式化 --% fmt:formatDate value${now} patternyyyy年MM月dd日 HH:mm:ss / %-- 数字格式化 --% fmt:formatNumber value12345.6789 pattern#,##0.00 /三、EL JSTL 对比传统脚本直观对比传统写法不推荐% ListUser list (ListUser) request.getAttribute(userList); if(list ! null) { for(User u : list) { % trtd% u.getUsername() %/td/tr % } } %现代推荐写法干净优雅c:forEach items${userList} varu trtd${u.username}/td/tr /c:forEach四、实际开发最佳实践JSP页面中尽量只使用 EL JSTL HTML杜绝% Java代码 %。复杂逻辑放在 Servlet/Service 层JSP 只负责展示。所有超链接和表单action都写成${pageContext.request.contextPath}/user/list使用c:out输出用户提交的内容防止XSS攻击。在项目中统一把 JSTL 的 jar 包放入WEB-INF/libjstl-1.2.jartaglibs-standard-impl-1.2.5.jar等。五、练习建议强烈推荐动手把之前登录成功的success.jsp改造成纯EL JSTL版本。在Servlet中查询一个用户列表List存入request作用域用c:forEach在JSP中表格展示。实现一个商品列表页面包含分页信息用JSTL循环展示。使用c:if和c:choose实现不同用户角色显示不同菜单。做完这几个练习你会明显感觉到JSP页面变得“清爽”了很多系列文章导航持续更新中第18篇Servlet与MVC第19篇Filter过滤器第20篇EL表达式与JSTL标签本文第21篇Listener监听器在线人数统计、Session创建与销毁监听等下一篇文章预告我们将学习Listener监听器它能监听应用、会话、请求的生命周期是实现“在线人数统计”、“网站访问量统计”等功能的利器。有任何疑问比如c:forEach的varStatus详细用法、如何在Maven项目中引入JSTL等欢迎在评论区留言我会立刻补充示例代码继续加油当你彻底掌握EL JSTL后JSP页面将不再是“脚本大杂烩”而是变得结构清晰、专业美观这也是从“JavaWeb初学者”迈向“能写规范项目”的重要一步✨下一篇文章见

更多文章