第5章
CHAPTER 5



JSTL标签库








JSTL(Java Server Pages Standard Tag Library)是JSP标准标签库的简称。

在早期的JSP开发中,JSP与Servlet的职责定位模糊,开发人员习惯上在JSP中做很多的逻辑工作,HTML代码与Java代码混杂,逻辑功能、控制功能、视图功能都混淆在了一起。这种开发模式给代码的开发、阅读、维护都带来很大的麻烦。

随着MVC架构的出现,Java EE中增加了JSTL标准。JSTL的目标是提供给Java Web开发人员一个标准的、通用的标签库,开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。

JSTL在本质上是提前定义好的一组标签,这些标签封装了不同的功能,在页面上调用JSTL,可以大幅减少JSP文件中的Java代码。这使Java代码与HTML代码明显分离,因此使用JSTL标签库更符合MVC设计理念。使用JSTL后,JSP可以专注于视图功能,为Java Web开发带来非常大的好处。

Eclipse集成Tomcat进行Java Web开发时,需要单独导入JSTL相关包。下载jstlimpl1.2.jar和jstlapi1.2.jar,复制到WEBINF/lib文件夹下即可使用JSTL。

JSTL 1.2包含的标签库内容见表51。


表51JSTL 1.2包含的标签库内容



功能URI前缀

核心库http://java.sun.com/jsp/jstl/corec
XML处理http://java.sun.com/jsp/jstl/xmlx
I18N格式化http://java.sun.com/jsp/jstl/fmtfmt
关系型数据库访问SQLhttp://java.sun.com/jsp/jstl/sqlsql
函数http://java.sun.com/jsp/jstl/functionsfn



注意,Java EE 8中包含的JSTL是1.2版,对应JSR52。Java EE 8对应的JSP版本是2.3。JSTL 1.2需要JSP 2.1及以上的Web容器支持。EL表达式是JSP规范的一部分,在JSTL操作中会大量使用EL,而EL是从JSP 2.0规范开始的。

本章只着重介绍几个常用标签的使用,其他内容见JSR52规范。



视频讲解


5.1自定义标签库

标签库由标签库描述文件tld(taglibrary descriptors)和标签实现类两部分组成。JSTL标签库中的所有标签与自定义标签定义方法相同。下面自定义一个作者标签,显示作者的名字和性别,通过这个案例了解JSTL标签库的定义过程。

(1) 定义标签类。

新建Web项目ETCTag,创建包com.icss.tag,定义标签类AuthorTag继承javax.servlet.jsp.tagext.TagSupport。一般会重写doEndTag()方法。


public class AuthorTag extends TagSupport{

private String name;

private String sex;

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int doEndTag() throws JspException {

JspWriter out = pageContext.getOut();

try{

out.println("<table bgColor=yellow>");

out.println("<tr>");

if(sex != null)

out.println("<td> 作者:" + name 

 + ",性别: " + sex + ",welcome you!!!</td>");

else

out.println("<td> 作者:" + name

+ ",welcome you!!!</td>");

out.println("</tr>");

out.println("</table>");

}catch(Exception ex){

ex.printStackTrace();

}

return this.EVAL_PAGE;

}

}

(2) 定义标签库描述文件etc.tld。

<taglib>的子元素<shortname>为标签库前缀。一个<taglib>下可以定义多个标签<tag>。

标签<tag>的子元素<name>为标签名,<tagclass>为标签实现类,<attribute>为标签的属性。

<attribute>属性的子元素<name>是属性名,<required>表示属性是否为必须设置,false表示可选,true表示必须设置值; <rtexprvalue>表示是否可以动态赋值,false表示只能设置静态值,true表示可以动态赋值,如可以使用Java表达式、EL表达式或<jsp:attribute>赋值。

<taglib xmlns="http://java.sun.com/xml/ns/Java EE"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/Java EE

http://java.sun.com/xml/ns/Java EE/web-jsptaglibrary_2_1.xsd"

version="2.1">

<description>etc our library</description>

<display-name>etc library</display-name>

<tlib-version>1.0</tlib-version>

<short-name>etc</short-name>

<uri>http://com.icss.tag/core</uri>

<tag>

<description>

show file author

</description>

<name>author</name>

<tag-class>com.icss.tag.AuthorTag</tag-class>

<body-content>JSP</body-content>

<attribute>

<description>

author name

</description>

<name>name</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

<attribute>

<description>

author sex

</description>

<name>sex</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

</taglib>


(3) 在JSP项目TagUse中调用自定义标签。

把AuthorTag编译成lib文件,导入JSP项目中。

把etc.tld复制到JSP项目的WEBINF下。

在JSP文件中调用自定义标签。

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<%@ taglib uri="http://com.icss.tag/core" prefix="etc"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<body>

This is author tag use sample page. <br>

<etc:author name="xiaohp"></etc:author>

<br/>

<etc:author name="xiaohp" sex="男"></etc:author>

</body>

</html>


5.2核心标签库

核心标签库前缀统一使用<c:>标识,这个标签库用处最大、用途最广。

参见jstlimpl1.2.jar/METAINF/c.tld中核心标签描述: 

<taglib>

<description>JSTL 1.2 core library</description>

<display-name>JSTL core</display-name>

<tlib-version>1.2</tlib-version>

<short-name>c</short-name>

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

</taglib>


使用标签库时,需要在JSP页面的头部用taglib指令声明,<shortname>表示标签前缀,<uri>在标签声明时需要指明。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>



视频讲解


5.2.1一般用途标签

本节介绍几个一般用途的常用标签,分别为<c:out>、<c:set>、<c:remove>,<c:catch>标签不常用,本节不做介绍。

1.  c:out

<c:out>标签与<%=脚本表达式 %> 或 ${el表达式}的功能基本一致,用于在页面输出静态或动态信息。

基本语法如下,属性信息见表52。

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

[default="defaultValue"] />



表52c:out属性信息



属性名动态支持属性类型描述

valuetrueObject要输出的表达式值
escapeXmltrueBoolean决定字符<,>、&、’,”在结果串中是否需要转义成对应的字符实体代码,默认为true。HTML转义符见表14
defaulttrueObject输出结果为null时,显示默认值


【示例51】

<p>

你有 <c:out value="${sessionScope.user.itemCount}"/> 个选项

</p>


【示例52】

当EL表达式输出为null时,可以使用<c:out>输出默认值。

所属城市: 

<c:out value="${customer.address.city}" default="未知"/>

2.  c:set

基本语法如下,属性信息见表53。

<c:set value="value"var="varName"

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



表53c:set属性信息



属性名动 态 支 持属 性 类 型描述

valuetrueObject要设置的表达式值
vartrueString存储在域对象中的变量名
scopefalseString与var对应的域对象



【示例53】

使用Java脚本计算一个随机数,然后用<c:set>标签把随机数存储到request域对象中,最后用EL表达式提取request对象中的变量r,用<c:out>输出随机数。

<body>

<%

int rand = (int)(Math.random()*100);

%>

<c:set value="<%=rand%>" var="r" scope="request" />

获取随机数: <c:out value="${r}"></c:out>

</body>

3.  c:remove

基本语法如下,属性信息见表54。

<c:remove var="varName"

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


表54c:remove属性信息



属性名动 态 支 持属 性 类 型描述
varfalseString存储在域对象中的变量名
scopefalseString与var对应的域对象


【示例54】

使用<c:remove>移除request域中存储的随机数rand。

<body>

<%

int rand = (int)(Math.random()*100);

request.setAttribute("rand", rand);

%>

获取随机数: <c:out value="${rand}"></c:out>

<br>

<c:remove var="rand" scope="request"/>

移除后随机数: <c:out value="${rand}"></c:out>

</body>



视频讲解


5.2.2条件判断标签

Java脚本中,条件判断语句有if…else、if…else if…else if…else等。JSTL的目的是简化Java脚本,因此条件判断标签必不可少。

【示例55】

<c:if test="${user.visitCount == 1}">

This is your first visit. Welcome to the site!

</c:if>


1.  c:if

条件判断标签,如果测试条件为true,显示标签体内容。标签定义如下: 

<tag>

<name>if</name>

<tag-class>org.apache.taglibs.standard.tag.rt.core.IfTag</tag-class>

<body-content>JSP</body-content>

<attribute>

<name>test</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<type>boolean</type>

</attribute>

<attribute>

<name>var</name>

<required>false</required>

<rtexprvalue>false</rtexprvalue>

</attribute>

<attribute>

<name>scope</name>

<required>false</required>

<rtexprvalue>false</rtexprvalue>

</attribute>

</tag>


基本语法如下,属性信息见表55,test为必选属性,var和scope为可选属性。

<c:if test="测试条件"

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

内容体

</c:if>



表55c:if属性信息



属性名动态支持属性类型描述

testtrueboolean测试条件返回为真,处理内容体信息,否则不处理
varfalseString把测试条件返回的布尔值结果,存储到scope对象中
scopefalseStringpage、request、session、application中的某个域对象



【示例56】

JSTL与EL标签配合使用,判断图书价格是否小于或等于100(符合预算),如是,则显示图书名称。

<c:if test="${book.price <= 100}">

The book ${book.title} fits your budget!

</c:if>

【示例57】

测试请求参数中是否有一个名字为name的参数,如果参数为空,则提示。

<c:if test="${empty param.name}">

Please specify your name.

</c:if>


【示例58】

判断随机数是否大于50,并用EL表达式输出测试结果。

<body>

<%

int rand = (int)(Math.random()*100);

pageContext.setAttribute("rand", rand);

%>

<c:if test="${rand>50}" var="aa" scope="request">

welcome you!

</c:if>

测试结果为:  ${aa}

</body>


总结: 

JSTL中只有<c:if>判断,没有else判断。如果需要if…else判断结构,可以用<c:if>标签判断两次,如<c:if test="${user==null}">和<c:if test="${user!=null}">同时使用。



2.  c:choosec:whenc:otherwise

标签<c:choose><c:when><c:otherwise>配合使用,执行效果等同于Java脚本中的条件判断语句。

(1) <c:choose>基本语法。

<c:choose>

内容体 (<when> 和 <otherwise> 子标签)

</c:choose>

<c:choose>中可以放1~n个<c:when>标签,即至少要包含一个子标签<c:when>,可以同时存在多个<c:when>子标签。

<c:choose>中可以放0~1个<c:otherwise>子标签,即可以没有<c:otherwise>子标签,最多只能有一个<c:otherwise>子标签。

(2) <c:when>基本语法。

<c:when test="测试条件">

内容体

</c:when>

test属性返回boolean值,决定内容体是否被处理。

<c:when>不能单独使用,必须要有<c:choose>父标签。

<c:when>必须要出现在<c:otherwise>标签的前面。

(3) <c:otherwise>基本语法。

<c:otherwise>

条件块

</c:otherwise>

在<c:choose>标签体内,如果没有<c:when>就返回真,则JSP容器处理<c:otherwise>中的条件块。

<c:otherwise>不能单独使用,必须要有<c:choose>父标签。

<c:otherwise>在<c:choose>体内,必须出现在最后。

【示例59】

示例效果等同于if…else if…else if…else,只要任何一个test返回真,就不再向下判断,执行内容体后,立即跳出<c:choose>。

<c:choose>

<c:when test="${user.category == 'trial'}">

...

</c:when>

<c:when test="${user.category == 'member'}">

...

</c:when>

<c:when test="${user.category == 'vip'}">

...

</c:when>

<c:otherwise>

...

</c:otherwise>

</c:choose>


【示例510】

示例效果等同于if…else。

<c:choose>

<c:when test="${count == 0}">

No records matched your selection.

</c:when>

<c:otherwise>

${count} records matched your selection.

</c:otherwise>

</c:choose>



视频讲解




视频讲解


5.2.3迭代标签c:forEach

标签<c:forEach>在JSP页面迭代输出集合中的数据,与Java脚本中的for()循环功能类似,基本语法如下,属性信息见表56。

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

 [varStatus="varStatusName"]

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

内容体

</c:forEach>



表56c:forEach属性信息




属性名动态支持属性类型描述

varfalseString迭代变量名
itemstrue参见集合说明迭代的集合对象
varStatusfalseString显示迭代状态,参见LoopTagStatus接口
begintrueint迭代操作时,集合的起始索引
Endtrueint迭代操作时,集合的结束索引
Steptrueint迭代操作的步长值


<c:forEach>说明信息: 

begin索引必须≥0。

如果end指定的索引值小于begin,则迭代不会执行。

步长值step必须≥1。

如果items集合为null,不会抛出异常,按照空集合处理,即迭代不会执行。

items支持如下集合类型: 

基本类型的静态数组(迭代时会自动使用包装类)。

java.util.Collection接口的实现类(会调用iterator()方法迭代集合)。

java.util.Iterator接口的实现类。

java.util.Enumeration接口的实现类。

java.util.Map接口实现类,var变量的类型为java.util.Map.Entry。

通用分隔符隔开的一个字符串。

1. 集合迭代

迭代静态数组、java.util.Collection、java.util.Iterator等集合对象。

【示例511】

迭代输出产品集合中的产品信息。

<c:forEach var="product" items="${products}">

产品名:  ${product.name} 价格:  ${product.price}

</c:forEach>


【示例512】

迭代输出顾客信息,并在<table>中显示。

<table>

<c:forEach var="ct" items="${customers}">

<tr><td>顾客: </td><td>${ct.name}</td></tr>

</c:forEach>

</table>


2. Map迭代

当items类型为java.util.Map时,每个item的类型是java.util.Map.Entry。它有两个属性: key 和 value。

【示例513】

<c:forEach var="entry" items="${myHashtable}">

元素key是: ${entry.key}<br>

元素value是: ${entry.value}

</c:forEach>


【示例514】

如下代码中的${entry.value}表示User对象,${entry.value.uname}表示用户名。

<body>

<%

Map map = new HashMap<String,User>();

map.put("tom", new User("tom"));

map.put("jack", new User("jack"));

map.put("rose", new User("rose"));

request.setAttribute("map",map);

%>

<table>

<c:forEach var="entry" items="${map}">

<tr>

<td>${entry.key}</td>

<td>${entry.value.uname}</td>

</tr>

</c:forEach>

</table>

</body>


【示例515】

使用嵌套<c:forEach>读取Map数据,${aParam.value}是集合对象。

<c:forEach var="aParam" items="${paramValues}">

参数名: ${aParam.key}

参数值:

<c:forEach var="aValue" items="${aParam.value}">

${aValue}

</c:forEach>

<br>

</c:forEach>


3. 迭代状态

使用varStatus显示当前迭代状态。迭代状态的操作依赖接口javax.servlet.jsp.jstl.core.LoopTagStatus,接口定义如下: 

public interface LoopTagStatus {

java.lang.IntegergetBegin();

intgetCount();

java.lang.ObjectgetCurrent();

java.lang.IntegergetEnd();

intgetIndex();

java.lang.IntegergetStep();

booleanisFirst();

booleanisLast();

}


getBegin: 返回迭代的begin属性值,如果begin属性不存在,就返回null。

getCount: 返回环绕迭代集合的当前数量。count是个相对值,从1开始。例如迭代某个集合,begin=5,end=15,step=5,则 counts 值分别为1、2、3。

getCurrent: 返回当前正在迭代的对象。

getEnd: 返回迭代的end属性值,如果end属性不存在,则返回null。

getIndex: 返回环绕迭代集合的当前索引值,索引从0开始。

getStep: 返回迭代的step属性值,如果step属性不存在,则返回null。

isFirst:如果当前的迭代项是集合的第一项,则返回true。

isLast:如何当前的迭代项是集合的最后一项,则返回true。


【示例516】

<body>

<%

int[] sz = new int[]{10,12,35,24,65};

request.setAttribute("sz",sz);

%>

<table>

<c:forEach var="item" items="${sz}" varStatus="st">

<tr>

<td>${st.count}</td>

<td>${st.index}</td>

<c:if test="${st.index%2==0}">

<td>${item}</td>

</c:if>

</tr>

</c:forEach>

</table>

</body>

输出结果如下: 

1010

21

3235

43

5465


4. 范围属性

使用属性begin、end、step,可以在迭代集合时选择部分内容处理。

【示例517】

<body>

<%

int[] sz = new int[]{10,12,35,24,65,78,102,205,12,31,20,309};

request.setAttribute("sz",sz);

%>

<table>

<c:forEach var="item" items="${sz}" varStatus="st"

begin="2" end="10" step="2" >

<tr>

<td>${st.count}</td>

<td>${st.index}</td>

<td>${item}</td>

</tr>

</c:forEach>

</table>

</body>


输出结果如下: 

1235

2465

36102

4812

51020


5.2.4URL相关标签

在JSP页面链接、导入、重定向到其他URL资源,在JSTL中统称为URL相关标签。

1.  c:url

<c:url>基本语法如下,属性信息见表57。

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

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



表57c:url属性信息



属性名动 态 支 持属 性 类 型描述

valuetrueString要处理的URL 
contexttrueString相对路径的URL依赖的外部Context名字
varfalseString输出到scope对象的变量名
scopefalseString域对象



<c:url>与锚点<a href="#">不同,它用于生成访问资源的URL,但是并不会产生超链接。value属性值可以使用绝对地址,也可使用相对地址。绝对地址不会重写,而相对地址在解析时会重写,会自动增加context前缀。如<c:url value="/ads/logo.html"/>,假设Web站点context为: /foo,则输出结果: /foo/ads/logo.html。

【示例518】

重写<img>图片的相对路径,当前站点是/Hello,则图片链接为/Hello/pic/flex.png。

<body>

<img src="${pageContext.request.contextPath}/pic/flex.png">

等效于

<img src="<%=request.getContextPath()%>/pic/flex.png">

等效于

<img src="<c:url value='/pic/flex.png'/>" />

<a href="<c:url value='/pic/flex.png'/>">flex图片</a>

</body>

【示例519】

设置URL资源后,将它存储在域对象中,然后通过EL表达式读取。

<body>

<c:url value="/pic/flex.png" var="flexUrl" scope="page"></c:url>

<img src="${flexUrl}" />

</body>


【示例520】

url设置context属性后,强制指向外部context,图片指向/Center/pic/flex.png。

<body>

<c:url value="/pic/flex.png" context="/Center" var="flexUrl"></c:url>

<img src="${flexUrl}" />

</body>


2.  c:import

<c:import>用于导入基于URL的资源,基本语法如下,属性信息见表58。

<c:import url="url"[context="context"]

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

[charEncoding="charEncoding"]>

可选内容体 <c:param> 子标签

</c:import>



表58c:import属性信息



属性名动态支持属性类型描述

urltrueString待导入资源的URL,可以是相对路径或绝对路径
contexttrueString当使用相对路径访问外部context资源时,指明外部context的名字
varfalseString用于存储所引入文本的变量
scopefalseStringvar属性存储在哪个域对象
charEncodingtrueString引入资源的字符编码


说明: 

如果url为null、空串或无效,JspException异常被抛出。

如果charEncoding为null或空串,这个配置会被忽略。

<c:import >与<jsp:include>的功能相似,但是<jsp:include>只能嵌入当前Web应用的资源,而<c:import >还可以导入外部资源。


【示例521】

嵌入头文件。

(1) 编写头文件head.jsp。

<img src="${pageContext.request.contextPath}/pic/flex.png">

welcome ${user.uname}


(2) 在hello.jsp中嵌入head.jsp。

<body>

<c:import url="/main/head.jsp"></c:import>

hello!

</body>

【示例522】

使用绝对地址,导入外部资源文件。

<c:import url="ftp://ftp.acme.com/README"/>

3.  c:redirect

<c:redirect>表示发送HTTP的redirect到客户端,与调用HttpServletResponse.sendRedirect()相同,基本语法如下,属性见表59。

<c:redirecturl="value"[context="context"]/>



表59c:redirect属性信息



属性名动态支持属性类型描述

urltrueString重定向的目标URL,绝对地址和相对地址都可以
contexttrueString当使用相对路径访问外部context资源时,指明外部context的名字



【示例523】

用户登录后,根据身份不同,跳转到不同的页面。

<body>

<c:choose>

<c:when test="${user.role==1}">

<c:redirect url="/main/back.jsp" />

</c:when>

<c:when test="${user.role==2}">

<c:redirect url="/main/hello.jsp" />

</c:when>

<c:otherwise>

<c:redirect url="http://www.sina.com.cn" />

</c:otherwise>

</c:choose>

</body>


4.  c:param

<c:param>表示添加请求参数给URL,在<c:import>、<c:url>、<c:redirect>中都可以使用,基本语法如下,属性信息见表510。

<c:param name="参数名" value="参数值"/>



表510c:param属性信息



属性名动 态 支 持属 性 类 型描述

nametrueStringHTTP请求参数名
valuetrueStringHTTP请求参数值


【示例524】

<c:import url="/exec/doIt">

<c:param name="action" value="register"/>

</c:import>

使用<c:param>与URL中直接绑定参数的效果相同: 

<c:import url="/exec/doIt?action=register"/>

5.3格式化标签库

在JSP页面显示数字、货币、百分比、日期、时间等数据时,需要按照本地敏感或定制格式显示,这时使用格式化标签库非常方便。

5.3.1格式化数字、货币、百分比

<fmt:formatNumber>标签可以格式化数字、货币、百分比,基本语法如下: 

<fmt:formatNumber value="数值"

[type="{number|currency|percent}"]

[pattern="定制格式"]

[currencyCode="货币编码"]

[currencySymbol="货币符号"]

[groupingUsed="{true|false}"]

[maxIntegerDigits="最大整数数字"]

[minIntegerDigits="最小整数数字"]

[maxFractionDigits="最大小数数字"]

[minFractionDigits="最小小数数字"]

[var="变量名"]

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


【示例525】

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<!DOCTYPE html>

<html>

<body>

<fmt:formatNumber value="9876543.21" type="currency"/>

</body>

</html>

输出结果(自动按本地的货币格式显示):  ¥9,876,543.21。

如果设置本地化环境为en_US,则输出结果为美国货币格式: $9,876,543.21。

<body>

<fmt:setLocale value="en_US" />

<fmt:formatNumber value="9876543.21" type="currency"/>

</body>

【示例526】

<body>

<%

int rand = (int)(Math.random()*100);

request.setAttribute("rand", rand);

%>

<fmt:formatNumber value="${rand/3}" pattern=".00"/>

<fmt:formatNumber value="12.3" pattern=".00"/>

</body>


输出结果(保留两位小数): 

25.33

12.30

5.3.2格式化日期和时间

使用<fmt:formatDate>标签可以在JSP页面格式化日期和时间,基本语法如下: 

<fmt:formatDatevalue="日期"

[type="{time|date|both}"]

[dateStyle="{default|short|medium|long|full}"]

[timeStyle="{default|short|medium|long|full}"]

[pattern="定制格式"]

[timeZone="时区"]

[var="变量名"]

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

【示例527】

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<!DOCTYPE html>

<html>

<body>

<fmt:formatDate value="<%=new Date() %>" pattern="dd/MM/yyyy"/> <br>

<fmt:formatDate value="<%=new Date() %>" pattern="yyyy-MM-dd HH:mm"/>

</body>

</html>

输出结果: 

28/02/2020 

2020-02-2820:46



5.4本章习题


(1) 下列不属于核心库标签的是()。

A.  chooseB. ifC. fmtD. otherwise

(2) 下面不属于JSTL标签的是()。

A.  核心标签库B. 国际化/格式化标签库

C. HTML标签库D.  SQL标签库

E. 函数标签库

(3) 以下代码配置了一个自定义标签,这段代码应该位于()文件中。

<description>Spring Framework JSP Tag Library</description>

<tlib-version>4.0</tlib-version>

<short-name>spring</short-name>

<uri>http://www.springframework.org/tags</uri>

A.  Tomcat的conf/server.xml文件中

B.  Java Web应用的WEBINF/web.xml文件中

C.  一个tld文件

D.  Java Web应用的METAINF/context.xml文件中

(4) 以下不属于<c:forEach>标签属性的是()。

A.  varB. valueC. itemsD. varStatus

(5) 如下数据类型中,<c:forEach>标签不能迭代的是()。

A.  java.util.CollectionB. 静态数组

C.  java.util.Map      D. org.w3c.dom.Node 

E.  java.util.Iterator

(6) 如下属性不属于<c:out>标签的是()。

A.  varB. valueC. escapeXmlD. default

(7) <c:out>标签与<%=脚本表达式 %> 或 ${el表达式}的功能基本一致。(对/错)

(8) 使用<c:set>标签,可以把指定的值存储到pageContext域对象中。(对/错)

(9) <c:choose>中至少要包含一个子标签<c:when>和一个 <c:otherwise>。(对/错)

(10) <c:import>导入资源,url可以是绝对路径也可以是相对路径。(对/错)