一.简介
JSTL:JSP 标准标签函数库
JSTL所提供的标签函数库主要分为五大类:
(1)核心标签库 (Core tag library) c http://java.sun.com/jsp/jstl/core eg.<c:out>
(2)I18N 格式标签库 (I18N-capable formatting tag library) fmt http://java.sun.com/jsp/jstl/fmt eg.<fmt:formatDate>
(3)SQL 标签库 (SQL tag library) sql http://java.sun.com/jsp/jstl/sql eg.<sql:query>
(4)XML 标签库 (XML tag library) xml http://java.sun.com/jsp/jstl/xml eg.<x:forBach>
(5)函数标签库 (Functions tag library) fn http://java.sun.com/jsp/jstl/functions 定义了一些操作字符串的函数
二.使用JSTL
(1)将 jstl.jar、standard.jar 复制到Tomcat的WEB-INF\lib
(2)在JSP 网页中声明
eg.< %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
注:http://java.sun.com/jsp/jstl/core是JSTL1.1的默认uri,若想自定义taglib的uri 时,那就必须在web.xml 中加入设定值:
<web-app> ... ... <jsp-config> <taglib> <taglib-uri>http://www.milan.com.tw/jstl/core</taglib-uri> <taglib-location>/WEB-INF/tld/c.tld</taglib-location> </taglib> </jsp-config> ... ... </web-app>
三.核心标签库介绍
常用标签按功能分类如下:
(1)表达式操作
a.<c:out> 显示数据
语法:<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />
或<c:out value="value" [escapeXml="{true|false}"]>default value</c:out>
分析:value:显示的数据
default:value=null时,显示该默认值,若不设置,当value=null时,显示空字符串
escapeXml:是否转换特殊字符,<c:out>默认会将 <、>、’、” 和 & 转换为 <、>等,可以设置false,不转换
所以<c:out value="<p>测试</p>"/>若不设置escapeXml=false,则输出 <p>测试</p>
b.<c:set> 将变量储存至JSP 范围中或是JavaBean 的属性中
语法:<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>
或<c:set var="varName" [scope="{ page|request|session|application }"]>内容</c:set>
表示将value存到scope指定范围的varName变量中,scope默认为page
注:若value=null,若scope确定,则PageContext.removeAttribute(varName, scope),若scope不确定,PageContext.removeAttribute(varName)
< c:set value="value" target="target" property="propertyName" />
或<c:set target="target" property="propertyName">内容</c:set>
表示将value 的值储存至 target 对象的propertyName属性中
注:target为map或javabean,否则抛异常,target=null也会抛异常
value=null时,若target=map,则target.remove(propertyName);若target=javabean则target.propertyName=null
c.<c:remove>移除变量
语法:<c:remove var="varName" [scope="{ page|request|session|application }"] />
若不设定scope,则<c:remove>将会从Page、Request、Session 及Application 中顺序寻找变量,若能找到时,则将它移除掉,反之则不做任何的事情
d.<c:catch>处理产生错误的异常状况,并且将错误信息储存起来
语法:<c:catch [var="varName"] >欲抓取错误的部分</c:catch>
注:当错误发生在<c:catch>和</c:catch>之间时,则只有<c:catch>和</c:catch>之间的程序会被中止忽略,但整个网页不会被中止。
(2)流程控制
a.<c:if>
语法: <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]/>
或<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>内容</c:if>
说明:test:表达式值为true时执行,false不执行
var:存储test结果true|false
b.<c:choose>、<c:when> 和 <c:otherwise>
语法:
<c:choose>
<c:when test="testCondition" >
内容
</c:when>
... ...
<c:otherwise>
内容
</c:otherwise>
</c:choose>
说明:当test=true时,执行<c:when>中内容,若同一个<c:choose>中所有<c:when>的test都为false才执行<c:otherwise>中内容
注意:<c:when> 和 <c:otherwise>一定被<c:choose>包围;
在同一个 <c:choose> 中时,<c:when>必须在<c:otherwise>之前,<c:otherwise> 必须为最后一个标签;
在同一个<c:choose>下,当有好几个<c:when>都符合条件时,只能有一个<c:when>成立
(3)迭代操作
a.<c:forEach>重复执行本体内容,遍历
语法: <!-- 遍历array,list,map等 -->
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
本体内容
< /c:forEach>
<!-- 遍历指定次数-->
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
本体内容
</c:forEach>
说明:var:存放到指定变量
varStatus:存放现在指到的相关成员信息,它有index(现在指到的成员的索引)、count(指到的成员总数)、
first(是否为第一个) 和last(是否为最后一个)四个属性
step:迭代间隔数
items:items被迭代的集合对象,若不设置items属性,那么begin和end一定要有
b.<c:forTokens> 浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔
语法:
<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
本体内容
</c:forTokens>
(4)URL 操作
a.<c:import> 把其他静态或动态文件包含至本身JSP 网页
语法:
<c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]>
本体内容
</c:import>
或<c:import url="url" [context="context"] varReader="varReaderName" [charEncoding="charEncoding"]> 本体内容 </c:import>
说明:var:储存被包含的文件的内容(以String类型存入)
scope:var变量的JSP 范围
varReader:储存被包含的文件的内容(以Reader类型存入)
content:引入同一服务器下不同站点的jsp时,要设置该值,为"/站点名"
注意:url=null,抛异常,url="绝对地址|相对地址"
绝对地址:eg <c:import url="http://www.baidu.com"/>
相对地址:eg <c:import url="hello.jsp"/>, 表示引入文件在同一个webapps的文件夹下的hello.jsp,若用/表示站点根目录下的hello.jsp
<c:import>的本体内容中使用<c:param name="paramName" value="paramValue"/>传参给被包含文件
与<jsp:include page=""/>的区别:<jsp:include>只能包含和自己同一个web application下的文件,而<c:import>可包含不同web application下的文件
和其他网站的文件
b.<c:url> 生成url
语法:
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"] />
或<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"] >
<c:param> 标签传参
</c:url>
说明:content:同一服务器下不同站点时,要设置该值,为"/站点名"
c.<c:redirect> 将客户端的请求从一个JSP 网页重定向到指定url
语法:<c:redirect url="url" [context="context"] />
或 <c:redirect url="url" [context="context"] > <c:param> </c:redirect >