核心标签库(core) |
|
|
标准标签库(JSTL)8.1准备实验环境本章中所有的例子程序都在名为JSTL的WEB应用程序中运行,使用的Tomcat服务器版本为Tomc at5.5。为了简化代码和突出重点,本章中所有的JSP网页文件的例子程序都省略了、、、dy>等HTML全局架构标签。本章中用于描述标签的语法的各种符号的意义如下:[…]:表示方括号中的内容是可选的;{option1| option2|option3|…}:表示花括号中用“|”字符分隔的各个选项不能同时出现,只能出现其中的一项;如果属性的值字体加粗 ,表示这个值是对应属性的默认值;如果属性的值用斜体字表示,表示该属性可以是表达式;如果标签体的内容用斜体字表示,表示标签体的内容可 以是JSP代码。为了本章后面讲解的方便,这里先创建一个名为UserBean的JavaBean程序,如例程8-1所示。例程8-1 UserBean.javapackageorg.it315;publicclassUserBean{privateSt ringuserName;privateStringpassword;privateStringaddress;priv ateintvisitCount;publicvoidsetUserName(StringuserName){this. userName=userName;}publicStringgetUserName(){returnuserName; }publicvoidsetPassword(Stringpassword){this.password=passwor d;}publicStringgetPassword(){returnpassword;}publicvoidsetAd dress(Stringaddress){this.address=address;}publicStringgetAd dress(){returnaddress;}publicvoidsetVisitCount(intvisitCount) {this.visitCount=visitCount;}publicintgetVisitCount(){return visitCount;}}编译这个源程序,将编译后的UserBean.class文件放在\webapps \JSTL\WEB-INF\classes\org\it315目录中。8.2JSTL概述8.2.1JSTL简介从JSP1 .1规范开始JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性,因此自定义标签在WEB 应用中被广泛使用。许多WEB应用厂商都开发出了自己的一套标签库提供给用户使用,这导致出现了许多功能相同的标签,令网页制作者无所适从 ,不知道选择哪一家的好。为了解决这个问题,ApacheJakarta小组归纳汇总了那些网页设计人员经常遇到的问题,开发了一套用于 解决这些常用问题的自定义标签库,这套标签库被SUN公司定义为标准标签库(TheJavaServerPagesStandard TagLibrary),简称JSTL。使用JSTL可以解决用户选用不同WEB厂商的自定义标签时的困惑,JSP规范同时也允许WE B容器厂商按JSTL标签库的标准提供自己的实现,以获取最佳性能。由于JSTL是在JSP1.2规范中定义的,所以JSTL需要运行在 支持JSP1.2及其更高版本的WEB容器上,例如,Tomcat5.5。1.JSTL的逻辑组成笔者在写本章内容时的JSTL规范的 最新版本是JSTL1.1,它是JSP2.0最新规范中的一个重要组成部分。JSTL1.1中包含四个标签库和一组EL函数。为方便 用户使用,JSP规范中描述了JSTL的各个标签库的URI地址和建议使用的前缀名,如表8.1所示。本章中在使用JSTL标签时,使用的 都是这些建议的前缀。表8.1JSTL标签库功能描述标签库的URI建议前缀核心标签库http://java.sun.com/js p/jstl/corecXML标签库http://java.sun.com/jsp/jstl/xmlx国际化/格式化标签库http ://java.sun.com/jsp/jstl/fmtfmt数据库标签库http://java.sun.com/jsp/jstl /sqlsqlEL自定义函数http://java.sun.com/jsp/jstl/functionsfn下面对JSTL的各个标 签库进行简单的介绍:(1)核心标签库中包含了实现WEB应用中的通用操作的标签。例如,用于输出一个变量内容的标签、用于 条件判断的标签、用于迭代循环的标签。(2)国际化/格式化标签库中包含实现WEB应用程序的国际化的 标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置 的本地格式显示。(3)数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表 中检索数据等。由于在软件分层的开发模型中,JSP页面仅用作表现层,我们一般不在JSP页面中直接操作数据库,而是在业务逻辑层或数据访 问层操作数据库,所以,JSTL中提供的这套数据库标签库没有多大的实用价值。(4)XML标签库中包含对XML文档中的数据进行操作的标 签。例如,解析XML文档、输出XML文档中的内容,以及迭代处理XML文档中的元素。因为XML广泛应用于WEB开发,对XML文档的处 理非常重要,XML标签库使处理XML文档变得简单方便,这也是JSTL的一个重要特征。?(5)JSTL中提供的一套EL自定义函数包 含了JSP页面制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度和处理字符串中的空格等。2.JSTL的物 理组成完整的JSTL应包含SUN公司提供的jstl.jar包和WEB容器产商提供的JSTL实现包,以ApacheJakarta 小组提供的JSTL实现包为例,完整的JSTL包含jstl.jar、standard.jar和xalan.jar三个jar 包。sun公司提供的jstl.jar包封装了JSTL所要求的一些API接口和类,ApacheJakarta小组编写的 JSTLAPI实现类封装在standard.jar包中。由于JDK在JDK1.5版本中才引入了XPathAPI ,而apacheJakarta小组开发的JSTLAPI是在JDK1.5之前推出的,所以apacheJakart a小组在JSTL中使用的是他们自己开发的XPathAPI,这些API封装在xalan.jar包中。Standar d.jar包中包括核心标签库、国际化/格式化标签库、数据库标签库中的标签和标准的EL自定义函数的实现类,xalan.jar包中 包括JSTL解析XPath的相关API类。8.2.2安装和测试JSTL1.下载JSTL包可以从Apache的网站下 载JSTL的jar包。进入http://jakarta.apache.org/taglibs/页面,根据相关的提示信息下载zi p压缩文件,这个压缩文件中包含JSTL的三个jar包。提示:由于网站的不断升级,下载JSTL的jar包的网址可能改变。读者在下载 这些文件时,如果在指定的网址没有下载的链接,可以进入Apache的网站首页,然后根据相关的提示下载所需的文件。例如,笔者在编写JS TL初稿时,从http://jakarta.apache.org/taglibs/下载的压缩文件中只包含jstl.jar和sta ndard.jar两个jar包,而xalan.jar包要从http://xml.apache.org/xalan-j/do wnloads.html下载。2.安装JSTL在Tomcat中安装JSTL很简单,只要将JSTL的jar包复制到序>\WEB-INF\lib目录下即可。本章中所有的例子程序都在一个名为JSTL的WEB应用程序中运行,所以,将JSTL的三个ja r包复制到\webapps\JSTL\WEB-INF\lib目录下即完成了JSTL的安装。提示:Tom cat5.5自带的JSP例子应用程序中提供了使用JSTL标签的例子,在\webapps\jsp-exa mples\WEB-INF\lib目录中有JSTL的jstl.jar包和standard.jar包,所以,对于读者来说,如果不使用 JSTL的XML标签库中的标签,可以直接将这两个包复制到\WEB-INF\lib目录中,而不用事先从Ap ache的网站下载JSTL的jar包。3.测试JSTL安装完JSTL后,接下来就可以准备测试JSTL安装得是否成功了。Apache 小组在提供JSTL时,同时也提供了JSTL标签的标签描述文件(即TLD文件),它们都封装在standard.jar包中,位于该ja r文件的META-INF目录中。用WinRAR打开standard.jar包,进入META-INF目录,可以看到JSTL标签的标 签库描述文件。查看这些TLD源文件,可以看到文件中定义的元素的内容与表8.1中列出的标签库的URI相同。因为stan dard.jar包中封装了JSTL标签的标签库描述文件,Tomcat在启动时会自动加载standard.jar包中的META-I NF目录下的所有TLD文件,所以使用JSTL时不必在web.xml文件中配置JSTL标签库的URI信息,就可以在JSP文件中直接使 用JSTL标签。要在JSP文件中使用JSTL,首先就需要使用taglib指令导入所需要使用的JSTL标签库,taglib指令的ur i属性必须为相应标签库的TLD文件中的元素的值,taglib指令的prefix属性可以自己随意指定,但最好是采用表8.1 中的建议前缀。在JSTL应用程序的主目录中按例程8-2编写一个包含JSTL标签的简单JSP文件test.jsp。例程8-2tes t.jsp<%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c "%>上面的test.jsp页面中的标签用于向浏览器输 出文本内容,它属于JSTL的核心标签库中的标签。由于在test.jsp文件中只使用了JSTL的核心标签库中的标签,所以,只需要使用 一条taglib指令导入JSTL的核心标签库,而不必使用多条taglib指令导入JSTL的所有标签库。启动Tomcat后,在浏览器 地址栏中输入test.jsp页面的地址进行访问,如果浏览器中显示出了“helloworld!”,说明JSTL安装成功。8.3 核心标签库JSTL核心标签库包含了一组用于实现WEB应用中的通用操作的标签,JSP规范为核心标签库建议的前缀名为c。8.3.1 标签标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中,在通常情况下,p ageContext对象当前保存的“out”对象的数据是输出到客户端浏览器,所以,标签通常用于输出一段文本内容到客 户端浏览器。如果标签输出的文本内容中包含了需要进行转义的HTML特殊字符,例如,<、>、''、"、&等,>标签默认对它们按表8.2进行HTML编码转换后再进行输出,这样就可以在浏览器中显示出这些字符。表8.2特殊字符转换t>标签标签有两种语法格式:语法1,没有标签体的情况:|false}"][default="defaultValue"]/>语法2,有标签体的情况,在标签体中指定输出的默认值::outvalue="value"[escapeXml="{true|false}"]>defaultvalueout>标签的属性说明如表8.3所示。表8.3标签的属性属性名是否支持EL属性类型属性描述v aluetrueObject指定要输出的内容escapeXmltrueBoolean指定是否将>、<、&、''、"等特殊字符进行H TML编码转换后再进行输出。默认值为truedefaulttrueObject指定如果value属性的值为null时所输出的默认值 当且仅当value属性的值为null时,标签输出默认值;如果没有指定默认值,默认为空字符串。标签的 标签体的内容用于指定输出的默认值,如果value属性的值不为null,即使标签体部分不为空,标签体的内容也不会被输出。如果valu e属性不是指向一个java.io.Reader对象,标签将调用这个对象的toString方法,然后输出获得的字符串 内容。如果value属性指向一个java.io.Reader对象,标签将从这个Reader对象中读取数据后进行输出 ,当有大量数据要被输出时,将这些数据以Reader对象的形式提供给标签进行输出,将会极大提高系统性能。当采用esca peXml属性的默认设置值true时,标签将对要输出的特殊字符按表8.2进行转换;如果将escapeXml属性设置为 false,标签将不对要输出的特殊字符进行转换,而是直接输出这些特殊字符。例程8-3是标签的一个演示 例子程序。例程8-3c_out1.jsp<%@taglibprefix="c"uri="http://java.sun .com/jsp/jstl/core"%><%@pagecontentType="text/html;charset=gb2 312"%><%session.setAttribute("test_session","testValue_session" );%>直接输出一个字符串:
输出Web域中不存在的属性的值: 性不存在"/>
输出Web域中的test_session属性的值: {test_session}"/>例程8-3的运行结果如图8.1所示。图8.1例程8-4和例程8-5是两个用于演示 标签的escapeXml属性的例子程序,例程8-4没有设置escapeXml属性,例程8-5将escapeXml属性设置为了fal se。例程8-4c_out2.jsp<%@taglibprefix="c"uri="http://java.sun.co m/jsp/jstl/core"%>esh"content="0;url=http://www.it315.org"/>例程8-5c_out3. jsp<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core" %>esh"content="0;url=http://www.it315.org"/>例程8-4和例程8-5的 运行结果分别如图8.2和图8.3所示。图8.2图8.38.3.2标签标签用于设置各种Web域中 的属性,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。标签有四 种语法格式:语法1,使用value属性设置指定域中的某个属性的值:"[scope="{page|request|session|application}"]/>语法2,在标签体中设置指定域中的某 个属性的值:on}"]>bodycontent语法3,使用value属性设置Web域中的一个属性对象的某个属性:value="value"target="target"property="propertyName"/>语法4,在标签体 中设置Web域中的一个属性对象的某个属性性:me">bodycontent标签的属性说明如表8.4所示。表8.4标签的属性属性 名是否支持EL属性类型属性描述valuetrueObject用于指定属性值varfalseString用于指定要设置的Web 域属性的名称scopefalseString用于指定属性所在的Web域targettrueObject用于指定要设置属性的对象,这 个对象必须是JavaBean对象或java.util.Map对象propertytruestring用于指定当前要为对象设置的属性 名称如果使用第1种语法格式时的value属性值为null,或者使用第2种语法格式时的标签体内容为空,标签将从scop e属性指定的域范围中删除var属性指定的属性。在第3种语法格式和第4语法格式中,如果target属性的值是java.util.Ma p对象,property属性表示该Map对象的关键字,如果Map对象没有指定的关键字,就给Map对象增加指定的关键字;如果targ et属性的值是JavaBean对象,property属性表示JavaBean对象的属性,如果value的类型与JavaBean属性 的类型不匹配时,会根据EL的转换规则自动进行转换。当使用第3种语法格式或第4种语法格式时,如果target属性的值为null(即t arget属性指定的对象不存在),或者target属性的值是一个JavaBean对象,但该JavaBean中不存在property 属性指定的属性,标签将抛出异常。如果使用第3种语法格式时value属性的值为null,或者使用第4种语法格式时标签体 的内容为空,如果target属性的值是一个java.util.Map对象,就从Map对象中删除property属性指定的关键字对应 的项;如果target属性的值是一个JavaBean对象,就将JavaBean的相应属性的值设置为null。例程8-6是使用set>标签设置某个Web域中的属性的一个演示例子程序。例程8-6c_set1.jsp<%@taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core"%><%@pagecontentType=" text/html;charset=gb2312"%>>zxx输出session作用域中的userNamer属性的值:}"/>
输出session作用域中的bookname属性的值:"scope="session"/>例程8-6的运行结果如图8.4所 示。图8.4例程8-7是使用标签设置UserBean对象和Map对象的属性的一个演示例子程序。例程8-7c_se t2.jsp<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/cor e"%><%@pagecontentType="text/html;charset=gb2312"%><%@pagei mport="java.util.HashMap"%>15.UserBean"/><%HashMappreferences=newHashMap();session.setA ttribute("preferences",preferences);%>设置和输出UserBean对象的userName属性值 :value="${user.userName}"/>
设置和输出UserBean对象的password属 性值:user.password}"/>
设置和输出Map对象的color关键字的值:="${preferences}"property="color"value="${param.color}"/>tvalue="${preferences.color}"/>在浏览器地址栏输入如下地址访问例程8-7:http://loca lhost:8080/JSTL/c_set2.jsp?color=green例程8-7的运行结果如图8.5所示。图8.58.3.3 标签标签用于删除各种Web域中的属性,其语法格式如下:arName"[scope="{page|request|session|application}"]/>var属性用于指定要 删除的属性的名称,scope属性用于指定要删除的属性所属的Web域,它们的值都不能接受动态值。如果没有指定scope属性,emove>标签就调用PageContext.removeAttribute(varName)方法,否则就调用PageContex t.removeAttribute(varName,scope)方法。与标签第一种语法格式的 value属性值为null时的作用相同。例程8-8是使用标签的一个演示例子程序。例程8-8c_remove. jsp<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core" %><%@pagecontentType="text/html;charset=gb2312"%>"org.it315"var="company"scope="request"/>scope="session">a123456a在没有使用<c:remove>标签之前,变量的值 为: company: passWord:value="${passWord}"/> st"/>
在使用<c:remove >标签之后,变量的值为: company: p assWord:例程8-8的运行结果如图8.6所示。图8.68.3.4 标签标签用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:"varName"]>nestedactionsvar属性用于标识标签捕获的异常对象,其值 是一个静态的字符串,不支持动态属性值。标签将捕获的异常对象以var指定的名称保存到page这个Web域中,如果没 有指定var属性,则标签仅捕获异常,不在page域保存异常对象。如果标签体中的内容没有抛出异常 ,标签将从page域中删除var属性指定的属性。标签可以捕获任何标签抛出的异常,并且可以同时处 理多个标签抛出的异常,这样,可以对JSP页面的异常进行统一处理,显示给用户一个更友好的页面。JSP处理异常的通用机制是出现重要异常 后跳转到错误处理页面,建议尽量不要用标签来代替JSP的错误处理机制,只对一些次要异常才使用标签 进行捕获处理。例程8-9是使用标签进行异常捕获处理的一个演示例子程序。例程8-9c_catch.jsp<%@ taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%@ pagecontentType="text/html;charset=gb2312"%>><%inti=0;intj=10;out.println(j+"/"+i+"="+j/i);%> c:catch>异常: 异常myex.getMessage:utvalue="${myex.message}"/> 异常myex.getCause:"${myex.cause}"/> 异常myex.getStackTrace:x.stackTrace}"/>在例程8-9中,标签内嵌套的脚本元素抛出了异常,yex">将捕获到这个异常,调用,相当于调用<%=myex.ge tMessage()%>。例程8-9的运行结果如图8.7所示。图8.78.3.5标签JSP页面的显示逻辑中也经常需 要进行条件判断,标签可以构造简单的“if-then”结构的条件表达式,如果条件表达式的结果为真就执行标签体部分的内容。 标签有两种语法格式:语法1,没有标签体的情况:ame"[scope="{page|request|session|application}"]/>语法2,有标签体的情况,在标 签体中指定要执行的内容:age|request|session|application}"]>bodycontent标签的属性 说明如表8.5所示。表8.5标签的属性属性名是否支持EL属性类型属性描述testtrueboolean决定是 否处理标签体中的内容的条件表达式varfalseString用于指定将test属性的执行结果保存到某个Web域中的某个属性的名称 scopefalseString指定将test属性的执行结果保存到哪个Web域中对于语法2,如果指定了标签的scope 属性,则必须指定var属性。例程8-10是使用标签的一个演示例子程序。例程8-10c_if.jsp<%@tagl ibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%@page contentType="text/html;charset=gb2312"%>lass="org.it315.UserBean"/>"${user}"property="visitCount"/>=1}">这是您第一次访问本网站,欢迎您!在浏览器地址栏输入如下地址访问例程8-10:http://localho st:8080/JSTL/c_if.jsp?count=1例程8-10的运行结果如图8.8所示。图8.88.3.6oose>标签标签用于指定多个条件选择的组合边界,它必须与和标签一起 使用。使用,和三个标签,可以构造类似“if-elseif-els e”的复杂条件判断结构。标签没有属性,在它的标签体内只能嵌套一个或多个标签和0个或一个otherwise>标签,并且同一个标签中的所有子标签必须出现在子标 签之前。如果标签内嵌套一个标签和标签,就相当于“if-else”的条 件判断结构;如果标签内嵌套多个标签和一个标签,就相当于“if-els eif-else”标签。标签只有一个test属性,该属性的值为布尔类型。test属性支持动态值,其值可以是一个条 件表达式,如果条件表达式的值为true,就执行这个标签体的内容。标签体的内容可以是任意的JSP代码 。标签没有属性,它必须作为标签的最后分支出现。当JSP页面中使用 标签时,嵌套在标签内的test条件成立的第一个标签的标签体内容将被执行和输出。当且仅当所有的< c:when>标签的test条件都不成立时,才执行和输出标签的标签体内容。如果所有的标签 的test条件都不成立,并且标签内没有嵌套标签,则不执行任何操作。例程8-11是使用 、、标签的一个演示例子程序。例程8-11c_choose.jsp <%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>< %@pagecontentType="text/html;charset=gb2312"%>param.count}"var="count"/>">对不起,没有符合您要求的记录。符合您要求的记录共有${count}条.herwise>在浏览器地址栏输入如下地址访问例程8-11:http://localhost:8080/JS TL/c_choose.jsp?count=0例程8-11的运行结果如图8.9所示。如果将参数count的值修改为10,则运行结 果如图8.10所示。图8.9图8.10例程8-12是一个综合使用标签和等标签的例子程序,在这个例 子程序中,首先使用标签判断表单提交的方式是否是POST,如果是,就再使用等标签根据表单提交的内容进 行不同的处理。例程8-12c_customLogic.jsp<%@taglibprefix="c"uri="http:/ /java.sun.com/jsp/jstl/core"%>method==''POST''}">er''}">Yourfavouritecourseiscomputer.ise>Yourfavouritecourseisother.e>Whatisyourfavouritecourse? < inputtype="text"name="favor"/>it"/>在浏览器地址栏中直接访问c_customLogic.jsp的运行结果如图8.11所示,在文本框中输入“c omputer”,单击其中的submit按钮后的运行结果如图8.12所示。图8.11图8.128.3.7 标签JSP页面的显示逻辑中也经常需要对集合对象进行循环迭代操作,标签用于对一个集合对象中的元素进行循环迭代操 作,或者按指定的次数重复迭代执行标签体中的内容。标签有两种语法格式:语法1,在集合对象中迭代:ach[var="varName"]items="collection"[varStatus="varStatusName"] [begin="begin"][end="end"][step="step"]>bodycontent>语法2,迭代固定的次数:]begin="begin"end="end"[step="step"]>bodycontent:forEach>标签的属性说明如表8.6所示。表8.6标签的属性属性名是否支持EL属性类型属性描 述varfalseString指定将当前迭代到的元素保存到page这个Web域中的属性名称itemstrue任何支持的类型将要迭代 的集合对象varStatusfalseString指定将代表当前迭代状态信息的对象保存到page这个Web域中的属性名称begin trueint如果指定items属性,就从集合中的第begin个元素开始进行迭代,begin的索引值从0开始编号;如果没有指定it ems属性,就从begin指定的值开始迭代,直到end值时结束迭代endtrueint参看begin属性的描述steptruein t指定迭代的步长,即迭代因子的迭代增量在使用标签时,需要注意如下几点说明:如果指定begin属性,其值必须大 于或等于零;如果指定步长(step属性),其值必须大于或等于1;如果items属性的值为null,则要处理的集合对象为空,这时不执 行迭代操作;如果指定的begin属性的值大于或等于集合对象的长度,不执行迭代操作;如果指定的end属性的值小于begin属性的值, 不执行迭代操作;标签的items属性的值支持下面的数据类型:任意类型的数组java.util.Collect ionjava.util.Iteratorjava.util.Enumerationjava.util.MapStringitem s属性还支持与数据库有关的数据类型java.sql.ResultSet(包括javax.sql.RowSet),这些数据类型将在8 .5节的数据库标签中进行介绍。对字符串的迭代操作通常使用标签或JSTL函数,例如fn:split和fn :jion,JSTL函数将在8.7节进行介绍。1.迭代Collection类型的集合对象例程8-13是使用标 签迭代Collection类型的集合对象的一个应用举例。例程8-13c_forEach_collection.jsp<%@t aglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%@pa gecontentType="text/html;charset=gb2312"%><%@pageimport="java .util.,org.it315.UserBean"%><%Collectionusers=newArrayList( );for(inti=0;i<5;i++){UserBeanuser=newUserBean();user.setU serName("user"+i);user.setPassword("guess"+i);users.add(user) ;}session.setAttribute("users",users);%>enter">UserList用户名 | 密码 | >${user.userName}< /td> | ${user.password} | | 例程8-1 3的运行结果如图8.13所示。图8.132.迭代Map对象使用标签迭代Map类型的集合对象时,迭代出的每个元 素的类型为Map.Entry,Map.Entry代表Map集合中的一个条目项,其中的getKey()方法可获得条目项的关键字,ge tValue()方法可获得条目项的值。EL中的requestScope隐含对象代表request作用域中的所有属性的Map对象,所 以我们可以使用标签迭代输出EL中的requestScope隐含对象中的所有元素,如例程8-14所示。例程8- 14c_forEach_map.jsp<%@taglibprefix="c"uri="http://java.sun.co m/jsp/jstl/core"%><%@pagecontentType="text/html;charset=gb2312 "%><%request.setAttribute("attr1","value1");request.setAttribute ("attr2","value2");%>Properties(Ma p)Map的关键字 | Map的对应关键字的值 |
${entry.ke y} | ${entry.value} | | 例程8- 14的运行结果如图8.14所示。图8.143.迭代指定的次数标签可以按指定的次数重复迭代执行标签体中的内容, 使用这种方式迭代时,可以指定迭代的步长。例程8-15中分别演示了指定迭代步长和没有指定迭代步长的情况。例程8-15c_forEa ch_count.jsp<%@taglibprefix="c"uri="http://java.sun.com/jsp/js tl/core"%><%@pagecontentType="text/html;charset=gb2312"%>从11到 16迭代,指定迭代步长为2:${i }
从0到5迭代,没有指定迭代步长:="0"end="5">${i}例程8-15的运行结果如图8.15所示。图8.154.指定迭代集合对象的 范围和步长标签迭代集合类对象时,也可以指定迭代的范围和步长,如例程8-16所示。例程8-16c_forEa ch_col.jsp<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl /core"%><%@pagecontentType="text/html;charset=gb2312"%><%@pa geimport="java.util.,org.it315.UserBean"%><%Collectionusers= newArrayList();for(inti=0;i<6;i++){UserBeanuser=newUserB ean();user.setUserName("user"+i);user.setPassword("guest"+i); users.add(user);}session.setAttribute("users",users);%>e="text-align:center">UserList(指定迭代范围和步长)< td>用户名密码 | end="5"step="2">${user.userName} | ${user.passwor d} | | 例程8-16的运行结果如图8.16所示。图8.165. 获取迭代的状态信息不管是迭代集合对象,还是迭代指定的次数,在迭代时都可以获得当前的迭代状态信息。标签可以将代 表当前迭代状态信息的对象保存到page域中,varStatus属性指定了这个对象保存在page域中的属性名称。代表当前迭代状态信息 的对象的类型为javax.servlet.jsp.jstl.core.LoopTagStatus,从JSTL规范中可以查看到这个类 的详细信息,其中定义了如下一些方法:publicjava.lang.IntegergetBegin()返回为标签设置的begi n属性的值,如果没有设置begin属性则返回nullpublicintgetCount()返回当前已循环迭代的次数public java.lang.ObjectgetCurrent()返回当前迭代到的元素对象publicjava.lang.Intege rgetEnd()返回为标签设置的end属性的值,如果没有设置end属性则返回nullpublicintgetIndex() 返回当前迭代的索引号publicjava.lang.IntegergetStep()返回为标签设置的step属性的值,如果没有 设置step属性则返回nullpublicbooleanisFirst()返回当前是否是第一次迭代操作publicboole anisLast()返回当前是否是最后一次迭代操作例程8-17是一个获取迭代状态信息的例子程序。例程8-17c_forEach _col2.jsp<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/ core"%><%@pagecontentType="text/html;charset=gb2312"%><%@pag eimport="java.util.,org.it315.UserBean"%><%Collectionusers= newArrayList();for(inti=0;i<6;i++){UserBeanuser=newUserBe an();user.setUserName("user"+i);user.setPassword("guest"+i);u sers.add(user);}session.setAttribute("users",users);%>="text-align:center">UserList用户名 | < td>密码index | count | first? | last?d> | in="1"step="2">${user.userName} | ${user.password}
| ${sta.index} | ${sta.count} | ${sta.first} td> | ${sta.last} | |