JSTL是标准标签库,但它是通过多个标签库来暴露其行为的。JSTL标签可以分为5类区域。
在jsp页面中使用JSTL库,必须通过·以下格式使用taglib指令:
<%@ taglib uri="uri" prefix="prefix" %>
例如,要使用Core库, 必须在JSP页面的开头处做以下声明:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
这个前缀是任意的,但是,采用惯例会使团队其它的开发人员以后后续加入该项目的其他人员容易熟悉这些代码。
out标签
out标签在运算时,是将结果输出到当前的JspWriter.out的语法有两种形式,即有body content 和没有 body content.
<c:out value="value" [escapeXml="{true|false}"] [defaulr="defaultValue"]/>
<c:out value="value" [escapeSml="{true|false}"]>
defaultValue
c:out>
属性 | 类型 | 描述 |
---|---|---|
value*+ | 对象 | 要计算的表达式 |
escapeXml+ | 布尔 | 表示结果中的字符<、>、&、和将被转化成相应 的实体码,如<转移成lt;等等。 |
default+ | 对象 | 默认值 |
例如,下列的out标签将输出有界变量X的值:
out value="${x}"/>
默认情况下,out会将特殊字符<、>、’、”和&分别编写成他们相应的字符实体码<、>、';、";、和& amp;。
在jsp2.0版之前,out标签是用于输出有界对象值最容易的方法。在jsp2.0及最高的版本中,除非需要对某个值进行XML转义u,否则可以放心的使用EL表达式:&{x}
警告:如果包含一个或多个特殊字符的字符串没有进行XML转义,它的值就无法在浏览器中正常显示。此外,没有通过转义的特殊字符,会使网站易于遭受交叉网站的脚本攻击。例如,别人可以对它post一个能够自动执行的javascript函数/表达式。
利用set标签,可以完成以下工作:
1.创建一个字符串和一个引用该字符串的有界变量。
2.创建一个引用现存有界对象的有界变量。
3.设置有界对象的属性。
属性 | 类型 | 描述 |
---|---|---|
value+ | 对象 | 要创建的字符串,或者要引用的有界对象,或者新的属性值 |
var | 字符串 | 要创建的有界变量 |
scope | 字符串 | 新创建的有界变量的范围 |
target | 对象 | 其属性要被赋新值的有界对象;这必须是一个JavaBean实例或者java.util.Map对象 |
property+ | 字符串 | 要被赋新值的属性名称 |
set标签语法的4种形式。
提醒:[]表示可有可无的属性,如果没有按默认情况。
1.用于创建一个有界变量,并用value属性在其中定义一个创建的字符串或者现存有界对象。
set value="value" var="varName" [scope={page|request|session|application}"]/>
例如下面set标签创建了字符串”The wisest fool“,并将他付给新创建的页面范围变量foo.
set var="foo" value="The wisest fool"/>
2.第二种形式与第一种形式类似,只是要创建的字符串或者要引用的有界对象是作为body content赋值的。
<c:set var="vatName" [scope={page|request|session|application}"]>
body content
c:set>
3.第三种是设置有界对象的属性值。target属性定义有界对象,以及有界对象的property属性。对该属性的赋值是通过value属性进行的。
set target="target" property="propertyName" value="value"/>
例如,下面的set标签是将字符串”Tokyo”赋予有界对象address的city属性。
set target="${address}" property="city" value="Tokyo"/>
4.第四种形式与第三种形式相似,只是赋值是作为body content来玩成的。
set terget="${address}" property="city">
Beijing
set>
remove标签用于删除有界变量,其语法如下:
<c:remove var="varName" [scope="{}"]/>
注意,有界变量引用不能删除。因此,如果另一个有界对象也引用了同一个对象,任然可以通过另一个有界对象访问该对象。
remove属性表
属性 | 类型 | 描述 |
---|---|---|
var | 字符串 | 要删除的有界变量的名称 |
scope | 字符串 | 要删除有界变量的范围 |
举个例子,下面的remove标签就是删除了页面范围的变量job。
<c"remove var="job" scope="page"/>
JSTL中执行条件行为的有4个标签,即if、choose、when和otherwise标签。
if标签是对某一个条件进行测试,假如果为True,就处理它的body content。测试结果保存在Boolean对象中,并创建有界变量来引用这个Boolean对象。利用var属性和scope属性别定义有界变量的名称和范围。
if的语法有两种形式。第一种形式没有body content。
if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
if在这种情况下,var定义的有界对象一般是通过其他标签在同一个JSP的后续阶段再进行测试。
第二种形式中使用了一个body content.
if test="testCondition" [var="varName"]
[scope="{page|request|session|application}">
body content
if>
属性 | 类型 | 描述 |
---|---|---|
test+ | 布尔 | 决定是否处理任何现有body content的测试条件 |
var | centered | 引用测试条件值的有界变量名称;var的类型为Boolean |
scope | 字符串 | var定义有界变量的范围 |
例子
if test="&{param.user == 'ken' && param.password == 'blackcomb'}">
You logged in successfully.
if>
else>
Login failed.
else>
choose和when标签的作用于Java中的关键字switch 和 case比较类似。也就是说,他们是用于相互排斥的条件执行提供上下文的。choose标签中必须嵌入一个或者多个when标签,并且每一个when标签都表示一种计算器可以计算和处理的情况。otherwise标签默认的条件块,当上面的when标签没有一个符合为true时,他就会处理。
例子
<c:choose>
<c:when test="${param.status == 'full'}">
You are a full nenber.
c:when>
<c:when test="$param.status == 'student'">
You are a student member.
c:when>
Please register.
<c:otherwise>
c:ptherwise>
c:choose>
forEach标签
标签会无数次地反复遍历body content或者对象集合。可以被遍历的对象包括java.util.Collection和java.util.Map的所有实现,以及对象数组或者主类型。也可以遍历java.util.Iterator和java.util.Enumeration,但不应该在多个行为中使用Itrator或者Enumeration。
forEach标签的语法有两种形式。第一种形式是固定次数的重复body content。
forEach [var = "varName"] begin="begin" end="end" step="step">
body content
forEach>
第二种形式用于便利对象集合。
<c:forEach itam="collection" [var="varName"]
[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
body content
c:forEach>
forEach标签的属性
属性 | 类型 | 描述 |
---|---|---|
var | 字符串 | 应用遍历的当前项目的有界变量名称 |
items | 支持的任意类型 | 遍历的对象集合 |
varStatus | 字符串 | 保存遍历状态的有界变量名称。类型值为javax.servlet.jsp.jstl.core.LoopTagStatus |
begin+ | 整数 | 如果指定items,遍历将从指定索引处的项目开始,例如,集合中第一个项目的索引为0.如果没有指定的items,遍历将从设定的索引值开始。如果指定,begin的值必须大于或等于0 |
end+ | 整数 | 如果指定items, 遍历将在(含)指定索引的项目结束。如果没有指定items,遍历将在索引达到指定值时结束 |
step+ | 整数 | 遍历将只处理间隔指定step的项目,从第一个项目开始。在这种情况下,step的之必需大于或等于1 |