第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相关包。下载jstlimpl1.2.jar和jstlapi1.2.jar,复制到WEBINF/lib文件夹下即可使用JSTL。 JSTL 1.2包含的标签库内容见表51。 表51JSTL 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版,对应JSR52。Java EE 8对应的JSP版本是2.3。JSTL 1.2需要JSP 2.1及以上的Web容器支持。EL表达式是JSP规范的一部分,在JSTL操作中会大量使用EL,而EL是从JSP 2.0规范开始的。 本章只着重介绍几个常用标签的使用,其他内容见JSR52规范。 视频讲解 5.1自定义标签库 标签库由标签库描述文件tld(taglibrary 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>的子元素<shortname>为标签库前缀。一个<taglib>下可以定义多个标签<tag>。 标签<tag>的子元素<name>为标签名,<tagclass>为标签实现类,<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项目的WEBINF下。 在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:>标识,这个标签库用处最大、用途最广。 参见jstlimpl1.2.jar/METAINF/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指令声明,<shortname>表示标签前缀,<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表达式}的功能基本一致,用于在页面输出静态或动态信息。 基本语法如下,属性信息见表52。 <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] /> 表52c:out属性信息 属性名动态支持属性类型描述 valuetrueObject要输出的表达式值 escapeXmltrueBoolean决定字符<,>、&、’,”在结果串中是否需要转义成对应的字符实体代码,默认为true。HTML转义符见表14 defaulttrueObject输出结果为null时,显示默认值 【示例51】 <p> 你有 <c:out value="${sessionScope.user.itemCount}"/> 个选项 </p> 【示例52】 当EL表达式输出为null时,可以使用<c:out>输出默认值。 所属城市: <c:out value="${customer.address.city}" default="未知"/> 2. c:set 基本语法如下,属性信息见表53。 <c:set value="value"var="varName" [scope="{page|request|session|application}"]/> 表53c:set属性信息 属性名动 态 支 持属 性 类 型描述 valuetrueObject要设置的表达式值 vartrueString存储在域对象中的变量名 scopefalseString与var对应的域对象 【示例53】 使用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 基本语法如下,属性信息见表54。 <c:remove var="varName" [scope="{page|request|session|application}"]/> 表54c:remove属性信息 属性名动 态 支 持属 性 类 型描述 varfalseString存储在域对象中的变量名 scopefalseString与var对应的域对象 【示例54】 使用<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脚本,因此条件判断标签必不可少。 【示例55】 <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> 基本语法如下,属性信息见表55,test为必选属性,var和scope为可选属性。 <c:if test="测试条件" [var="varName"] [scope="{page|request|session|application}"]> 内容体 </c:if> 表55c:if属性信息 属性名动态支持属性类型描述 testtrueboolean测试条件返回为真,处理内容体信息,否则不处理 varfalseString把测试条件返回的布尔值结果,存储到scope对象中 scopefalseStringpage、request、session、application中的某个域对象 【示例56】 JSTL与EL标签配合使用,判断图书价格是否小于或等于100(符合预算),如是,则显示图书名称。 <c:if test="${book.price <= 100}"> The book ${book.title} fits your budget! </c:if> 【示例57】 测试请求参数中是否有一个名字为name的参数,如果参数为空,则提示。 <c:if test="${empty param.name}"> Please specify your name. </c:if> 【示例58】 判断随机数是否大于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>体内,必须出现在最后。 【示例59】 示例效果等同于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> 【示例510】 示例效果等同于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()循环功能类似,基本语法如下,属性信息见表56。 <c:forEach [var="varName"]items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> 内容体 </c:forEach> 表56c: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等集合对象。 【示例511】 迭代输出产品集合中的产品信息。 <c:forEach var="product" items="${products}"> 产品名: ${product.name} 价格: ${product.price} </c:forEach> 【示例512】 迭代输出顾客信息,并在<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。 【示例513】 <c:forEach var="entry" items="${myHashtable}"> 元素key是: ${entry.key}<br> 元素value是: ${entry.value} </c:forEach> 【示例514】 如下代码中的${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> 【示例515】 使用嵌套<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。 【示例516】 <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,可以在迭代集合时选择部分内容处理。 【示例517】 <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>基本语法如下,属性信息见表57。 <c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]/> 表57c: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。 【示例518】 重写<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> 【示例519】 设置URL资源后,将它存储在域对象中,然后通过EL表达式读取。 <body> <c:url value="/pic/flex.png" var="flexUrl" scope="page"></c:url> <img src="${flexUrl}" /> </body> 【示例520】 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的资源,基本语法如下,属性信息见表58。 <c:import url="url"[context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]> 可选内容体 <c:param> 子标签 </c:import> 表58c:import属性信息 属性名动态支持属性类型描述 urltrueString待导入资源的URL,可以是相对路径或绝对路径 contexttrueString当使用相对路径访问外部context资源时,指明外部context的名字 varfalseString用于存储所引入文本的变量 scopefalseStringvar属性存储在哪个域对象 charEncodingtrueString引入资源的字符编码 说明: 如果url为null、空串或无效,JspException异常被抛出。 如果charEncoding为null或空串,这个配置会被忽略。 <c:import >与<jsp:include>的功能相似,但是<jsp:include>只能嵌入当前Web应用的资源,而<c:import >还可以导入外部资源。 【示例521】 嵌入头文件。 (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> 【示例522】 使用绝对地址,导入外部资源文件。 <c:import url="ftp://ftp.acme.com/README"/> 3. c:redirect <c:redirect>表示发送HTTP的redirect到客户端,与调用HttpServletResponse.sendRedirect()相同,基本语法如下,属性见表59。 <c:redirecturl="value"[context="context"]/> 表59c:redirect属性信息 属性名动态支持属性类型描述 urltrueString重定向的目标URL,绝对地址和相对地址都可以 contexttrueString当使用相对路径访问外部context资源时,指明外部context的名字 【示例523】 用户登录后,根据身份不同,跳转到不同的页面。 <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>中都可以使用,基本语法如下,属性信息见表510。 <c:param name="参数名" value="参数值"/> 表510c:param属性信息 属性名动 态 支 持属 性 类 型描述 nametrueStringHTTP请求参数名 valuetrueStringHTTP请求参数值 【示例524】 <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}"]/> 【示例525】 <%@ 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> 【示例526】 <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}"]/> 【示例527】 <%@ 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应用的WEBINF/web.xml文件中 C. 一个tld文件 D. Java Web应用的METAINF/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可以是绝对路径也可以是相对路径。(对/错)