JSTLJSP Standard Tag Library是 JSP 标准标签库它能让你告别 JSP 中混乱的 Java 脚本% ... %用更简洁、易维护的标签语法实现变量操作、流程控制、循环遍历等功能是 Web 开发中提升 JSP 代码可读性的神器。本文将结合你提供的代码示例手把手带你掌握 JSTL 核心标签库的用法附完整可运行代码。一、前置准备引入 JSTL 依赖与标签要使用 JSTL首先需要在 JSP 页面顶部引入核心标签库core这是所有 JSTL 标签的基础% page contentTypetext/html;charsetUTF-8 languagejava %%-- 引入JSTL核心标签库prefixc表示后续标签用c:xxx格式 --%% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %如果你的项目是 Maven 管理的还需要在pom.xml中添加 JSTL 依赖!-- JSTL 依赖 --dependencygroupIdjavax.servlet/groupIdartifactIdjstl/artifactIdversion1.2/version/dependency二、JSTL 核心标签库 常用标签详解1. 变量操作标签c:set、c:out、c:remove这三个标签是 JSTL 中最基础的变量操作工具分别用于设置变量、输出变量、移除变量。1.1c:set设置域对象属性它可以在page/request/session/application域中设置变量也可以直接修改 JavaBean 的属性。基础用法设置普通变量%-- 在request域中设置变量num值为15 --% c:set value15 varnum scoperequest/ %-- 在request域中设置变量username值为admin --% c:set valueadmin varusername scoperequest/ %-- 多行文本赋值标签体内容 --% c:set vardescription scoperequest 今天是4月15日 星期三 /c:set进阶用法修改 JavaBean 属性先定义一个简单的 JavaBeanMysUser.java在 JSP 中创建对象并修改属性% // 先在request域中存入MysUser对象 MysUser myUser new MysUser(); myUser.setUsername(admin); myUser.setPassword(123456); request.setAttribute(myUser, myUser); % %-- 方式1通过value属性设置JavaBean属性 --% c:set target${myUser} propertyusername valueadmin/ %-- 方式2通过标签体内容设置JavaBean属性 --% c:set target${myUser} propertypassword 123456 /c:set1.2c:out输出变量值它用于输出变量或表达式的值支持设置默认值和 HTML 转义比直接用${}更安全。%-- 输出变量num默认值为0如果num不存在则显示0 --% c:out value${num} default0 escapeXmlfalse/ %-- 输出变量usernameescapeXmlfalse表示不转义HTML标签 --% c:out value${username} escapeXmlfalse/ %-- 直接输出常量字符串 --% c:out value常量字符串的输出/ %-- 输出EL表达式计算结果 --% 计算表达式的值c:out value${32}/ br关键属性说明value要输出的变量 / 表达式 / 常量default变量不存在时显示的默认值escapeXml是否转义 HTML 特殊字符如、、默认true安全场景建议开启1.3c:remove移除域对象中的变量用于删除指定域中的变量常用于清理临时数据。c:set vartest value我是一个测试数据/c:set c:out value${test}/ %-- 输出我是一个测试数据 --% br c:remove vartest/ %-- 移除变量test --% 变量移除了还有输出吗 c:out value${test}/ %-- 变量已移除无输出或显示默认值 --%2. 流程控制标签c:if、c:choose、c:catch这些标签用于实现条件判断和异常捕获替代传统的if-else和try-catch脚本。2.1c:if单条件判断相当于 Java 中的if语句只有true分支没有else分支。c:set varsex value1 scopesession/ %-- test属性为判断条件var属性存储判断结果true/false --% c:if test${sex1} varresult 男孩 /c:if ${result} %-- 输出判断结果true --% c:if test${sex0} varresult 女孩 /c:if ${result} %-- 输出判断结果false --%2.2c:choose多分支判断相当于 Java 中的if-else if-else语句由c:choose、c:when、c:otherwise组成。c:set vargrade value80 scopesession/ c:choose c:when test${grade90}优秀/c:when c:when test${grade80 grade90}良好/c:when c:when test${grade70 grade80}中等/c:when c:when test${grade60 grade70}及格/c:when c:otherwise不及格/c:otherwise /c:choose %-- 输出结果良好 --%注意c:when必须按顺序判断满足第一个条件后后续分支不会执行c:otherwise是所有条件都不满足时的默认分支。2.3c:catch异常捕获相当于 Java 中的try-catch语句用于捕获 JSP 页面中的异常。c:catch varexceptionInfo %-- 故意制造除零异常 --% % int i1/0; % /c:catch c:out value${exceptionInfo}/ %-- 输出异常信息java.lang.ArithmeticException: / by zero --%3. 循环遍历标签c:forEachc:forEach是 JSTL 中最常用的循环标签支持两种场景普通数字循环和集合遍历。3.1 普通数字循环类似for(int i1; i5; i)%-- begin起始值end结束值step步长 --% c:forEach begin1 end5 step1 hello world! br /c:forEach %-- 输出5行hello world! --%3.2 集合遍历遍历 List/Set/ 数组% // 1. 在Java脚本中创建用户列表并存入session域 MysUser mysUser null; ListMysUser userlist new ArrayList(); for(int i 0; i 5; i){ mysUser new MysUser(用户i, 123i); userlist.add(mysUser); } session.setAttribute(userlist, userlist); % %-- items要遍历的集合var当前元素的变量名varStatus循环状态对象 --% c:forEach items${userlist} varmysUser varStatusstatus %-- status.count当前循环次数从1开始 --% c:out value${status.count}/ %-- 访问JavaBean的属性通过getter方法 --% ${mysUser.username} ${mysUser.password} br /c:forEachvarStatus常用属性count当前循环次数从 1 开始index当前元素索引从 0 开始first是否为第一个元素true/falselast是否为最后一个元素true/false三、完整整合示例下面是一个整合了所有标签的完整 JSP 页面可直接运行% page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % % page importjava.util.List % % page importjava.util.ArrayList % html head titleJSTL 核心标签库示例/title /head body h21. 变量操作标签示例/h2 c:set value15 varnum scoperequest/ c:set valueadmin varusername scoperequest/ c:set vardescription scoperequest 今天是4月15日 星期三 /c:set pnum的值c:out value${num} default0//p pusername的值c:out value${username}//p p多行文本c:out value${description}//p hr h22. JavaBean属性操作示例/h2 % MysUser myUser new MysUser(); myUser.setUsername(admin); myUser.setPassword(123456); request.setAttribute(myUser, myUser); % c:set target${myUser} propertyusername value张三/ c:set target${myUser} propertypassword654321/c:set p修改后用户名c:out value${myUser.username}//p p修改后密码c:out value${myUser.password}//p hr h23. 流程控制标签示例/h2 c:set vargrade value85 scopesession/ p成绩等级 c:choose c:when test${grade90}优秀/c:when c:when test${grade80 grade90}良好/c:when c:when test${grade70 grade80}中等/c:when c:when test${grade60 grade70}及格/c:when c:otherwise不及格/c:otherwise /c:choose /p hr h24. 循环遍历标签示例/h2 % ListMysUser userlist new ArrayList(); for(int i 0; i 3; i){ userlist.add(new MysUser(用户i, 123i)); } session.setAttribute(userlist, userlist); % table border1 tr th序号/th th用户名/th th密码/th /tr c:forEach items${userlist} varuser varStatusstatus tr td${status.count}/td td${user.username}/td td${user.password}/td /tr /c:forEach /table hr h25. 异常捕获与变量移除示例/h2 c:set vartestVar value测试变量/ p移除前c:out value${testVar}//p c:remove vartestVar/ p移除后c:out value${testVar} default变量已移除//p c:catch varexception % int a 1/0; % /c:catch p捕获的异常信息c:out value${exception}//p /body /html四、使用 JSTL 的优势代码更简洁告别% ... %脚本标签化语法让 JSP 代码结构更清晰可读性更强标签语义化比如c:if、c:forEach一看就知道功能维护更方便减少 JSP 和 Java 代码的耦合修改逻辑时不用在 JSP 中翻找脚本功能更丰富除了核心标签库JSTL 还提供格式化、SQL、XML 等标签库满足更多场景需求五、常见问题与注意事项isELIgnored属性如果 JSP 页面设置了isELIgnoredtrueEL 表达式会被当成普通字符串处理需要改成false才能正常使用 JSTL 标签。JavaBean 的 Getter/SetterJSTL 通过反射调用 JavaBean 的getter和setter方法所以属性必须有对应的getter和setter否则会报错。域对象的查找顺序EL 表达式和 JSTL 标签会按page - request - session - application的顺序查找变量建议显式指定scope属性避免歧义。