JSTL核心库常用标签

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>自动会将< > ' "和 & 转换为 &lt; &gt; &#039; &#034; 和&amp;

若不想转换,只需要设<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添加请求参数,并对参数中的特殊字符进行正确处理的编码.例如空格将被编码为"+".

 

你可能感兴趣的:(jstl)