JSP标准标签库 —— JSTL
JSTL标签库一部分是Tag Library(标签库),另一部分是表达式语言.标签库使用XML语法来定义所以标签.主要分为5种标签.
5种标签分别指定了5个URI,并对标签库的前缀作出约定.
Core核心标签库 | c | http://java.sun.com/jsp/jstl/core | <c:out> |
I18N本地化处理标签库 | fmt | http://java.sun.com/jsp/jstl/xml | <fmt:formatDate> |
SQL数据库处理标签库 | sql | http://java.sun.com/jsp/jstl/sql | <sql:query> |
XML处理标签库 | xml | http://java.sun.com/jsp/jstl/fmt | <x:forBach> |
EL功能函数标签库 | fn | http://java.sun.com/jsp/jstl/functions | <fn:split> |
Core标签库
Core标签库主要包括了一般用途的标签,条件标签,迭代标签和URL相关标签.
在JSP页面中使用Core标签,要使用taglib指令,指定引用标签库.
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>
一、 一般用途标签
<c:out>
用于计算一个表达式并将结果输出到当前的JspWriter对象.其功能类似于<%=expression%>或${el-expression}.
(1) 语法
语法1:没有标签体
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />
语法2:有标签体
<c:out value="value" [escapeXml="{true|false}"]> default value </c:out>
(2) 属性
名称 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
被计算的表达式. |
Y |
Object |
是 |
无 |
default |
如果value的值为null,则显示default的值 |
Y |
Object |
否 |
无 |
escapeXml |
是否把结果字符串中的字符转换为对应字符引用或自定义实体 |
Y |
boolean |
否 |
true |
(3) Null 和错误处理
假若value为null,会显示default的值.假若没有设定default的值,则会显示一个空的字符串.
(4) 说明
如果属性value计算的结果不是java.io.Reader对象,那么这个结果将被强制转换为String对象,然后输出到当前的JspWriter对象.
如果计算结果是java.io.Reader对象,那么数据首先从Reader对象中读取,然后写入到当前的JspWriter对象中.
一般地,<c:out>自动会将< > ' "和 & 转换为 < > ' " 和&
若不想转换,只需要设<c:out>的escapeXml="fasle".
<c:set>
<c:set>用于设置JSP变量,并指定其范围和值,或者可以设置JavaBean的属性值。
(1) 语法
语法1:将value的值储存至varName变量中,设置其范围为scope.
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>
语法2: 将body content储存至varName变量中,设置其范围为scope.
<c:set var="varName" [scope="{ page|request|session|application }"]> body content </c:set>
语法3:将value存储至target对象的property属性.
<c:set value="value" target="target" property="propertyName" />
语法4: 将body content存储至target对象的property属性.
<c:set target="target" property="propertyName"> body content </c:set>
(2) 属性
名称 |
说 明 |
EL |
类型 |
必须 |
默认值 |
value |
要计算的表达式 |
Y |
Object |
否 |
无 |
var |
欲存入的变量名称 |
N |
String |
否 |
无 |
scope |
var的JSP范围 |
N |
String |
否 |
page |
target |
要设置属性的对象,必须是JavaBean或java.util.Map |
Y |
Object |
否 |
无 |
property |
指定target对象的属性名 |
Y |
String |
否 |
无 |
(3) Null 和错误处理
语法3和语法4在以下情况下抛出异常
1. tagget为null
2. target不是java.util.Map对象,或target是不支持setXXX方法的JavaBean对象
3. 如果value为null
语法1:由var和scope定义的范围变量将被移除.
若没有指定scope属性,那么将按照PageContext.removeAttribute(varName)方法的行为移除变量.
若指定了scope属性,那么将按照PageContext.removeAttribute(varName,scope)方法的行为移除变量.
语法3:如果target是一个Map对象,则从Map中移除property所标识的键对应的元素的值.
如果target是一个JavaBean对象,则把JavaBean的property设为null.
(4) 说明
语法1和语法2设置var和scope所标识的范围变量.
语法3和语法4如果target是Map对象,则设置与property所标识的键对应的元素的值.
如果该元素不存在,则把它加入到Map对象中,否则,设置JavaBean对象的属性的值.
<c:remove>
<c:remove>主要用来移除变量.作用与<c:set>相反.
(1) 语法
<c:remove var="varName" [scope="{ page|request|session|application }"] />
(2) 属性
名称 |
说 明 |
EL |
类型 |
必须 |
默认值 |
var |
欲移除的变量名称 |
N |
String |
是 |
无 |
scope |
var变量的JSP范围 |
N |
String |
否 |
page |
(3) 说明
<c:remove>必须要有var属性,即要被移除的属性名称,scope则可有可无.
若没有指定scope属性,那么将按照PageContext.removeAttribute(varName)方法的行为移除变量.
若指定了scope属性,那么将按照PageContext.removeAttribute(varName,scope)方法的行为移除变量.
例: <c:remove var="number" scope="session" />
将number变量从Session范围中移除.若我们不设定scope,则<c:remove>将会从Page,Request,Session及Application中顺序寻找是否存在名称为number的数据,若能找到时,则将它移除掉,反之则不会做任何的事情.
<c:catch>
<c:catch>用于捕获在其中嵌套的操作所抛出的异常对象(java.util.Throwable对象),并将异常信息储存到变量中.
(1) 语法
<c:catch [var="varName"] > nested actions </c:catch>
(2) 属性
名称 |
说明 |
EL |
类型 |
必须 |
默认值 |
var |
用来储存错误信息的变量 |
N |
String |
否 |
无 |
(3) 说明
<c:catch>主要将可能发生错误的部分放在<c:catch>和</c:catch>之间。如果发生错误,错误信息将储存至varName变量中,该变量是page范围.如果没有发生异常,而var所标识的范围变量存在,那么它将被移除.
如果没有指定var属性,异常只是简单地被捕获,异常信息不会被保存.
当错误发生在<c:catch>和</c:catch>之间时,则只有<c:catch>和</c:catch>之间的程序会被中止忽略,但整个网页不会被中止.
二、 条件标签
流程控制分类中包含四个标签:<c:if>、<c:choose>、<c:when>和<c:otherwise>,笔者依此顺序依次说明这四个标签的使用。
<c:if>
<c:if>的用途就和我们一般在程序中用的if一样。
(1) 语法
语法1:没有标签体
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
语法2:有标签体
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]> body content </c:if>
(2) 属性
名 称 |
说 明 |
EL |
类型 |
必须 |
默认值 |
test |
如果表达式的结果为true,则执行body content,false则相反 |
Y |
boolean |
是 |
无 |
var |
用来储存test运算后的结果,即true或false |
N |
String |
否 |
无 |
scope |
var变量的JSP范围 |
N |
String |
否 |
page |
(3) 约束
如果指定了scope属性,那么必须指定var属性.
(4) 说明
<c:if> 标签必须要有test属性.
当test的计算结果为true,则标签体内容将被执行;如为false,则不会执行.
对语法1,var属性必须要提供,在标签执行后,可以用保存了条件结果的范围变量做进一步判断.
<c:choose>
<c:choose>,<c:when>,<c:otherwise>一起实现了类似Java中的if / else if / else 语句.
(1) 语法
<c:choose> body content ( <when> and <otherwise> subtags) </c:choose>
(2) 属性
无
(3) 约束
<c:choose>本身只是 <c:when> 和 <c:otherwise> 的父标签.
<c:choose>的body content只能有:
空白
1或多个 <c:when>
0或多个 <c:otherwise>
<c:when>
<c:when> 是<c:choose>的子标签,表示一个可选的条件.
(1) 语法
<c:when test="testCondition" > body content </c:when>
(2) 属性
名称 |
说明 |
EL |
类型 |
必须 |
默认值 |
test |
如果表达式结果为true,则执行标签体,false则不执行 |
Y |
boolean |
是 |
无 |
(3) 约束
<c:when>标签必须有一个直接的父标签<c:choose>,而且必须在同一父标签下的<c:otherwise>之前出现.
(4) 说明
在运行时,判断<c:when>标签的测试条件是否为true,第一个测试条件为true的<c:when>标签的标签体将被执行.
<c:otherwise>
<c:otherwise>作为<c:choose>的子标签,表示最后的选择.
(1) 语法
<c:otherwise> body content </c:otherwise>
(2) 属性
无
(3) 约束
<c:otherwise> 必须在 <c:choose> 和 </c:choose>之间
在同一个 <c:choose> 中,<c:otherwise> 必须是最后的标签
(4) 说明
在运行时,如果所有 <c:when> 的test属性都不为true,则执行<c:otherwise> 的body content。
三、 迭代标签
迭代(Iterate)操作主要包含两个标签:<c:forEach>和<c:forTokens>.
<c:forEach>
<c:forEach> 用于遍历集合中的成员.重复执行<c:forEach>的body content.
(1) 语法
语法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>
(2) 属性
名称 |
说 明 |
EL |
类型 |
必须 |
默认值 |
var |
用来存放当前循环的成员 |
N |
String |
否 |
无 |
items |
被遍历的集合对象 |
Y |
数组 Collection Iterator Enumeration Map String |
否 |
无 |
varStatus |
用来存放当前循环的相关成员信息 |
N |
String |
否 |
无 |
begin |
开始的位置.集合的第一个项目的索引为0. |
Y |
int |
否 |
0 |
end |
结束的位置 |
Y |
int |
否 |
最后一个成员 |
step |
每次迭代的间隔数 |
Y |
int |
否 |
|
varStatus指定的变量类型是javax.servlet.jsp.core.LoopTagStatus.
(3) 约束
?假若指定了begin属性,则begin必须大于等于 0.
?如果指定了end属性,end必须大于begin.若end小于begin,则循环将不会执行.
?假若指定了step属性, ,step必须大于等于1.
(4) Null 和错误处理
?假若items为null,则表示为空集合,这时迭代不被执行.
(5) 说明
假若begin大于或等于items的大小,则循环不会执行.
items支持的类型:
数组,Collection,Iterator,Enumeration,Map,以","分隔的字符串值.
<c:forTokens>
<c:forTokens> 用来循环字符串中所有的成员,字符串中的成员是由定义符号(delimiters)所分隔的。
(1) 语法
<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> body content </c:forTokens>
(2) 属性
名称 |
说 明 |
EL |
类型 |
必须 |
默认值 |
var |
用来存放当前循环的成员 |
N |
String |
否 |
无 |
items |
要遍历的字符串 |
Y |
String |
是 |
无 |
delims |
分割符 |
N |
String |
是 |
无 |
varStatus |
用来存放现在指到的相关成员信息 |
N |
String |
否 |
无 |
begin |
开始的位置,字符串的一部分索引为0. |
Y |
int |
否 |
0 |
end |
结束的位置 |
Y |
int |
否 |
最后一个成员 |
step |
每次迭代的间隔数 |
Y |
int |
否 |
1 |
varStatus指定的变量类型是javax.servlet.jsp.core.LoopTagStatus.
(3) 约束
?假若有begin属性时,begin必须大于等于 0
?假若有end属性时,必须大于begin
?假若有step属性时,step必须大于等于1
假若begin大于或等于items的大小时,则迭代不运算.
(4) Null 和错误处理
?假若items为null,则表示为一空的集合对象.循环不执行.
?若delinms为null,items所表示的字符串将被看作是只由只由一个单独的整体部分组成.
(5) 说明
<c:forTokens>标签通过java.util.StringTokenizer实例来完成字符串的分隔.属性items和delims是构造StringTokenizer实例的参数.
四、 URL相关标签
JSTL包含三个与URL操作有关的标签,它们分别为:<c:import>,<c:redirect>和<c:url>.
主要的功能: 提供超链接,页面包含和重定向.
<c:import>
<c:import> 用于导入一个基于URL的资源.即把其他静态或动态文件包含至本身JSP网页.
它和JSP 动作指令的<jsp:include>最大的差别在于,<jsp:include>只能包含和自己在同一个web application下的文件;<c:import>除了能包含和自己在同一个web application的
文件外,亦可以包含不同web application或者是其他网站的文件。
(1) 语法
语法1:
<c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]> optional body content for <c:param> subtags </c:import>
语法2:资源的内容作为Reader对象被导出.
<c:import url="url" [context="context"] varReader="varReaderName" [charEncoding="charEncoding"]> body content where varReader is consumed by another action </c:import>
(2) 属性
名 称 |
说 明 |
EL |
类型 |
必须 |
默认值 |
url |
要导入资源的URL |
Y |
String |
是 |
无 |
context |
当使用相对URL来访问外部资源时,指定其上下文的名字 |
Y |
String |
否 |
无 |
var |
被导出的保存了资源内容的范围变量的名字.范围变量的类型是String |
N |
String |
否 |
无 |
scope |
var的范围 |
N |
String |
否 |
Page |
charEncoding |
导入资源内容的字符编码 |
Y |
String |
否 |
无 |
varReader |
被导出的保存了资源内容的范围变量的名字. |
N |
String |
否 |
无 |
(3) Null 和错误处理
?假若url为null或空,或无效,将抛出JspException
(4) 说明
使用语法1,导入的资源内容默认被写到当前JspWriter对象.如果指定了var属性,资源的内容将被保存到一个字符串对象中.
使用语法2,资源的内容将被保存为Reader对象.要注意的是,导出的Reader对象只能在<c:import>的开始标签和结束标签之间使用.
注意,导出的Reader对象只能在<c:import>的开始标签和结束标签之间使用.
在导入资源时,可以通过charEncoding属性设置资源内容的字符编码.
在指定导入资源的URL时,可以使用相对URL,也可使用绝对URL,有下面几种情况:
使用相对URL访问同一上下文中的资源.
处理过程和<jsp:include>动作相同.
指定的URL可以是相对于上下文的路径,URL需要以"/"开始.即Web应用程序的根路径下的资源.
也可以是相对于页面的路径. URL不需要以"/"开始. 即当前页面所在目录下的资源.
使用相对URL访问外部上下文中的资源
资源在另一个web应用程序中,该Web应用程序和当前页面所属的Web应用程序在同一个容器中.导入资源时,通过context属性来指定外部Web应用程序的上下名称.指定的URL要以"/"开
始,上下文的名字也必须以"/"开始.在这种情况下的导入,只有当前页面的请求环境对被导入的资源是可用的.
注意:要跨Web应用程序访问资源,需要在当前Web应用程序的<context>元素的设置中指定crossContext属性的值为true.
使用绝对URL
当使用绝对URL来导入资源时,当前执行环境的所有一切(如request或session)对被导入的资源都是不可以的.即使绝对URL引用的是同一个Web应用程序的资源.
因此,当前页面的请求参数将不能被传递给导入资源.这主要是因为<c:import>标签的标签处理器对相对URL和绝对URL的处理方式不同.
对相对URL,采用的是RequestDispatcher类的include()方法;
对绝对URL,采用的是java.net.URL和java.net.URLConnection类的方法.
<c:import>不仅支持HTTP协议,也支持FTP协议.
<c:url>
<c:url>使用正确的URL重写规则构造一个URL.
(1) 语法
语法1:没有标签体.
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"] />
语法2:body content代表查询字符串(Query String)参数
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"] > <c:param>subtags </c:url>
(2) 属性
名称 |
说 明 |
EL |
类型 |
必 须 |
默认值 |
value |
要处理的URL |
Y |
String |
是 |
无 |
context |
当使用的相对URL标识了一个外部资源的时候,指定其上下文的名字. |
Y |
String |
否 |
无 |
var |
被导出的保存了处理后的URL的范围变量的名字(该范围变量的类型是String) |
N |
String |
否 |
无 |
scope |
var的范围 |
N |
String |
否 |
Page |
(3) 说明
<c:url>对URL进行处理,并在需要的时候重写URL.需要注意的是,只有相对URL会被重写,所以,采用URL重写来跟踪会话,那么必须使用相对URL,链接到一个本地资源.
<c:url>可以和<c:param>一起使用,通过<c:param>为URL添加查询字符串.默认情况下,URL处理的结果将被写入到当前的JspWriter对象,如果指定了var属性,那么URL处理的结果将被保存到JSP范围变量中.
<c:redirect>
<c:redirect>将客户端的请求重新定向到另一个资源.
(1) 语法
语法1:没有body content
<c:redirect url="url" [context="context"] />
语法2:body content代表查询字符串参数
<c:redirect url="url" [context="context"] > <c:param> subtags </c:redirect >
(2) 属性
名 称 |
说 明 |
EL |
类型 |
必须 |
默认值 |
url |
重定向目标资源的URL |
Y |
String |
是 |
无 |
context |
当使用相对URL重定向到一个外部资源时,指定其上下文的名字. |
Y |
String |
否 |
无 |
(3) 说明
<c:redirect>发生一个HTTP重定向响应到客户端,中断当前页面的处理(在doEndTag()方法中返回SKIP_PAGE)
<c:redirect>遵循<c:url>同样的重写规则.
url就是设定要被导向到的目标地址,它可以是相对或绝对地址。例如:我们写成如下:
<c:redirect url="http://www.javaworld.com.tw" />
那么网页将会自动导向到http://www.javaworld.com.tw。另外,我们也可以加上context这个属性,用来导向至其他 web站台上的文件,例如:导向到/others下的/jsp/index.html时,写法如下:
<c:redirect url="/jsp/index.html" context="/others" />
<c:redirect> 的功能不止可以导向网页,同样它还可以传递参数给目标文件。在这里我们同样使用<c:param>来设定参数名称和内容。
<c:param>
<c:param>为一个URL添加请求参数.
(1) 语法
语法1:在属性value中指定参数值
<c:param name="name" value="value">
语法2:标签体中指定参数值
<c:param name="name"> paramter value </c:param>
(2) 属性
名称 |
说 明 |
EL |
类型 |
必须 |
默认值 |
name |
查询字符串参数的名字 |
Y |
String |
是 |
无 |
value |
参数的值 |
Y |
String |
否 |
无 |
(3) Null和错误处理
如果name是null或空,那么<c:param>标签什么都不做.
如果value是null,那么将作为空值处理.
(4) 说明
<c:param>作为<c:import>,<c:url>,<c:redirect>的嵌套标签使用,为URL添加请求参数,并对参数中的特殊字符进行正确处理的编码.例如空格将被编码为"+".