首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

基准标签库(JSTL)_李晖晖的个人总结(第十三次课)

2012-12-16 
标准标签库(JSTL)_李晖晖的个人总结(第十三次课)准备实验环境本章中所有的例子程序都在名为JSTL的WEB应用

标准标签库(JSTL)_李晖晖的个人总结(第十三次课)

准备实验环境

本章中所有的例子程序都在名为JSTL的WEB应用程序中运行,使用的Tomcat服务器版本为Tomcat5.5。为了简化代码和突出重点,本章中所有的JSP网页文件的例子程序都省略了<html>、<head>、<title>、<body>等HTML全局架构标签。本章中用于描述标签的语法的各种符号的意义如下:

 […]:表示方括号中的内容是可选的; {option1|option2|option3|…}:表示花括号中用“|”字符分隔的各个选项不能同时出现,只能出现其中的一项; 如果属性的值字体加粗,表示这个值是对应属性的默认值;

如果属性的值用斜体字表示,表示该属性可以是表达式;如果标签体的内容用斜体字表示,表示标签体的内容可以是JSP代码。

为了本章后面讲解的方便,这里先创建一个名为UserBean的JavaBean程序,如例程8-1所示。

例程 8-1  UserBean.java 


<c:out>标签标签有两种语法格式:

语法1,没有标签体的情况:

<c:out value="value" 

[escapeXml="{true|false}"]

  [default="defaultValue"] />

语法2,有标签体的情况,在标签体中指定输出的默认值:

<c:out value="value" 

  [escapeXml="{true|false}"] >

default value

</c:out>

<c:out>标签的属性说明如表8.3所示。

表8.3  <c:out>标签的属性

属性名

是否支持EL

属性类型

属 性 描 述

value

true

Object

指定要输出的内容

escapeXml

true

Boolean

指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出。默认值为true

default

true

Object

指定如果value属性的值为null时所输出的默认值

当且仅当value属性的值为null时,<c:out> 标签输出默认值;如果没有指定默认值,默认为空字符串。<c:out> 标签的标签体的内容用于指定输出的默认值,如果value属性的值不为null,即使标签体部分不为空,标签体的内容也不会被输出。如果value属性不是指向一个java.io.Reader对象,<c:out> 标签将调用这个对象的toString方法,然后输出获得的字符串内容。如果value属性指向一个java.io.Reader对象,<c:out> 标签将从这个Reader对象中读取数据后进行输出,当有大量数据要被输出时,将这些数据以Reader对象的形式提供给<c:out>标签进行输出,将会极大提高系统性能。当采用escapeXml属性的默认设置值true时,<c:out>标签将对要输出的特殊字符按表8.2进行转换;如果将escapeXml属性设置为false,<c:out>标签将不对要输出的特殊字符进行转换,而是直接输出这些特殊字符。

例程8-3是<c:out> 标签的一个演示例子程序。

例程8-3  c_out1.jsp 


例程8-4和例程8-5是两个用于演示<c:out>标签的escapeXml属性的例子程序,例程8-4没有设置escapeXml属性,例程8-5将escapeXml属性设置为了false。

例程8-4  c_out2.jsp


基准标签库(JSTL)_李晖晖的个人总结(第十三次课)

图8.3 

<c:set>标签

<c:set>标签用于设置各种Web域中的属性,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。<c:set>标签有四种语法格式:

语法1,使用value属性设置指定域中的某个属性的值:

<c:set value="value"

var="varName"

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

语法2,在标签体中设置指定域中的某个属性的值:

<c:set var="varName"

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

body content

</c:set>

语法3,使用value属性设置Web域中的一个属性对象的某个属性:

<c:set value="value" 

target="target" 

property="propertyName" />

语法4,在标签体中设置Web域中的一个属性对象的某个属性性:

<c:set target="target" 

property="propertyName">

body content

</c:set>

<c:set>标签的属性说明如表8.4所示。

表8.4 <c:set>标签的属性

属性名

是否支持EL

属性类型

属 性 描 述

value

true

Object

用于指定属性值

var

false

String

用于指定要设置的Web域属性的名称

scope

false

String

用于指定属性所在的Web域

target

true

Object

用于指定要设置属性的对象,这个对象必须是JavaBean对象或java.util.Map对象

property

true

string

用于指定当前要为对象设置的属性名称

如果使用第1种语法格式时的value属性值为null,或者使用第2种语法格式时的标签体内容为空,<c:set>标签将从scope属性指定的域范围中删除var属性指定的属性。

在第3种语法格式和第4语法格式中,如果target属性的值是java.util.Map对象,property属性表示该Map对象的关键字,如果Map对象没有指定的关键字,就给Map对象增加指定的关键字;如果target属性的值是JavaBean对象,property属性表示JavaBean对象的属性,如果value的类型与JavaBean属性的类型不匹配时,会根据EL的转换规则自动进行转换。当使用第3种语法格式或第4种语法格式时,如果target属性的值为null(即target属性指定的对象不存在),或者target属性的值是一个JavaBean对象,但该JavaBean中不存在property属性指定的属性,<c:set>标签将抛出异常。如果使用第3种语法格式时value属性的值为null,或者使用第4种语法格式时标签体的内容为空,如果target属性的值是一个java.util.Map对象,就从Map对象中删除property属性指定的关键字对应的项;如果target属性的值是一个JavaBean对象,就将JavaBean的相应属性的值设置为null。

例程8-6是使用<c:set>标签设置某个Web域中的属性的一个演示例子程序。

例程8-6 c_set1.jsp


图8.4

例程8-7是使用<c:set>标签设置UserBean对象和Map对象的属性的一个演示例子程序。

例程8-7  c_set2.jsp


<c:remove>标签

<c:remove>标签用于删除各种Web域中的属性,其语法格式如下:

<c:remove var="varName" 

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

var属性用于指定要删除的属性的名称,scope属性用于指定要删除的属性所属的Web域,它们的值都不能接受动态值。如果没有指定scope属性,<c:remove>标签就调用PageContext.removeAttribute(varName)方法,否则就调用PageContext.removeAttribute(varName, scope) 方法。<c:remove>与<c:set>标签第一种语法格式的value属性值为null时的作用相同。

例程8-8是使用<c:remove>标签的一个演示例子程序。

例程8-8 c_remove.jsp

<c:catch>标签

<c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:

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

nested actions

</c:catch>

var属性用于标识<c:catch>标签捕获的异常对象,其值是一个静态的字符串,不支持动态属性值。<c:catch>标签将捕获的异常对象以var指定的名称保存到page这个Web域中,如果没有指定var属性,则<c:catch>标签仅捕获异常,不在page域保存异常对象。如果<c:catch>标签体中的内容没有抛出异常,<c:catch>标签将从page域中删除var属性指定的属性。

<c:catch>标签可以捕获任何标签抛出的异常,并且可以同时处理多个标签抛出的异常,这样,可以对JSP页面的异常进行统一处理,显示给用户一个更友好的页面。JSP处理异常的通用机制是出现重要异常后跳转到错误处理页面,建议尽量不要用<c:catch>标签来代替JSP的错误处理机制,只对一些次要异常才使用<c:catch>标签进行捕获处理。

例程8-9是使用<c:catch>标签进行异常捕获处理的一个演示例子程序。

例程8-9  c_catch.jsp

<c:if>标签

JSP页面的显示逻辑中也经常需要进行条件判断,<c:if>标签可以构造简单的“if-then”结构的条件表达式,如果条件表达式的结果为真就执行标签体部分的内容。<c:if>标签有两种语法格式:

语法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>

<c:if>标签的属性说明如表8.5所示。

表8.5   <c:if>标签的属性

属性名

是否支持EL

属性类型

属 性 描 述

test

true

boolean

决定是否处理标签体中的内容的条件表达式 

var

false

String

用于指定将test属性的执行结果保存到某个Web域中的某个属性的名称

scope

false

String

指定将test属性的执行结果保存到哪个Web域中

对于语法2,如果指定了<c:if>标签的scope属性,则必须指定var属性。

例程8-10是使用<c:if>标签的一个演示例子程序。

例程8-10  c_if.jsp 


<c:choose>标签

<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。

<c:choose>标签没有属性,在它的标签体内只能嵌套一个或多个<c:when>标签和0个或一个<c:otherwise>标签,并且同一个<c:choose>标签中的所有<c:when>子标签必须出现在<c:otherwise>子标签之前。如果<c:choose>标签内嵌套一个<c:when>标签和<c:otherwise>标签,就相当于“if-else”的条件判断结构;如果<c:choose>标签内嵌套多个<c:when>标签和一个<c:otherwise>标签,就相当于“if-else if-else”标签。

<c:when>标签只有一个test属性,该属性的值为布尔类型。test属性支持动态值,其值可以是一个条件表达式,如果条件表达式的值为true,就执行这个<c:when>标签体的内容。<c:when>标签体的内容可以是任意的JSP代码。<c:otherwise>标签没有属性,它必须作为<c:choose>标签的最后分支出现。

当JSP页面中使用<c:choose>标签时,嵌套在<c:choose>标签内的test条件成立的第一个<c:when>标签的标签体内容将被执行和输出。当且仅当所有的<c:when>标签的test条件都不成立时,才执行和输出<c:otherwise>标签的标签体内容。如果所有的<c:when>标签的test条件都不成立,并且<c:choose>标签内没有嵌套<c:otherwise>标签,则不执行任何操作。

例程8-11是使用<c:choose>、<c:when>、<c:otherwise>标签的一个演示例子程序。

例程8-11 c_choose.jsp 

基准标签库(JSTL)_李晖晖的个人总结(第十三次课)


例程8-12是一个综合使用<c:if>标签和<c:choose>等标签的例子程序,在这个例子程序中,首先使用<c:if>标签判断表单提交的方式是否是POST,如果是,就再使用<c:choose>等标签根据表单提交的内容进行不同的处理。

例程8-12  c_customLogic.jsp

基准标签库(JSTL)_李晖晖的个人总结(第十三次课)

<c:forEach>标签

JSP页面的显示逻辑中也经常需要对集合对象进行循环迭代操作,<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>

<c:forEach>标签的属性说明如表8.6所示。

表8.6  <c:forEach>标签的属性

属性名

是否支持EL

属性类型

属 性 描 述

var

false

String

指定将当前迭代到的元素保存到page这个Web域中的属性名称

items

true

任何支持的类型

将要迭代的集合对象

varStatus

false

String

指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称

begin

true

int

如果指定items属性,就从集合中的第begin个元素开始进行迭代,begin的索引值从0开始编号;如果没有指定items属性,就从begin指定的值开始迭代,直到end值时结束迭代

end

true

int

参看begin属性的描述

step

true

int

指定迭代的步长,即迭代因子的迭代增量

在使用<c:forEach>标签时,需要注意如下几点说明:

如果指定begin属性,其值必须大于或等于零;如果指定步长(step属性),其值必须大于或等于1;如果items属性的值为null,则要处理的集合对象为空,这时不执行迭代操作;如果指定的begin属性的值大于或等于集合对象的长度,不执行迭代操作;如果指定的end属性的值小于begin属性的值,不执行迭代操作;

<c:forEach>标签的items属性的值支持下面的数据类型:

任意类型的数组java.util.Collectionjava.util.Iteratorjava.util.Enumerationjava.util.MapString

items属性还支持与数据库有关的数据类型java.sql.ResultSet(包括javax.sql.RowSet),这些数据类型将在8.5 节的数据库标签中进行介绍。对字符串的迭代操作通常使用<c:forTokens>标签或JSTL函数,例如fn:split和fn:jion,JSTL函数将在8.7节进行介绍。

1.迭代Collection类型的集合对象

例程8-13是使用<c:forEach>标签迭代Collection类型的集合对象的一个应用举例。

例程8-13  c_forEach_collection.jsp



2.迭代Map对象

使用<c:forEach>标签迭代Map类型的集合对象时,迭代出的每个元素的类型为Map.Entry,Map.Entry代表Map集合中的一个条目项,其中的getKey()方法可获得条目项的关键字,getValue()方法可获得条目项的值。

EL中的requestScope隐含对象代表request作用域中的所有属性的Map对象,所以我们可以使用<c:forEach>标签迭代输出EL中的requestScope隐含对象中的所有元素,如例程8-14所示。

例程8-14 c_forEach_map.jsp

3.迭代指定的次数

<c:forEach>标签可以按指定的次数重复迭代执行标签体中的内容,使用这种方式迭代时,可以指定迭代的步长。例程8-15中分别演示了指定迭代步长和没有指定迭代步长的情况。

例程8-15 c_forEach_count.jsp


4.指定迭代集合对象的范围和步长

<c:forEach>标签迭代集合类对象时,也可以指定迭代的范围和步长,如例程8-16所示。

例程8-16 c_forEach_col.jsp

5.获取迭代的状态信息

不管是迭代集合对象,还是迭代指定的次数,在迭代时都可以获得当前的迭代状态信息。<c:forEach>标签可以将代表当前迭代状态信息的对象保存到page域中,varStatus属性指定了这个对象保存在page域中的属性名称。代表当前迭代状态信息的对象的类型为javax.servlet.jsp.jstl.core.LoopTagStatus,从JSTL规范中可以查看到这个类的详细信息,其中定义了如下一些方法:

public java.lang.Integer getBegin()返回为标签设置的begin属性的值,如果没有设置begin属性则返回nullpublic int getCount()返回当前已循环迭代的次数public java.lang.Object getCurrent()返回当前迭代到的元素对象public java.lang.Integer getEnd()返回为标签设置的end属性的值,如果没有设置end属性则返回nullpublic int getIndex()返回当前迭代的索引号public java.lang.Integer getStep()返回为标签设置的step属性的值,如果没有设置step属性则返回nullpublic boolean isFirst()返回当前是否是第一次迭代操作public boolean isLast()返回当前是否是最后一次迭代操作

例程8-17是一个获取迭代状态信息的例子程序。

例程8-17 c_forEach_col2.jsp


6.与条件标签结合使用

迭代标签可以与条件标签结合使用,对数据进行有条件的迭代,应用举例如例程8-18所示。

例程8-18 c_forEach_com.jsp

<c:forTokens>标签

<c:forTokens>标签专门用于实现类似java.util.StringTokenizer类的迭代功能,但它是以单个字符作为分隔符,同时可以指定多个字符作为多个并行的分隔符。<c:forTokens>标签的语法格式如下:

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

[var="varName"]

[varStatus="varStatusName"]

[begin="begin"] [end="end"] [step="step"]>

body content

</c:forTokens>

<c:forTokens>标签的属性说明如表8.7所示。

表8.7  c:forTokens

属性名

是否支持EL

属性类型

属 性 描 述

var

false

String

指定将当前迭代出的子字符串保存到page这个Web域中的属性名称

items

true

String

将要迭代的字符串

delims

true

String

指定一个或多个分隔符

varStatus

false

String

指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称,代表当前迭代的状态信息的对象的类型为javax.servlet.jsp.jstl.core.LoopTagStatus,从JSTL规范中可以查看这个类的详细信息

begin

true

int

指定从第begin个子字符串开始进行迭代,begin的索引值从0开始编号

end

true

int

指定迭代到第begin个子字符串,begin的索引值从0开始编号

step

true

int

指定迭代的步长,即每次迭代后的迭代因子增量

在使用<c:forTokens>标签时,需要注意如下几点说明:

如果指定begin属性,其值必须大于或等于零。如果指定步长(step属性),其值必须大于或等于1。如果指定的end属性的值小于begin属性的值,不执行迭代操作。

例程8-19是一个使用<c:forTokens>标签的例子程序。

例程8-19 c_forTokens.jsp

URL相关的标签概述

JSTL核心标签库中提供了如下一些与URL操作相关的标签:

<c:import><c:url><c:redirect><c:param>

在举例讲解上面的某些标签时,要引用另外一个JSP文件,这里先创建好这个JSP文件,如例程8-20所示。

例程8-20 register.jsp



<c:url>标签

<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面,详细细节请参看笔者编著的《深入体验java Web开发内幕——核心基础》一书中的第7.4.8的讲解。<c: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>

<c:url>标签的属性说明如表8.9所示。

表8.9  <c:url>标签的属性

属性名

是否支持EL

属性类型

属 性 描 述

value

true

String

指定要构造的URL

context

true

String

当要使用相对路径导入同一个服务器下的其他WEB应用程序中的URL地址时,context属性指定其他WEB应用程序的名称

var

false

String

指定将构造出的URL结果保存到Web域中的属性名称

scope

false

String

指定将构造出的URL结果保存到哪个Web域中

value属性所指定的URL可以是相对路径和绝对路径,其具体细节与8.3.12节的<c:import>标签的url属性的细节相同。使用<c:url>标签构造URL时,可以通过嵌套的<c:param>标签指定参数,或在value属性中直接指定参数。

例程8-21是一个使用<c:url>标签的例子程序。

例程8-21 c_url.jsp

在<c:import>标签中使用相对路径导入其他资源时,其工作原理与<jsp:include>标签相同,所以,在被导入的资源文件中可以获得传递给当前JSP页面的请求参数,例如,例程8-23中的第一个<c:import>标签并没有在目标url后增加country参数,但是,在register.jsp页面中获得了country参数。

<c:redirect>标签

<c:redirect>标签用于将当前的访问请求转发或重定向到其他资源,它可以根据url属性所指定的地址,执行类似<jsp:forward>这个JSP标准标签的功能,将访问请求转发到其他资源;或执行response.sendRedirect()方法的功能,将访问请求重定向到其他资源。<c:redirect>标签有两种语法格式:

语法1,没有标签体的情况:

<c:redirect url="value" [context="context"] />

语法2,有标签体的情况,在标签体中指定重定向时的参数:

<c:redirect url="value" [context="context"]>

<c:param>subtags

</c:redirect>

<c:redirect>标签的属性说明如表8.11所示。

表8.11  <c:redirect>标签的属性

属性名

是否支持EL

属性类型

属 性 描 述

url

true

String

指定要转发或重定向到的目标资源的URL地址

context

true

String

当要使用相对路径重定向到同一个服务器下的其他WEB应用程序中的资源时,context属性指定其他WEB应用程序的名称

url属性指定将要重定向的资源的URL时,可以使用相对路径和绝对路径,其具体细节与<c:import>标签的url属性相同。例程8-24是一个使用<c:redirect>标签的应用例子。

例程8-24 c_redirect.jsp

热点排行