原文 https://blog.csdn.net/xiaoed/article/details/43447567
JSTL(JSP Standard Tag Library,JSP标准标签库),目前最新版本是1.2,包括四个标签库(core、format、xml、sql),这一篇主要讲解JSTL的核心库即core标签库,核心库标签共有14个,从功能可以分为四大类:逻辑控制、表达式控制、循环判断、URL操作。
一、开发前准备。
1、确保classpath下有standard.jar,jstl.jar。
2、在JSP文件的顶部引入
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3、已掌握EL表达式的基本语法,若未掌握,可以先看这里 EL表达式详细教程 。
二、核心库标签的分类。
表达式类 :out、set、remove、catch
逻辑控制类:if、choose、when、otherwise
循环判断类:forEach、forTokens
URL操作类 :import、url、redirect、param
三、表达式类标签。
1、out标签(向页面输出值)
语法
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] /></c:out>
名称 | 说明 | EL支持 | 必须 | 默认值 |
---|---|---|---|---|
value | 转出的值 | 是 | 是 | 无 |
escapeXml | 是否转义特殊字符和编译html标签 | 否 | 否 | true |
default | 默认输出的值 | 否 | 否 | 无 |
-
<c:out value="普通值"></c:out>
-
<!-- 普通值 -->
-
<c:out value="${no}" default="默认值"></c:out>
-
<!-- 默认值(当value为EL表达式,并且表达式的结果为null时显示默认值) -->
-
<c:out value="<、>、'、"、&" escapeXml="false"></c:out>
-
<!-- <、>、'、"、& (false时转义特殊字符) -->
-
<c:out value="<、>、'、"、&"></c:out>
-
<!-- <、>、'、"、& (默认不转义) -->
-
<c:out value="<a href='www.xiaoed.com'>小耳朵的个人博客</a>" escapeXml="false"></c:out>
-
<!-- 小耳朵的个人博客(false时编译html标签) -->
-
<c:out value="<a href='www.xiaoed.com'>小耳朵的个人博客</a>"></c:out>
-
<!-- <a href='www.xiaoed.com'>小耳朵的个人博客</a> -->
2、set标签(给变量赋值)
语法1:设置值到scope范围的变量中
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/></c:set>
语法2:设置值到JavaBean或Map的属性中
<c:set value="value" target="target" property="propertyName" /></c:set>
名称 | 说明 | EL支持 | 必须 | 默认值 |
value | 要被存储的值 | 是 | 否 | 无 |
var | 存储值的名称 | 否 | 否 | 无 |
scope | 存储值的范围 | 否 | 否 | page |
target | JavaBean或者java.util.Map的名称 | 是 | 否 | 无 |
property | target对象的属性 | 是 | 否 | 无 |
说明:target非空时,property不能为空,且target和var同时存在时只有一个生效。
-
<c:set var="item1" value="1"></c:set>${item1}
-
<!-- 1 -->
-
<c:set var="item2">2</c:set>${item2}
-
<!-- 2 -->
-
<c:set var="item3" value="1">2</c:set>${item3}
-
<!-- 报错,这两个位置不能同时设置 -->
-
<c:set var="item4" value="page" scope="page"></c:set>
-
<c:set var="item4" value="request" scope="request"></c:set>
-
<c:set var="item4" value="session" scope="session"></c:set>
-
<c:set var="item4" value="application" scope="application"></c:set>
-
${item4}<!-- page -->
-
<c:set target="${user}" value="userName" property="name"></c:set>${user.name}
-
<!-- userName -->
-
<c:set target="${map}" value="value" property="key"></c:set>${map.key}
-
<!-- value -->
3、remove标签(与set相反,删除变量)
语法:
<c:remove var="varName" [scope="{ age|request|session|application }"] />
名称 | 说明 | EL支持 | 必须 | 默认值 |
---|---|---|---|---|
var | 要删除的变量名 | 否 | 是 | 无 |
scope | 要删除变量的范围 | 否 | 是 | 全部 |
-
<c:set var="item" value="request" scope="request"></c:set>
-
<c:set var="item" value="page" scope="page"></c:set>
-
<c:set var="item" value="session" scope="session"></c:set>
-
<c:set var="item" value="application" scope="application"></c:set>${item} -
-
<c:remove var="item" />${item}
-
<!-- page - (默认删除全部的) -->
-
<c:set var="item2" value="request" scope="request"></c:set>
-
<c:set var="item2" value="page" scope="page"></c:set>
-
<c:set var="item2" value="session" scope="session"></c:set>
-
<c:set var="item2" value="application" scope="application"></c:set>${item2} -
-
<c:remove var="item2" scope="page"/>${item2}
-
<!-- page - request (只删除page范围内的)-->
4、catch标签(捕捉异常,保存异常信息)
语法:
<c:catch [var="varName"] > 异常部分 </c:catch>
名称 | 说明 | EL支持 | 必须 | 默认值 |
---|---|---|---|---|
var | 异常信息存储的变量名 | 否 | 否 | 无 |
-
<c:catch var="ex">
-
<% int i = 1/0; %>
-
</c:catch>
-
${ex}<!-- java.lang.ArithmeticException: / by zero -->
四、逻辑控制类标签。
1、if标签(单一的if判断,没有else)
语法:
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>条件成立时的输出内容</c:if>
名称 | 说明 | EL支持 | 必须 | 默认值 |
---|---|---|---|---|
test | 判断条件 | 是 | 是 | 无 |
var | 判断结果存储的变量名 | 否 | 否 | 无 |
scope | 变量的存储范围 | 否 | 否 | page |
-
<c:set var="name" value="张三"></c:set>
-
<c:if test="${name=='张三'}" var="var1" scope="page">我是张三</c:if>
-
<c:if test="${name=='贼九'}" var="var2">贼九也是张三</c:if>
-
var1:${var1} -- var2:${var2}
-
<!-- 我是张三 var1:true -- var2:false -->
2、choose、when、otherwise标签(嵌套使用相当于if-elseif-else)
语法:
-
<c:choose>
-
<c:when test="">
-
前面的条件都不成立但此条件成立时输出
-
</c:when>
-
<c:when test="">
-
前面的条件都不成立但此条件成立时输出
-
</c:when>
-
......
-
<c:otherwise>
-
前面的条件都不成立时才输出
-
</c:otherwise>
-
</c:choose>
名称 | 说明 | EL支持 | 必须 | 默认值 |
---|---|---|---|---|
test | 判断条件 | 支持 | 是 | 无 |
-
<c:set var="score" value="60"></c:set>
-
<c:choose>
-
<c:when test="${score<60}">
-
差
-
</c:when>
-
<c:when test="${score==60}">
-
刚好
-
</c:when>
-
<c:when test="${score>=60}">
-
很好
-
</c:when>
-
<c:otherwise>
-
没考
-
</c:otherwise>
-
</c:choose>
-
<!-- 刚好 -->
五、循环判断类标签。
1、forEach标签(循环遍历)
语法1:遍历集合,类似(String s : new String[]{"a","b"})
-
<c:forEach items="collection" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
-
输出内容
-
</c:forEach>
语法2:循环指定次数,类似(int i=0;i<5;i++)
-
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
-
输出内容
-
</c:forEach>
forEach参数说明
名称 | 说明 | EL支持 | 必须 | 默认值 |
---|---|---|---|---|
items | 遍历的集合对象 | 是 | 否 | 无 |
var | 每次遍历的对象 | 否 | 否 | 无 |
varStatus | 遍历的相关信息 | 否 | 否 | 无 |
begin | 开始的位置(正数) | 是 | 否 | 0 |
end | 结束的位置(正数) | 是 | 否 | 集合长度 |
step | 遍历的步长(正数) | 是 | 否 | 1 |
varStatus属性说明
名称 | 类型 | 说明 |
---|---|---|
index | number | 遍历对象的索引,从0开始 |
count | number | 总共循环的次数,从1开始 |
first | boolean | 本次循环遍历的是否是集合的第一个元素 |
end | boolean | 本次循环遍历的是否是集合的最后一个元素 |
循环指定次数
-
<c:forEach var="i" varStatus="ii" begin="0" end="10" step="3">
-
第${ii.count}次迭代,索引:${ii.index},值是:${i},是否是第1个:${ii.first},是否是最后 一个:${ii.last}<br>
-
</c:forEach>
-
<!--
-
第1次迭代,索引:0,值是:0,是否是第1个:true,是否是最后 一个:false
-
第2次迭代,索引:3,值是:3,是否是第1个:false,是否是最后 一个:false
-
第3次迭代,索引:6,值是:6,是否是第1个:false,是否是最后 一个:false
-
第4次迭代,索引:9,值是:9,是否是第1个:false,是否是最后 一个:true
-
-->
遍历List
-
<%
-
List<String> list = new ArrayList<String>();
-
list.add("A");
-
list.add("B");
-
list.add("C");
-
list.add("D");
-
list.add("E");
-
list.add("F");
-
request.setAttribute("list",list);
-
%>
-
<c:forEach items="${list}" var="l" varStatus="ll" begin="1" end="5" step="2">
-
第${ll.count}次迭代,索引:${ll.index},值是:${l},是否是第1个:${ll.first},是否是最后 一个:${ll.last}<br>
-
</c:forEach>
-
<!--
-
第1次迭代,索引:1,值是:B,是否是第1个:true,是否是最后 一个:false
-
第2次迭代,索引:3,值是:D,是否是第1个:false,是否是最后 一个:false
-
第3次迭代,索引:5,值是:F,是否是第1个:false,是否是最后 一个:true
-
-->
遍历Map
-
<%
-
Map<String,String> map = new HashMap<String,String>();
-
map.put("key1", "value1");
-
map.put("key2", "value2");
-
map.put("key3", "value3");
-
request.setAttribute("map",map);
-
%>
-
<c:forEach items="${map}" var="m">
-
key:${m.key},value:${m.value}<br>
-
</c:forEach>
-
<!--
-
key:key3,value:value3
-
key:key2,value:value2
-
key:key1,value:value1
-
-->
遍历Set
-
<%
-
Set<String> set = new HashSet<String>();
-
set.add("大");
-
set.add("坏");
-
set.add("蛋");
-
request.setAttribute("set",set);
-
%>
-
<c:forEach items="${set}" var="s">
-
${s}
-
</c:forEach>
-
<!-- 坏 蛋 大 -->
2、forTokens标签(字符串拆分,相当于String的split方法)
语法:
-
<c:forTokens items="str" delims="selStr" [var="varName"]
-
[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
-
输出内容
-
</c:forTokens>
参数说明
名称 | 说明 | EL支持 | 必须 | 默认值 |
---|---|---|---|---|
items | 要被拆分的字符串的 | 是 | 是 | 无 |
delims | 用来拆分的字符串 | 否 | 是 | 无 |
var | 保存每次拆分的字符串 | 否 | 否 | 无 |
varStatus | 第次拆分的相关信息 | 否 | 否 | 无 |
begin | 起始位置 | 是 | 否 | 0 |
end | 终止位置 | 是 | 否 | 被拆分后的长度 |
step | 步长 | 是 | 否 | 1 |
注:var、varStatus、begin、end、step和forEach的参数作用相同
-
<c:forTokens items="你,是,我,的,小,苹,果" delims="," var="i" varStatus="ii">
-
${i}
-
</c:forTokens>
-
<!-- 你 是 我 的 小 苹 果 -->
五、URL操作类标签。
1、import标签(把其他资源文件引用到本页面,类似jsp:include,区别在于可以引用任意地方的资源,不限于本项目)
语法:
-
<c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"] [varReader="varReaderName"]>
-
<span style="white-space:pre"> <c:param>...</span>
-
</c:import>
名称 | 说明 | EL支持 | 必须 | 默认值 |
---|---|---|---|---|
url | 要引入资源的URL | 是 | 是 | 无 |
context | URL为相对路径时的根目录 | 否 | 否 | 当前项目目录 |
var | 资源文件内容保存对象的名字 | 否 | 否 | 无 |
scope | 保存范围 | 否 | 否 | page |
charEncoding | 文件编码 | 否 | 否 | 无 |
varReader | 保存导入内容的Java.io.Reader对象 | 否 | 否 | 无 |
说明:
1、引入的资源文件不限于jsp、html也可是txt等。
2、url可以是绝对路径,也可是相对路径。
3、此操作容易出异常,建议放在<c:catch></c:catch>中捕获。
-
<c:import url="www.xiaoed.com"></c:import>
-
<!-- 输出页面内容(黑色) -->
-
<c:import url="www.xiaoed.com" var="varUrl" scope="page"></c:import>
-
<!-- 没有输出 -->
-
<c:import url="www.xiaoed.com" var="varUrl"></c:import>
-
<a style="color: red;">${varUrl}</a>
-
<!-- 输出页面内容(红色) -->
-
<c:import url="/imp.txt" charEncoding="UTF-8" context="/jstl"></c:import>
-
<!-- 我是Txt(黑色) -->
2、url标签(在JSP页面中构造一个URL地址,实现URL重写)
语法:param是给url传递参数
-
<c:url value="value" [context="context"] var =“varName" [scope="page|request|session|application"]>
-
<c:param>...
-
</c:url>
名称 | 说明 | EL支持 | 必须 | 默认值 |
---|---|---|---|---|
value | 要构造的URL,绝对或相对路径 | 是 | 是 | 无 |
var | 构造好的URL保存的对象名称 | 否 | 否 | 无 |
context | URL为相对路径时的根目录 | 否 | 否 | 当前项目目录 |
scope | 保存对象的存储范围 | 否 | 否 | page |
c:param | 向URL传递参数 | 是 | 否 | 无 |
-
<c:url value="www.xiaoed.com"></c:url>
-
<!-- www.xiaoed.com -->
-
<c:url value="www.xiaoed.com" var="urlName"></c:url>
-
<!-- 没有输出 -->
-
<c:url value="www.xiaoed.com" var="urlName" scope="page"></c:url>
-
<a style="color: green;">${urlName}</a>
-
<!-- www.xiaoed.com(绿色) -->
-
<c:url value="/index.jsp" context="/jstl"></c:url>
-
<!-- /jstl/index.jsp -->
-
<c:url value="www.xiaoed.com">
-
<c:param name="n1" value="v1"></c:param>
-
<c:param name="n2" value="v2"></c:param>
-
</c:url>
-
<!-- www.xiaoed.com?n1=v1&n2=v2 -->
3、redirect标签(重定向到指定URL)
语法:
-
<c:redirect url=”url”[context=”context”]>
-
<c:param>...
-
</c:redirect>
名称 | 说明 | EL支持 | 必须 | 默认值 |
---|---|---|---|---|
url | 要重定向的URL地址 | 是 | 是 | 无 |
context | URL为相对路径时的根目录 | 否 | 否 | 当前项目目录 |
param | 向URL传递参数 | 是 | 否 | 无 |
-
<c:redirect url="/imp.jsp" context="/jstl">
-
<c:param name="name" value="value"></c:param>
-
</c:redirect>
-
<!-- 跳转页面的URL http://localhost:8080/jstl/imp.jsp?name=value -->
4、param标签(与import、url、redirect联合使用)
语法:
<c:param name="name" value="value"></c:param>
与import、url、redirect联合使用,用来传递参数。
JSTL核心库标签的用法基本上都写到了,若各位发现有误的地方,请在评论中评出,多谢!format、xml、sql这三个标签库的讲解也会在接下来的几篇博客中给出。本文的代码下载请点这里