java-web-编程课件第10章_第1页
java-web-编程课件第10章_第2页
java-web-编程课件第10章_第3页
java-web-编程课件第10章_第4页
java-web-编程课件第10章_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaWeb编程技术第10章JSTL与标签文件10.1JSP标准标签库10.2核心标签库10.3其他JSTL标签库10.4使用标签文件10.5小结10.1JSP标准标签库〔JSTL〕JSP标准标签库〔JSPStandardTagLibrary,JSTL〕是为实现Web应用程序常用功能而开发的标签库,它是由一些专家和用户开发的。使用JSTL可以提高JSP页面的开发效率,也可以防止重复开发标签库。JSTL由许多子库组成,每个子库提供了一组实现特定功能的标签,具体来说,这些子库包括:core库—包括通用处理的标签;xml库—包括解析、查询和转换XML数据的标签;fmt库—包括为国际化目的的格式化数据的标签;sql库—包括访问关系数据库的标签;functions库—包括管理String和集合的标签。本节我们主要介绍核心的标签库

10.1JSP标准标签库〔JSTL〕10.1.1获得和安装JSTL10.1.2通用目的标签10.1.3条件控制标签10.1.4循环控制标签10.1.5URL相关的标签10.1.6其他JSTL库10.1.1获得和安装JSTL在使用JSTL前,首先应该获得JSTL包,可以到Jakarta网站下载JSTL包,地址为://。在Tomcat效劳器中就有这两个文件,它存放在<CATALINA_HOME>\webapps\examples\WEB-INF\lib。从该目录中将jstl.jar和standard.jar文件复制到应用程序的WEB-INF/lib目录中即可。在JSP中使用taglib指令来引用库,例如:<%@taglibprefix="c"uri="://"%>使用前缀c引用核心〔core〕库中的JSTL标签了。<%@taglibprefix="c"uri="://"%><html><head><title>UsingJSTL</title></head><body><c:outvalue="WelcometousingJSTL"/><br>RequestMethod:<c:outvalue="${}"/><br>RemoteAddress:<c:outvalue="${}"/></body></html>执行该页面

通用目的<c:out>、<c:set>、<c:remove>和<c:catch>

条件控制<c:if>、<c:choose>、<c:when>和<c:otherwise>

循环控制<forEach>和<forTokens>

URL处理<c:import>,<c:url>,<c:redirect>,<c:param>

JSTL的核心标签库的标签可以分成四类:10.1.2通用目的标签包括<c:out>、<c:set>、<c:remove>和<c:catch>四个标签。1.<c:out>标签

格式1:不带标签体的情况。<c:outvalue="value“default="defaultValue"/>格式2:带标签体的情况。<c:outvalue="value">defaultvalue</c:out>下面是一个例子:<c:outvalue="${number}"/>该例将在页面中显示表达式number的值。<c:outvalue="${color}"default="red"/>从<c:out>标签的功能我们可以看到,它可以替换JSP的脚本表达式。2.<c:set>标签<c:set>标签用来设置作用域变量以及对象的属性值,如JavaBean与Map属性的值。该标签有下面4种语法格式:格式1:<c:setvar="varName"value="value"[scope="{page|request|session|application}"]/>格式2:<c:setvar="varName"[scope="{page|request|session|application}"]>bodycontent</c:set>例如下面两个标签:<c:setvar="num"value="${4*4}"scope="session"/>与<c:setvar="num“scope="session">${8*2}</c:set>都将变量num的值设置为16。<c:outvalue="${num}"/>格式3:<c:settarget="target"property="propertyName"value="value"/>格式4:<c:settarget="target"property="propertyName">bodycontent</c:set><jsp:useBeanid="book"class="test.BookBean"scope="session"/><c:settarget="${book}"property="title"value="JavaWebProgramming"/><c:outvalue="${}"/><br><c:settarget="${book}"property="title">JavaEEProgramming</c:set><c:outvalue="${}"/>注意:target属性的值应该使用EL的形式,如target="${book}",如果写成下面的形式将出现错误:target="book"<c:set>标签对Map对象的用法类似,只是property属性表示的是Map键的名称。3.<c:remove>标签从作用域中去除变量,它的语法格式为:<c:removevar="varName"[scope="{page|request|session|application}"]/>var属性指定要去除的变量名,可选的scope属性指定作用域。如果没有指定scope属性,容器将先在page作用域查找变量,然后是request,接下来是session,最后是application作用域,找到后将变量去除。例如,使用下面标签将从session作用域中去除number变量:<c:removevar="number"scope="session"/>与<c:set>标签不同,<c:remove>标签不能用于去除JavaBeans或Map对象。4.<c:catch>标签功能是捕获标签体中出现的异常,它的语法格式为:

<c:catch[var="varName"]>nestedactions</c:catch>这里,var是为捕获到的异常定义的变量名,当标签体中代码发生异常时,将由该变量引用异常对象,变量具有page作用域,例如:<c:catchvar="myexception"><%inti=0;intj=10/i;%></c:catch><c:outvalue="${myexception}"/><br><c:outvalue="${myexception.message}"/>该段代码的输出结果为::/byzero/byzero10.1.3条件控制标签条件控制的标签有4个:<c:if>、<c:choose>、<c:when>和<c:otherwise>。<c:if>和<c:choose>标签的功能类似于Java语言的if语句和switch-case语句。

1.<c:if>标签<c:if>标签用来进行条件判断,它有下面2种语法格式:格式1:无标签体的情况<c:iftest="testCondition"var="varName"[scope="{page|request|session|application}"]/>格式2:有标签体的情况<c:iftest="testCondition"var="varName"[scope="{page|request|session|application}"]>bodycontent</c:if>例如,在下面代码中如果x的值等于16,那么会显示其值:<c:setvar="number"value="${4*4}"scope="session"/><c:iftest="${number=='16'}"var="num"scope="session">${number}</c:if><c:outvalue="${num}"/>2.<c:choose>标签下面代码根据变量的值显示不同的文本:<c:setvar="color"value="white“scope="session"/><c:choose><c:whentest="${color=='white'}">Light!</c:when><c:whentest="${color=='black'}">Dark!</c:when><c:otherwise>Colors!</c:otherwise></c:choose>10.1.4循环控制标签<c:forEach>和<c:forTokens>标签允许重复处理标签体内容。使用这些标签,能以三种方式控制循环的次数:对数的范围:使用<c:forEach>以及它的begin、end和step属性;对Java集合中元素:使用<c:forEach>以及它的items属性;对String对象中的令牌〔tokens〕:使用<c:forTokens>以及它的items属性。1.<c:forEach>标签它可以对标签体迭代固定的次数,也可以在集合对象上迭代,它的语法格式如下:格式1:迭代固定的次数

<c:forEach[var="varName"][varStatus="varStatusName"][begin="begin"end="end"step="step"]>bodycontent</c:forEach>

可以指定varStatus属性值来保存迭代的状态,例如,如果指定:varStatus="status"那么可以通过status访问迭代的状态。其中包括,本次迭代的索引、已经迭代的次数、是否是第一个迭代对象、是否是最后一个迭代对象等。它们分别用status.index、status.count、status.first、status.last访问。程序9.13foreach_1.jsp程序执行格式2:在集合对象上迭代<c:forEach[var="varName"]items="collection"[varStatus="varStatusName"][begin="begin"end="end"step="step"]>bodycontent</c:forEach>该标签也可用于对Java集合对象的元素迭代,集合对象如Vector、List或Map。标签对每个元素处理一次主体内容。这里,items属性值用来指定要迭代的集合对象,var的值表示迭代的对象。在集合对象上迭代程序代码,程序

执行:2.<c:forTokens>标签<forTokens>标签用来在字符串中的令牌〔token〕上迭代,它的语法格式为:<c:forTokensitems="stringOfTokens"delims="delimiters"[var="varName"][varStatus="varStatusName"][begin="begin"][end="end"][step="step"]>bodycontent</c:forTokens>在<forTokens>标签中,items属性是一个String对象,它是由分隔符分隔的令牌组成的。delims属性用来指定分隔符。<%@tagliburi="://"prefix="c"%><html><body><c:setvar="seasons"value="Spring,Summer,Autumn,Winter"/><tableborder="1"align="center"><thcolspan="4">SeasonsofOneYear:</th><tr><c:forTokensvar="season"items="${seasons}"delims=","><td>${season}</td></c:forTokens></tr></table></body></html>执行:10.1.5URL相关的标签与URL相关的标签有4个:<c:import>,用于访问Web应用程序外的内容;<c:url>,用于重写URL并对它们的参数编码;<c:redirect>,用于告诉客户浏览器访问另外的URL;<c:param>,用于指定附加在URL后面的请求参数。1.<c:param>标签<c:param>标签主要用于在<c:import>、<c:url>和<c:redirect>标签中指定请求参数,它的格式有下面2种:格式1:参数值使用value属性指定<c:paramname="name"value="value"/>格式2:参数值在标签体中指定<c:paramname="name">paramvalue</c:param>2.<c:import>标签<c:import>标签的功能与<jsp:include>标准动作的功能类似,可以将一个静态或动态资源包含到当前页面中。使用<jsp:include>标准动作能够包含的文件类型有一定限制,它所包含的内容必须位于与所在页面本身相同的上下文环境〔ServletContext〕中,而使用<c:import>标签所包含的资源可以位于不同的上下文环境。<c:import>标签有下面2种语法格式:格式1:资源内容作为字符串对象导入<c:importurl="url"[context="context"][var="varName"][scope="{page|request|session|application}"]>

bodycontent</c:import>这里,url的值表示要包含的资源的URL,它用String对象表示。3.<c:redirect>标签<c:redirect>标签的功能是将用户的请求重定向到另一个资源,它有2种语法格式:格式1:不带标签体的情况<c:redirecturl="url"[context="context"]/>格式2:在标签体中指定查询参数<c:redirecturl="url"[context="context"]><c:param>subtags</c:redirect>下面的代码片段给出了一个<c:redirect>标签如何转向到一个新的URL的例子:<c:redirecturl="/content.jsp"><c:paramname="par1"value="val1"/><c:paramname="par2"value="val2"/></c:redirect>4.<c:url>标签<c:url>标签有如下2种格式:格式1:不带标签体的情况<c:urlvalue="value"[context="context"][var="varName"][scope="{page|request|session|application}"]/>格式2:带标签体和参数的情况<c:urlvalue="value"[context="context"][var="varName"][scope="{page|request|session|application}"]><c:param>subtags</c:url>表9.6JSTL库及使用的URI与前缀库名称使用的URI前缀核心库/jsp/jstl/corecXML库/jsp/jstl/xmlx格式化库/jsp/jstl/fmtfmtSQL库/jsp/jstl/sqlsql函数库/jsp/jstl/functionsfn10.1.6其他JSTL库〔选学内容〕1.SQL库SQL库的标签是为快速构建原型和简单的应用程序而设计的用于访问数据库的标签。对产品应用程序,数据库操作通常封装在JavaBeans组件中。SQL库的标签包括:建立和使用数据源的标签:<sql:setDataSource>。查询和更新的标签:<sql:query>、<sql:update>、<sql:param>、<sql:dateParam>。事务管理的标签:<sql:transaction>。例如程序:dbaccess.jsp在<sql:setDataSource>标签中也可以使用通过JNDI建立数据源对象,例如:<sql:setDataSourcevar="example1"dataSource="jdbc/bookDS"/>这里,“jdbc/bookDS”是一个已经创立的JNDI数据源名称。2.国际化和格式化库实现国际化的标签有:<fmt:message>、<fmt:setLocale>、<fmt:bundle>、<fmt:setBundle>、<fmt:param>、<fmt:requestEncoding>。实现格式化的标签有:<fmt:timeZone>、<fmt:setTimeZone>、<fmt:formatNumber>、<fmt:parseNumber>、<fmt:parseDate>。3.XML库

核心XML动作,包括<x:out>、<x:parse>和<x:set>。XML流程控制,包括<x:if>、<x:choose>、<x:when>、<x:otherwise>和<x:forEach>。转换动作,包括<x:transform>和<x:param>。4.函数库函数库中除length函数可以返回集合对象的元素个数和String对象的字符个数外,所有其他的函数标签都应用于String对象,有些函数名与String类的相应方法名相同,在使用这些函数时,函数标签名的后面跟一对括号,括号里是参数,例如:${fn:toUpperCase(param.username)}下面是一些常用的函数:改变字符串中字母的大小写的函数,包括fn:toUpperCase,fn:toLowerCase;返回字符串的子集的函数,包括fn:substring,fn:substringAfter,fn:substringBefore;去掉字符串后面的空格的函数fn:trim;替换字符串中字母的函数fn:replace;检查一个字符串是否包含另一个字符串的函数,包括fn:indexOf,fn:startsWith,fn:endsWith,fn:contains,fn:containsIgnoreCase;将一个字符串解析成一个String数组的函数fn:split;将集合连接成一个字符串的函数fn:join;将XML字符转义成字符串的函数fn:escapeXml。

<%@tagliburi="://"prefix="c"%><%@tagliburi="://"prefix="fn"%><html><head><title>FunctionDemo</title></head><body><formaction=""method="post">Name:<inputtype="text"name="username"size="25"><p></p><inputtype="submit"value="Submit"><inputtype="reset"value="Reset"></form><c:iftest="${fn:length(param.username)>0}"><p><fontcolor="blue">Hello,${param.username}!</font><fontcolor="red">Hello,${fn:toUpperCase(param.username)}!</font></p></c:if></body></html>10.2使用标签文件10.2.1标签文件介绍10.2.2标签文件与TLD10.2.3使用标签文件指令10.2.4使用标签文件动作处理片段和主体内容10.2.1标签文件介绍JSTL和EL都可以减少JSP中Java代码的数量,SimpleTag可以减少标签处理器中Java代码的数量。标签文件〔tagfile〕是JSP2.0增加的功能,它可以进一步减少JSP页面中的Java代码。只要我们了解JSP语法,就可以为页面编写自定义标签。最简单的情况下,标签文件是包含JSP代码的文件,其扩展名.tag为或.tagx。标签文件中可以包含EL表达式、指令、自定义标签及标准标签。与SimpleTag不同,JSP标签文件也可以包含脚本元素。唯一不能在标签文件中使用的JSP元素是page指令。下面是一个名为hello.tag的标签文件,它用来显示一个简单的欢送词。<fontcolor='blue'>Hello,Thisissimpletag.</font>该标签文件应该存放在/WEB-INF/tags目录中。程序给出了访问该标签文件并显示输出的JSP代码。example.jsp<%@taglibprefix="mytag"tagdir="/WEB-INF/tags"%><html><body>Thisisanexampleoftagfile:<br><mytag:hello/></body></html>任何表示逻辑的开发人员都可以创立标签文件。新的标准也使在JSP中使用标签文件变得简单。这只需要两步:〔1〕在JSP中添加一个taglib指令,其中包含prefix属性和tagdir属性,其中tagdir属性值为/WEB-INF/tags。〔2〕在JSP文件中把一个包含前缀和标签文件名〔不带扩展名〕的标签放在任何希望文件的JSP代码要调用的地方。这带来了一个重要的问题。如果基于Java的标签需要TLD来定位它们的类,这些标签如何定位标签文件呢?为了答复这个问题,我们需要知道Web容器如何访问和处理标签文件。10.5.2标签文件与TLD在JSP页面中要使用标签文件,必须将<taglib>指令的tagdir属性设置为/WEB-INF/tags,因为Web容器自动在这个位置查找标签文件。容器为该目录及其它下面的每个子目录创立一个隐含的标签库和TLD的映射。如果在一个JAR文件中部署标签文件,必须为标签文件创立一个TLD文件,该TLD类似于通常的TLD,但不是使标签与标签处理器匹配,而是使标签文件名与它们的路径匹配。标签文件的TLD使用<tag-file>元素代替<tag>元素,元素的定义如下:<!ELEMENTtag-file(description?,display-name?,icon?,name,path,example?,tag-extension?)>唯一必须的元素是<name>和<path>,前者指定了不带后缀的标签文件名,后者指定了从文档根目录开始文件路径。因此,<path>必须以/META-INF/tags开头。下面是一个打包的标签文件的TLD例如:<taglib>…<uri>/example</uri><tag-file><name>example</name><path>/META-INF/tags/example.tag</path></tag-file></taglib>10.5.3使用标签文件指令在JSP页面中可以使用三个指令:page指令、include指令和taglib指令。在标签文件中可以使用5个指令,它们是:include指令、taglib指令、variable指令、tag指令和attribute指令。前2个指令与JSP页面中的使用方法相同,下面我们通过一些例如代码来讨论后3个指令的使用。1.使用variable指令variable指令的功能是在标签文件中声明JSP变量。然后可以通过JSTL动作与EL表达式来给它赋值并显示它。例如,如果标签文件包含下面指令:<%@variablename-given="x"%>那么在JSP中可以使用JSTL动作设置该变量值,如:<c:setvar="x">Hooray!</

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论