上一篇
在HTML页面中使用JSTL需引入核心标签库(如),通过标签实现条件判断、循环遍历等动态逻辑处理,替代Java脚本。
JSTL在HTML(JSP)页面中的使用指南
JSTL概述
JSTL(JSP Standard Tag Library)是Java EE中用于简化JSP页面逻辑的标准标签库,它通过封装常见操作(如循环、条件判断、数据格式化等),减少JSP中的Java代码(Scriptlet),提升代码可读性和可维护性。注意:JSTL需运行在支持JSP的服务器(如Tomcat)中,纯静态HTML无法直接使用。
使用前提
-
环境配置
- 服务器:支持Servlet/JSP的Web容器(如Tomcat 8+)。
- 依赖库:将JSTL库添加到项目:
- Maven依赖:
<dependency> <groupId>jakarta.servlet.jsp.jstl</groupId> <artifactId>jakarta.servlet.jsp.jstl-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>3.0.1</version> </dependency> - 手动添加:
下载jstl-1.2.jar并放入项目的WEB-INF/lib目录。
- Maven依赖:
-
页面声明
在JSP顶部引入JSTL核心标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心功能与标签详解
变量操作与输出
<!-- 定义变量 -->
<c:set var="username" value="John" />
<!-- 输出变量 -->
<p>用户名: <c:out value="${username}" /></p>
<!-- 转义HTML防止XSS攻击 -->
<c:out value="${userInput}" escapeXml="true" />
条件判断
<c:set var="role" value="admin" />
<!-- 简单判断 -->
<c:if test="${role == 'admin'}">
<p>管理员权限</p>
</c:if>
<!-- 多条件分支 -->
<c:choose>
<c:when test="${role == 'admin'}">
<p>欢迎管理员</p>
</c:when>
<c:when test="${role == 'user'}">
<p>欢迎用户</p>
</c:when>
<c:otherwise>
<p>身份未知</p>
</c:otherwise>
</c:choose>
循环遍历
<%-- 模拟数据 --%>
<%
List<String> fruits = Arrays.asList("Apple", "Banana", "Orange");
request.setAttribute("fruitsList", fruits);
%>
<!-- 遍历List -->
<ul>
<c:forEach items="${fruitsList}" var="fruit">
<li>${fruit}</li>
</c:forEach>
</ul>
<!-- 遍历Map -->
<c:forEach items="${userMap}" var="entry">
Key: ${entry.key}, Value: ${entry.value}
</c:forEach>
URL与路径管理
<!-- 生成带Context Path的URL -->
<a href="<c:url value='/products/list' />">产品列表</a>
<!-- 参数传递 -->
<c:url value="/search" var="searchUrl">
<c:param name="keyword" value="${searchTerm}" />
</c:url>
<a href="${searchUrl}">搜索</a>
格式化数据(需引入fmt标签)
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!-- 日期格式化 -->
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm" />
<!-- 数值格式化 -->
<fmt:formatNumber value="${price}" type="currency" currencyCode="USD" />
最佳实践与注意事项
-
避免Scriptlet混用
尽量用JSTL替代<% ... %>代码块,保持页面整洁。
-
作用域管理
使用<c:set>时指定作用域(如scope="session"),避免被墙全局:<c:set var="theme" value="dark" scope="application" />
-
错误处理
用<c:catch>捕获异常:<c:catch var="e"> <%-- 可能出错的代码 --%> </c:catch> <c:if test="${e != null}"> 错误信息: ${e.message} </c:if> -
性能优化

- 减少嵌套循环,复杂逻辑移至Servlet处理。
- 使用
<c:import>缓存静态资源(如页眉/页脚)。
常见问题
-
标签不生效?
- 检查是否遗漏
<%@ taglib %>声明。 - 确认JAR包位于
WEB-INF/lib目录。
- 检查是否遗漏
-
EL表达式无效?
在JSP顶部添加:<%@ page isELIgnored="false" %>
-
如何遍历数据库结果?
在Servlet中查询数据并存入request:List<Product> products = dao.getProducts(); request.setAttribute("products", products);JSP中使用:

<c:forEach items="${products}" var="product"> ${product.name} </c:forEach>
JSTL通过标准化标签显著提升JSP开发效率,降低维护成本,重点掌握core标签库的循环、条件、URL管理,结合fmt库实现数据格式化,遵循“逻辑与视图分离”原则,将复杂计算移至后端,确保页面简洁高效。
引用说明参考Oracle官方JSTL文档、Apache Tomcat实践指南及Java EE开发规范,确保技术准确性。
