1、前言
JSTL标签库,是日常开发经常使用的,也是众多标签中性能最好的。把常用的内容,放在这里备份一份,随用随查。尽量做到不用查,就可以随手就可以写出来。这算是Java程序员的基本功吧,一定要扎实。
JSTL全名为JavaServer Pages Standard Tag Library,目前最新的版本为1.1版。JSTL是由JCP(Java Community Process)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签函数库。
Web程序员能够利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java程序(Scripting)的做法,以提高程序的阅读性、维护性和方便性。JSTL 1.1必须在支持Servlet 2.4且JSP 2.0以上版本的Container才可使用
2、<%@ taglib %>引入标签库
a、以classPath中,加入jar包: standard-1.1.2.jar , jstl-1.1.2.jar
b、在目录WEB-INF ld文件夹中放入常用的tld文件:c.tld,fmt.tld(tld是描述标签的XML文件,如果自定义的标签就通过tld来描述)此步可以忽略。
c、在jsp文件的顶部加入以下内容:<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>
3、<c:> 核心标签库
JSTL 核心标签库(C标签)标签共有14个,功能上分为4类:
(1)、 表达式控制标签:out、set、remove、catch
(2)、 流程控制标签:if、choose、when、otherwise
(3) 、循环标签:forEach、forTokens
(4)、 URL操作标签:import、url、redirect、param
3.1 <c:forEach> 标签
为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。语法如下:
语法1:迭代一集合对象之所有成员
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
本体内容
</c:forEach>语法2:迭代指定的次数
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
本体内容
</c:forEach>属性说明 :
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
var | 用来存放当前指向的成员 | N | String | 否 | 无 |
items | 被迭代的集合对象 | Y | Arrays Collection Iterator Enumeration Map String | 否 | 无 |
varStatus | 用来存放现在指向的相关成员信息 | N | String | 否 | 无 |
begin | 开始位置 | Y | int | 否 | 0 |
end | 结束位置 | Y | int | 否 | 最后一个成员 |
step | 每次迭代的间隔数 | Y | int | 否 | 1 |
varStatus属性的属性:
属性 | 类型 | 意义 |
index | number | 现在指向成员的索引 |
count | number | 总共指向成员的总和 |
first | boolean | 现在指向的成员是否是第一个成员 |
last | boolean | 现在指向的成员是否是最后一个成员 |
实例:
a、遍历List
<%
ArrayList<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
session.setAttribute("list", list);
%>
<c:forEach var="item" items="${list}">
${item }<br/>
</c:forEach>结果:
张三
李四
王五
b、遍历Map
<%
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("name", "tom");
map.put("sex", "male");
map.put("age", 23);
session.setAttribute("map", map);
%>
<c:forEach var="item" items="${map}">
${item.key } = ${item.value }<br/>
</c:forEach>结果:
sex = male
age = 23
name = tom
c、遍历Set
<%
HashSet<String> set = new HashSet<String>();
set.add("张三");
set.add("李四");
set.add("王五");
session.setAttribute("set", set);
%>
<c:forEach var="item" items="${set}">
${item }<br/>
</c:forEach>结果:
张三
李四
王五
d、遍历Iterator(Enumeration同理)
<%
HashSet<String> set = new HashSet<String>();
set.add("张三");
set.add("李四");
set.add("王五");
session.setAttribute("iterator", set.iterator());
%>
<c:forEach var="item" items="${iterator}">
${item }<br/>
</c:forEach>结果:
张三
李四
王五
e、遍历数组
<%
String[] strs = {"java", "php", "script"};
session.setAttribute("strs", strs);
%>
<c:forEach var="item" items="${strs}">
${item }<br/>
</c:forEach>结果:
java
php
script
f、遍历字符串(使用英文状态的逗号分割)
<c:forEach var="item" items="java,php,script">
${item }<br/>
</c:forEach>结果:
java
php
script
g、打印10以内的偶数
<c:forEach var="i" begin="2" end="10" step="2">
${i}<br/>
</c:forEach>结果:
2
4
6
8
10
h、测试varStatus属性的属性
<c:forEach var="item" items="c++,php,css,ftp,tld" varStatus="statu">
${item} — ${statu.index} — ${statu.count} — ${statu.first} — ${statu.last}<br/>
</c:forEach>结果:
c++ — 0 — 1 — true — false
php — 1 — 2 — false — false
css — 2 — 3 — false — false
ftp — 3 — 4 — false — false
tld — 4 — 5 — false — true
3.2 <c:forTokens> 标签
用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。语法如下:
<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
本体内容
</c:forTokens>属性说明:
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
var | 用来存放现在指向的成员 | N | String | 否 | 无 |
items | 被迭代的字符串 | Y | String | 是 | 无 |
delims | 定义用来分割字符串的分隔符 | N | String | 是 | 无 |
varStatus | 用来存放当前指向的相关信息 | N | String | 否 | 无 |
begin | 开始位置 | Y | int | 否 | 0 |
end | 结束位置 | Y | int | 否 | 最后一个成员 |
step | 每次迭代的间隔数 | Y | int | 否 | 1 |
实例:
a、使用&符号分割
<c:forTokens var="str" items="I&Love&You" delims="&">
${str}<br/>
</c:forTokens>结果:
I
Love
You
b、使用&、#和@作为分隔符
<c:forTokens var="str" items="
I&Love&You#Me@Too
@?" delims="&,#,@">
${str}<br/>
</c:forTokens>结果:
I
Love
You
Me
Too
?
3.3 <c:out> 标签
主要用来显示数据的内容,语法如下:
语法1:没有本体(body)内容
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />语法2:有本体内容
<c:out value="value" [escapeXml="{true|false}"]>
default value
</c:out>实例:
<%
String str1 = "Hello World";
String str2 = "";
String str3 = null;
session.setAttribute("str1", str1);
session.setAttribute("str2", str2);
session.setAttribute("str3", str3);
%>
<c:out value="${str1}">default Value</c:out><br/>
<c:out value="${str2}">default Value</c:out><br/>
<c:out value="${str3}">default Value</c:out>结果:
Hello World
default Value
一般来说,<c:out>默认会将<、>、’、” 和 & 转换为 <、>、'、" 和&。假若不想转换时,只需要设定<c:out>的escapeXml属性为fasle就可以了。
3.4 <c:set> 标签
主要用来将变量储存至JSP范围中或是JavaBean的属性中。语法如下:
语法1:将 value 的值储存至范围为 scope 的 varName变量之中
<c:set value="value" var="varName" [scope="{ page | request | session | application }"]/>语法2:将本体内容的数据储存至范围为scope的 varName 变量之中
<c:set var="varName" [scope="{ page | request | session | application }"]>
本体内容
</c:set>语法3:将 value的值储存至 target 对象的属性中
<c:set value="value" target="target" property="propertyName" />语法4:将本体内容的数据储存至target 对象的propertyName属性中
<c:set target="target" property="propertyName">
本体内容
</c:set>属性说明 :
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
value | 要被存储的值 | Y | Object | 否 | 无 |
var | 欲存入的变量名称 | N | String | 否 | 无 |
scope | var变量的JSP范围 | N | String | 否 | page |
target | 唯一JavaBean或java.util.Map对象 | Y | Object | 否 | 无 |
property | 指定target对象的属性 | Y | String | 否 | 无 |
实例:
a、保存字符串“java web”到一个变量中,然后输出变量的值
<c:set var="test">java web</c:set>
<c:out value="${test}" />或
<c:set var="test" value="java web" />
<c:out value="${test}" />结果:
java web
注意:默认scope为pageScope范围
b、将指定的字符串保存到applicationScope中
<c:set var="test" value="java web" scope="application"/>
<c:out value="${applicationScope.test}"/>结果:
java wen
3.5 <c:remove> 标签
主要用来移除变量。语法如下:
<c:remove var="varName" [scope="{ age|request|session|application }"] />实例:
<c:set var="test" value="java web"/>
<c:out value="${test}"/>
<c:remove var="test" />
<c:out value="${test}"/>结果:
java web
3.6 <c:catch> 标签
主要用来处理产生错误的异常状况,并且将错误信息储存起来。语法如下:
<c:catch [var="varName"] >
欲抓取错误的部分
</c:catch>实例:
<c:catch var="msg">
<%= 1/0 %>
</c:catch>
<c:out value="${msg}" />结果:
java.lang.ArithmeticException: / by zero
3.7 <c:if> 标签
的用途就和我们一般在程序中用的if一样。语法如下:
语法1:没有本体内容(body)
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>语法2:有本体内容
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
本体内容
</c:if>实例:利用if标签输出1到10之间的偶数
<c:forEach var="i" begin="1" end="10">
<c:if test="${i mod 2 == 0}">
${i}
</c:if>
</c:forEach>结果:
2 4 6 8 10
3.8 <c:choose> <c:when> <c:otherwise> 标签
该标签实现了swith语句的功能。实例:
<c:set var="score">85</c:set>
<c:choose>
<c:when test="${score>=90}">
你的成绩为优秀!
</c:when>
<c:when test="${score>=70&&score<90}">
您的成绩为良好!
</c:when>
<c:when test="${score>60&&score<70}">
您的成绩为及格
</c:when>
<c:otherwise>
对不起,您没有通过考试!
</c:otherwise>
</c:choose>结果:
您的成绩为良好!
3.9 <c:import>标签
标签的功能类似于<jsp:include >,但是相比来说还是<c:import>标签的功能更强大一些。<jsp:include >标签只能导入同一个web容器内的资源,而<c:import>除此之外也可以导入外网的资源。同时<c:import>也可以把页面内容插入到页面中,还可以把内容保存到String对象中。语法如下:
<c:import url="url" [var="varName"] [scope="page|request|session|application"]>
[<c:param/>]*
</c:import>实例:
a、将从外网导入的资源保存在字符串中,然后输出字符串的内容
<c:import url="
https://www.baidu.com
" var="urlStr" />
<c:out value="${urlStr}" />b、导入内网资源
<c:import url="result.jsp"></c:import>
3.10 <c:url>标签
用于重新构造URL,主要用途是URL重写。语法如下:
<c:url value="url" [var="varName"] [scope="page|request|session|application"]>
[<c:param/>]*
</c:url>标签把重新生成的URL存放在var属性指定的命名变量中,并且scope属性指定命名变量的范围,它的默认值为page(页面范围)。
实例:
a、以下标签在页面范围内创建一个myurl命名变量,它的值为"dir2/target.jsp"
<c:url value="dir2/target.jsp" var="myurl" />结果:
dir2/target.jsp
b、以下标签中的value属性以"/"开头,标签会在重新生成的URL中加上当前Web应用的根路径,因此myurl命名变量的为"/helloapp/dir1/dir2/ target.jsp"
<c:url value="/dir1/dir2/target.jsp" var="myurl" />
<a href="${myurl}" >target.jsp </a>结果:
/helloapp/dir1/dir2/ target.jsp
c、在标签中可以包含子标签,用于设定请求参数,例如以下标签包含两个子标签,它们分别用于设定username请求参数和description请求参数
<c:url value="/dir1/dir2/target.jsp" var="myurl" >
<</span>c:param name="username" value="Tom" />
<</span>c:param name="description" value="Age>10&Age<30" />
</c:url>
<a href="${myurl}" >target.jsp </a>标签会对value属性中的特殊符号(如">"和"&")进行正确地编码。以上标记生成的代码为:
<a href="/helloapp/dir1/dir2/target.jsp?username=Tom&description= Age>10&Age<30">target.jsp</a>从以上代码可以看出,description参数值中的">"符号被编码为">","&"符号被编码为"&","<"符号被编码为"<"。
d、标签的name属性设定请求参数名,value属性设定请求参数值,此外,也可以在标签主体内设定请求参数值。例如以下标签主体判断username命名变量是否为"Tom",如果满足条件,就把role请求参数设为"Manager";如果username命名变量为空或者不是"Tom",就把role请求参数设为"Employee"
<c:url value="/dir1/dir2/target.jsp" var="myurl" >
<c:param name="role">
<c:if test="${username=='Tom'}">
Manager
</c:if>
<c:if test="${empty username || ! username=='Tom'}">
Employee
</c:if>
</c:param>
</c:url>
<a href="${myurl}" >target.jsp </a>如果username命名变量为空,那么以上标记生成的代码为:<a href="/helloapp/dir1/dir2/target.jsp?role=Employee" >target.jsp </a>
3.11 <c:redirect>标签
把客户的请求重定向到另一个资源。语法如下:
<c:redirect url="url">
[<c:param/>]*
</c:redirect> 实例:
a、将请求重定向到test.jsp页面
<c:redirect url="test.jsp" />b、将请求重定向到test.jsp页面并发送参数
<c:redirect url="test">
<c:param name="name" value="Tom" />
<c:param name="age" value="20" />
</c:redirect>
3.12 <c:param>标签
<c:import>、<c:url>和<c:redirect>中添加请求的参数。语法如下:
语法1:
<c:param name="name" value="value" />语法2:
<c:param name="name">
parameter value
</c:param>