Jerome Kwok〖旧日的足迹〗

仁者不忧,知者不惑,勇者不惧
posts - 0, comments - 0, trackbacks - 0, articles - 81
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JSTL核心库使用详解

Posted on 2008-10-09 17:33 Jerome Kwok 阅读(473) 评论(0)  编辑  收藏 所属分类: Java EE

关键词:Java 标准标签库( Java Standard Tag Libraries, JSTL

1 JSTL概述

JSTL是著名开源项目Jakarta Taglibs Projecthttp://jakarta.apache.org/taglibs/index.html)的研究成果,JSTLJSP页面开发者提供了最通用的标签。功能主要包括通用编程逻辑封装、数据库相关操作、XML相关操作、国际化相关操作以及其他内容,并随着越来越多的人的开发和使用,将进一步提供更多的功能。目前,JSTL主要包含在两个包中:stl.jarstandard.jar,其中在standard.jar包的/META-INF子目录下包含了相应的所有TLD文件,根据功能分为c*.tldfmt*.tldx*.tldsql*.tldpermittedTaglibs.tldscriptfree.tldJSTL1.1版本中由于增加了常用函数库标签,所有还包括一个fn.tld。这些TLD文件是根据标签功能来划分的,各自对应的功能很明显。需要补充说明的是permittedTaglibs.tldscriptfree.tldpermittedTaglibs.tld对应的是标签验证功能的,即定义了JSP页面可以使用哪些标签;而scriptfree.tld对应的是JSP页面验证功能的,它实现了更严格的JSP页面内容验证,可以验证页面是否可以包含形如“<%! declarations %>”的java声明、形如“<%  scriptlets %>”的Java代码段以及形如<% =expressions %>Java表达式。

2 JSTL使用步骤

JSTL1.0的使用要求JSP1.2或以上Web容器,JSTL1.1的使用要求JSP2.0Web容器,目前Tomcat5.x支持JSP2.0

1.0版本为例,JSTL的使用应该遵循以下步骤(假如只使用核心库,要使用其他部分可以依此类推):

1、              c-1_0.tldc-1_0-rt.tld拷到"WEB-INF子目录下,将jstl.jarstandard.jar拷贝到"WEB-INF "lib子目录

2、              web.xml中加入如下语句:

<taglib>

    <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>

    <taglib-location>/WEB-INF/c-1_0.tld</taglib-location>

  </taglib>

  <taglib>

    <taglib-uri>http://java.sun.com/jstl/core-rt</taglib-uri>

    <taglib-location>/WEB-INF/c-1_0-rt.tld</taglib-location>

  </taglib>

3、              根据是否需要EL支持(关于EL的详细内容,可以参考《taglib技术指导书-入门篇》和JSTL规范)在需要使用标签的页面上加入<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><%@ taglib prefix="c-rt" uri="http://java.sun.com/jstl/core-rt" %>。如果需要同时使用,在页面上把上述两条指令都加上就可以了。

(根据试验,使用JSTL时,在JSP2.0容器中好像不需要在web.xml中定义taglib了)

3 JSTL核心库标签详解

JSTL核心库主要包括以下几类:实现变量定义、内容输出等功能的一般标签、实现分支结构的标签、实现迭代功能的标签和实现其他一些通用功能的标签。本文重点描述前三类的使用方法,同时在描述时约定:[]表示可选,下划线表示默认值;属性列表中的Dyn字段表示该属性值是否允许动态指定。

3.1 一般标签

一般标签包括:<c:out><c:set><c:remove><c:catch>

<c:out>

实现类似于<%=expr%>的功能。

语法:

<c:out value=”value” [escapeXml=”{true|false}”]>

[default=”defaultValue”] />

<c:out value=”value” [escapeXml=”{true|false}”]>

default value

</c:out>

属性列表:

Name

Dyn

Type

Description

value

true

Object

指定被求值的表达式字符串。如果指定的是静态字符串则原样输出;如果指定的是一个表达式,而且求值结果为null或者表达式求值失败则输出default中指定的字符串;如果表达式求值失败,而且没有指定default,则抛出异常。

escapeXml

true

boolean

是否将求值结果中的诸如<,>,&,’,”之类的特殊字符转换为其对应的字符编码输出。

default

true

Object

表达式求值的结果为null时或者表达式求值失败时的默认输出

 

<c:set>

实现在指定范围内的变量定义功能。

语法:

<c:set value=”value

var=”varName” [scope=”{page|request|session|application}”]/>

<c:set var=”varName” [scope=”{page|request|session|application}”]>

body content

</c:set>

属性列表:

Name

Dyn

Type

Description

value

true

Object

指定被求值的表达式字符串,如果求值结果为null,则自动清除在指定的scope范围内由var定义的变量,否则将求值结果赋给var属性定义的变量名,如果没有指定value属性,则将body content的内容赋给var属性定义的变量名。

var

false

String

变量名

scope

false

String

所定义变量的有效范围:page|request|session|application中的一个

 

<c:remove>

清除指定范围内的变量定义

语法:

<c:remove var=”varName”

[scope=”{page|request|session|application}”]/>

属性列表:

Name

Dyn

Type

Description

var

false

String

指定要去除的变量名,如果没有指定scope,调用PageContext.removeAttribute(varName)清除变量,如果指定了,则调用PageContext.removeAttribute(varName, scope)清除。

scope

false

String

指定查找范围:page|request|session|application中的一个

 

<c:catch>

用于捕获其内嵌自定义标签抛出的异常。使用

语法:

<c:catch [var=”varName”]>

nested actions

</c:catch>

属性列表:

Name

Dyn

Type

Description

var

false

String

将出错异常保留在一个变量中,该变量范围只能是page,如果不定义该属性,则<c:catch>不保留异常信息

 

3.2 分支标签

分支标签包括:<c:if><c:choose><c:when><c:othewise>

<c:if>

实现单分支结构。

语法:

<c:if test=”testCondition

var=”varName” [scope=”{page|request|session|application}”]/>

<c:if test=”testCondition

[var=”varName”] [scope=”{page|request|session|application}”]>

body content

</c:if>

属性列表:

Name

Dyn

Type

Description

test

true

c: boolean or Boolean

c_rt: boolean

条件表达式。为真才对body content求值

var

false

String

可以将表达式求值的结果(Boolean型)保存到指定的变量中

scope

false

String

定义变量名的范围,varscope属性必须同时指定

 

<c:choose>

<c:otherwise>以及<c:when>联合起来实现多分支结构,相当于switch,其中包含空白、一个或多个<c:choose> 标签、0个或1<c:otherwise>标志。

语法:

<c:choose>

body content (<when> and <otherwise> subtags)

</c:choose>

属性列表:无

<c:when>

<c:otherwise>以及<c:choose>联合起来实现多分支结构,必须是<c:choose>的子标签

语法:

<c:when test=”testCondition”>

body content

</c:when>

属性列表:

Name

Dyn

Type

Description

test

true

boolean or Boolean (c)

boolean (c_rt)

条件表达式

 

<c:otherwise>

<c:when>以及<c:choose>联合起来实现多分支结构,必须是<c:choose>的子标签,必须是整个分支中最后一个。

语法:

<c:otherwise>

conditional block

</c:otherwise>

属性列表:无

<c:choose><c:when><c:otherwise>三者经常采用如下方式联合使用:

<c:choose>

    <c:when test="testCondition">

      body content1

    </c:when>

    <c:when test="testCondition">

      body content2

    </c:when>

    <c:otherwise>

      body content3

    </c:otherwise>

  </c:choose>

相当于实现

switch(choic)

{

  case 1:

...

break;

  case 2:

...

break;

default:

...

break;

}

3.3 迭代标签

分支标签包括:<c:forEach><c:forToken>

<c:forEach>

实现循环功能。

语法:

<c:forEach [var=”varName”] items=”collection

[varStatus=”varStatusName”]

[begin=”begin”] [end=”end”] [step=”step”]>

body content

</c:forEach>

<c:forEach [var=”varName”]

[varStatus=”varStatusName”]

begin=”begin” end=”end” [step=”step”]>

body content

</c:forEach>

属性列表:

Name

Dyn

Type

Description

var

false

String

用于保存当前迭代item的变量,其可见范围仅限于该标签主体中,其类型取决于所迭代对象的类型

items

true

Arrays

Collection

Iterator

Enumeration

Map

String

迭代对象

varStatus

false

String

用于保存当前迭代状态的变量,该变量保存的对象是

javax.servlet.jsp.jstl.core.LoopTagS

tatus. 其可见范围同样仅限于该标签主体中

begin

true

int

如果指定了items属性,则begin代表items的起始位置,默认起始位置是0,如果没有指定items属性,begin就代表当前的起始迭代值。必须>=0

end

true

int

如果指定了items属性,则end代表items的结束位置,默认起始位置是0,如果没有指定items属性,end就代表当前的结束迭代值。必须>=begin

step

true

int

迭代步长。必须>1

 

<c:forTokens>

专门针对String列表的迭代标志,可以自定义字符串间的分隔符。

语法:

<c:forTokens items=”stringOfTokens” delims=”delimiters

[var=”varName”]

[varStatus=”varStatusName”]

[begin=”begin”] [end=”end”] [step=”step”]>

body content

</c:forEach>

属性列表:

Name

Dyn

Type

Description

var

false

String

用于保存当前迭代item的变量,其可见范围仅限于该标签主体中,其类型取决于所迭代对象的类型

items

true

String

迭代对象:用delims属性指定的分隔符字符串分隔的StringTokenizer 实例

delims

 

true

 

String

 

分隔符

 

varStatus

false

String

用于保存当前迭代状态的变量,该变量保存的对象是

javax.servlet.jsp.jstl.core.LoopTagS

tatus. 其可见范围同样仅限于该标签主体中

begin

true

int

代表当前的起始迭代值。必须>=0

end

true

int

当前的结束迭代值。必须>=begin

step

true

int

迭代步长。必须>1