一、JSTL概述
1、 简介
从JSP 1.1规范开始JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性,因此自定义标签在WEB应用中被广泛使用。许多WEB应用厂商都开发出了自己的一套标签库提供给用户使用,这导致出现了许多功能相同的标签,令网页制作者无所适从,不知道选择哪一家的好。为了解决这个问题,Apache Jakarta小组归纳汇总了那些网页设计人员经常遇到的问题,开发了一套用于解决这些常用问题的自定义标签库,这套标签库被SUN公司定义为标准标签库(The JavaServer Pages StandardTag Library),简称JSTL。使用JSTL可以解决用户选用不同WEB厂商的自定义标签时的困惑,JSP规范同时也允许WEB容器厂商按JSTL标签库的标准提供自己的实现,以获取最佳性能。
2、 JSTL的组成
标签库功能描述 | 标签库的URI | 建议前缀 |
核心标签库 | http://java.sun.com/jsp/jstl/core | c |
XML标签库 | http://java.sun.com/jsp/jstl/xml | x |
国际化/格式化标签库 | fmt | |
数据库标签库 | sql | |
EL自定义函数 | http://java.sun.com/jsp/jstl/functions | fn |
下面对JSTL的各个标签库进行简单的介绍:
(1)核心标签库中包含了实现WEB应用中的通用操作的标签。例如,用于输出一个变量内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签。
(2)国际化/格式化标签库中包含实现WEB应用程序的国际化的标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置的本地格式显示。
(3)数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表中检索数据等。由于在软件分层的开发模型中,JSP页面仅用作表现层,我们一般不在JSP页面中直接操作数据库,而是在业务逻辑层或数据访问层操作数据库,所以,JSTL中提供的这套数据库标签库没有多大的实用价值。
(4)XML标签库中包含对XML文档中的数据进行操作的标签。例如,解析XML文档、输出XML文档中的内容,以及迭代处理XML文档中的元素。因为XML广泛应用于WEB开发,对XML文档的处理非常重要,XML标签库使处理XML文档变得简单方便,这也是JSTL的一个重要特征。
(5)JSTL中提供的一套EL自定义函数包含了JSP页面制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度和处理字符串中的空格等。
二、核心标签库的应用
1、<c:out>标签
功能:
<c:out> 标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中,在通常情况下,pageContext对象当前保存的“out”对象的数据是输出到客户端浏览器
格式:
语法1,没有标签体的情况:
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />
语法2,有标签体的情况,在标签体中指定输出的默认值:
<c:outvalue="value" [escapeXml="{true|false}"]>default value</c:out>
2、<c:set>标签
功能:
<c:set>标签用于设置各种Web域中的属性,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性
格式:
语法1,使用value属性设置指定域中的某个属性的值:
<c:setvalue="value" var="varName" [scope="{page|request|session|application}"]>
语法2,在标签体中设置指定域中的某个属性的值:
<c:setvar="varName" [scope="{page|request|session|application}"]>
bodycontent
</c:set>
语法3,使用value属性设置Web域中的一个属性对象的某个属性:
<c:setvalue="value" target="target" property="propertyName" />
语法4,在标签体中设置Web域中的一个属性对象的某个属性性:
<c:settarget="target" property="propertyName">
bodycontent
</c:set>
3、<c:remove>标签
功能:
<c:remove>标签用于删除各种Web域中的属性
格式:
<c:removevar="varName" [scope="{page|request|session|application}"]/>
4、<c:catch>标签
功能:
<c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常
格式:
<c:catch[var="varName"]>
nestedactions
</c:catch>
5、<c:if>标签
功能:
<c:if>标签可以构造简单的“if-then”结构的条件表达式,如果条件表达式的结果为真就执行标签体部分的内容
格式:
语法1,没有标签体的情况:
<c:if test="testCondition" var="varName"
[scope="{page|request|session|application}"] />
语法2,有标签体的情况,在标签体中指定要执行的内容:
<c:if test="testCondition" [var="varName"]
[scope="{page|request|session|application}"]>
bodycontent
</c:if>
6、<c:choose>标签
功能:
<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构
格式:
<c:choose>
<c:when test="${count ==0}">
对不起,没有符合您要求的记录。
</c:when>
<c:otherwise>
符合您要求的记录共有${count}条.
</c:otherwise>
</c:choose>
7、<c:forEach>标签
功能:
<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
格式:
语法1,在集合对象中迭代:
<c:forEach [var="varName"]
items="collection"
[varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
body content
</c:forEach>
语法2,迭代固定的次数:
<c:forEach [var="varName"]
[varStatus="varStatusName"]
begin="begin" end="end" [step="step"]>
body content
</c:forEach>
8、<c:forTokens>标签
功能:
<c:forTokens>标签专门用于实现类似java.util.StringTokenizer类的迭代功能,但它是以单个字符作为分隔符,同时可以指定多个字符作为多个并行的分隔符
格式:
<c:forTokensitems="stringOfTokens"delims="delimiters"
[var="varName"]
[varStatus="varStatusName"]
[begin="begin"] [end="end"][step="step"]>
bodycontent
</c:forTokens>
9、<c:param>标签
功能:
在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。<c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码
格式:
语法1,使用value属性指定参数的值:
<c:param name="name" value="value" />
语法2,在标签体中指定参数的值:
<c:param name="name">
parameter value
</c:param>
10、<c:url>
功能:
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面
格式:
语法1,没有标签体的情况:
<c:url value="value"
[context="context"]
[var="varName"]
[scope="{page|request|session|application}"] />
语法2,有标签体的情况,在标签体中指定构造的URL的参数:
<c:url value="value"
[context="context"]
[var="varName"]
[scope="{page|request|session|application}"]>
<c:param>标签
</c:url>
11、<c:import>标签
功能:
<c:import>标签用于在JSP页面中导入一个URL地址指向的资源内容,其作用有点类似<jsp:include>这个JSP标准标签,但功能更强大
格式:
语法1,将URL地址指向的资源内容以字符串形式输出或以字符串形式保存到一个变量中:
<c:importurl="url"
[context="context"]
[var="varName"]
[scope="{page|request|session|application}"]
[charEncoding="charEncoding"]>
optionalbody content for <c:param> subtags
</c:import>
语法2,将URL地址指向的资源内容保存到一个Reader对象中:
<c:importurl="url"
[context="context"]
varReader="varReaderName"
[charEncoding="charEncoding"]>
bodycontent where varReader is consumed by another action
</c:import>
12、<c:redirect>标签
功能:
<c:redirect>标签用于将当前的访问请求转发或重定向到其他资源,它可以根据url属性所指定的地址,执行类似<jsp:forward>这个JSP标准标签的功能,将访问请求转发到其他资源;或执行response.sendRedirect()方法的功能,将访问请求重定向到其他资源
格式:
语法1,没有标签体的情况:
<c:redirect url="value" [context="context"] />
语法2,有标签体的情况,在标签体中指定重定向时的参数:
<c:redirect url="value" [context="context"]>
<c:param>subtags
</c:redirect>