【Jsp精品源码栏目提醒】:本文主要为网学会员提供“JSP教程_标准标签库JSTL - 其它资料”,希望对需要JSP教程_标准标签库JSTL - 其它资料网友有所帮助,学习一下!
第 17 章 标准标签库JSTL 第 16 章介绍了自定义标签的开发,本章所介绍的内容和前一章有关联。
标准标签库 JSTL 是由自定义标签产生的,它抽取出了最为常用的标签操作。
可以说标准标签库实现了对通用操作的封装。
有效的利用标准标签库以及自定义标签可使
JSP 页面风格统一,给 Web 开发人员带来开发和维护上的方便。
本章要点包括以下内容: JSTL 简介 JSTL 标签库的安装 核心标签库的使用方法 国际化标签库的使用方法 XML 标签库的使用方法 函数标签库的使用方法 SQL 标签库的使用方法 17.1 JSTL简介 标准标签库 JSTL 的全名为 Java Server Pages Standard Tag Library。
它是由 JCP(Java CommnunityProcess)所指定的标准规范,它主要是给 Java Web 开发者提供了一个标准的通用标签库。
通过 JSTL,可以部分地取代传统
JSP 程序中嵌入 Java 代码的做法, 可以使得
JSP 页面程序的风格趋于统一,并且容易维护。
从
JSP1.1 规范开始就开发支持在
JSP 文件中使用自定义标签了,就是因为自定义标签的广泛使用,从而使得大量的同功能标签不断地重复定义,为了减少对解决类似通用问题的独立标记库的需求,在Java Community Process(JSR 52)的赞助下创建了 JSTL(JavaServer Pages Standard Tag Library,JSTL)标准标记库,为解决这些通用功能提供一个单一的标准解决方案。
JSTL 是一个开放源代码的
JSP 标签库,并且还在不断地完善过程中。
JSTL 特别为条件处理、迭代、国际化、数据库访问和可扩展标记语言(XML)处理提供支持。
JSTL 还引入了 expression language(EL,表达式语言),极大地简化了对
JSP 中应用数据的访问和操作。
JSTL 至今主要为开发者提供了如下五大类的标签库: (1)核心标签库:为日常任务提供通用支持,如显示和设置变量、重复使用一组项目、测试条件以及其他操作(如导入和重定向 Web 页面等)。
(2)国际化(I18N)标签库:支持多国语种的应用程序。
(3)SQL 标签库:对访问和修改数据库提供标准化支持。
(4)XML 标签库:对 XML 文件处理和操作的支持,包括 XML 节点的解析、迭代、基于 XML 数据的条件评估以及可扩展样式语言转换(Extensible Style Language Transformations,XSLT)的执行。
(5)函数标签库:通过在 EL 表达式中调用函数标签库中的函数来实现特定的操作。
例如fn:containsstring substring,判断 string 字符串中是否包含 substring 字符串。
表 17.1 展示了各标签库的使用方法。
第 18 章 常用插件扩展点 239 表 17.1 JSTL标准标签库 标签库 URI 前缀 使用模式 核心标签库 http://java.sun.com/jstl/core c ltc:tagname…gt 国际化(I18N)标签库 http://java.sun.com/jstl/fmt fmt ltfmt:tagname…gt SQL标签库 http://java.sun.com/jstl/sql sql ltsql:tagname…gt XML标签库 http://java.sun.com/jstl/xml x ltx:tagname…gt 函数标签库 http://java.sun.com/jstl/functions fn fn:functionName17.1.1 使用JSTL的优点 JSTL(标准标签库)的使用对
JSP/servlet 开发者来说是一个重大的进展,因为它存在很多的优点,并且很有可能在不久的将来成为实现动态、基于 Java 站点的一个主要方法。
概括起来,JSTL 主要的优点如下: (1)在所有的应用服务器之间提供了一致的接口程序,这样可以最大程度地提供 Web 应用程序在各种应用服务器之间的可移植性。
(2)简化了
JSP 的 Web 应用系统的开发,并且使得
JSP 页面的编程风格统一、易于维护。
(3)大量使用 JSTL 提供的逻辑操作(例如迭代、判断,甚至数据库访问),可以大大减少
JSP 中脚本代码(Scriptlets)的数量,甚至可以没有任何脚本代码就可以实现其大部分动态效果。
(4)运行
JSP 设计工具与 Web 应用程序开发的进一步集成,虽然现在支持 JSTL 开发的 IDE 开发工具还没有出现(或者正是由于这个原因,使得 JSTL 还不这么流行),但是可以相信不久就会有支持JSTL 的开发工具出现。
JSTL 已经封装了
JSP 中很多常用的功能,比如,可以使用 JSTL 中的标签来进行迭代输出某个 List或者 Set 集合类。
注意:由于从
JSP1.1 规范才开始支持
JSP 中的自定义标签,所以 JSTL 需要运行在支持
JSP1.2 和Servlet2.3 规范的容器上,比如 Tomcat4.x 和 Tomcat5.x 服务器。
17.2 JSTL的安装 JSTL 标准标签库的安装非常简单,下面具体介绍 JSTL 的下载和安装配置过程。
17.2.1 JSTL标签库的下载 在 jakarta.apache.org 网站上下载 JSTL 安装包。
单击主页面中的 “Taglibs” 链接,然后选择“Standard1.1 Taglib”下载。
下载完的文件全名为:jakarta-taglibs-standard-1.1.2.tar.gz。
17.2.2 安装配置JSTL标签库 具体的安装配置过程如下: (1)把下载的文件 jakarta-taglibs-standard-1.1.2.tar.gz 解压,得到如图 17.1 所示的文件夹和文件。
这里有一个名为 standard-examples.war 的文件,它是示范 JSTL 用法的例子程序,读者可以把它部署到相应服务器上,以便能够快速学习 JSTL。
部署非常简单, 只要把这个 war 文件复制到 Tomcat 的 webapps240 Eclipse 从入门到精通目录下,然后直接调用即可。
图 17.1 JSTL 目录结构 (2)在 Web 模块下的 WEB-INF 目录下创建一个 tlds 文件夹。
(3)把 jakarta-taglibs-standard-1.1.2tld 目录下的所有 tld 文件复制到 Web 模块下的 WEB-INFtlds目录下。
将 (4) jakarta-taglibs-standard-1.1.2lib 目录下的所有 jar 文件复制到 Web 模块下的 WEB-INFlib 目录下。
(5)接下来需要在 WEB-INF/web.xml 文件中进行相应的部署描述,在文件的lt/web-appgt前面部分添加如下描述代码: lttaglibgt lttaglib-urigthttp://java.sun.com/jstl/fmtlt/taglib-urigt lttaglib-locationgt/WEB-INF/tlds/fmt.tldlt/taglib-locationgt lt/taglibgt lttaglibgt lttaglib-urigthttp://java.sun.com/jstl/corelt/taglib-urigt lttaglib-locationgt/WEB-INF/tlds/c.tldlt/taglib-locationgt lt/taglibgt lttaglibgt lttaglib-urigthttp://java.sun.com/jstl/sqllt/taglib-urigt lttaglib-locationgt/WEB-INF/tlds/sql.tldlt/taglib-locationgt lt/taglibgt lttaglibgt lttaglib-urigthttp://java.sun.com/jstl/xlt/taglib-urigt lttaglib-locationgt/WEB-INF/ tlds/x.tldlt/taglib-locationgt lt/taglibgt lttaglibgt lttaglib-urigthttp://java.sun.com/
jsp/jstl/functionslt/taglib-urigt lttaglib-locationgt/WEB-INF/tlds/fn.tldlt/taglib-locationgt lt/taglibgt 代码说明:在 web.xml 文件描述需要使用到的标签库,这里定义了之上介绍到的五个标准标签库。
在lttaglib-urigt元素定义该标签的唯一表示,
JSP 文件中就是通过该值来引用相应标签的。
lttaglib-locationgt 第 18 章 常用插件扩展点 241定义标签库所在的位置,本书已将所有标准标签库放置在 WEB-INFtlds 目录下。
至此,就已经成功地把 JSTL 标准标签支持安装和部署了。
17.2.3 实例示范 通过 Eclipse+Lomboz 创建一个名为 MyJSTL 项目,Web 模块名为 JSTL,然后按照上面的配置方法来配置 JSTL 标签库。
下面建立一个简单的例子来查看是否可以正确使用 JSTL 标准标签。
在 Web 模块中创建一个 helloJSTL.
jsp 文件。
该文件的详细源代码如下: lt page contentTypequottext/htmlcharsetGBKquot gt lt page isELIgnoredquotfalsequot gt lt taglib prefixquotcquot uriquothttp://java.sun.com/
jsp/jstl/corequot gt lthtmlgt ltheadgt lttitlegtJSTL Example--hello JSTLlt/titlegt lt/headgt ltbody bgcolorquotFFFFFFquotgt lth4gtltc:out valuequot第一个 JSTL 的
JSP 程序,使用 JSTL 的标签迭代输出信息quot/gtlt/h4gt lt String items new String3 items0 quot核心标签库quot items1 quot国际化标签库quot items2 quotSQL 标签库quot request.setAttributequotitemsquotitems //把数组变量保存在 request 中 gt lttable borderquot1quotgt ltc:forEach varquotitemquot itemsquotitemsquotgt lttrgt lttdgtltc:out valuequotitemquot/gtlt/tdgt lt/trgt lt/c:forEachgt lt/tablegt lt/bodygt lt/htmlgt 程序说明: (1)当在一个页面中使用 JSTL 标签库时,需要在lt taglib gt指令中包含这个标签库,同时要指定标签的前缀。
例如,此处的设置为lt taglib prefixquotcquot uriquothttp://java.sun.com/
jsp/jstl/corequot gt。
(1)在 page 指令中指定 isELIgnoredquotfalsequot,使得该页面支持 EL 表达式的输出。
(2)该程序使用了核心标签库中的 out 和 forEach 两个标签,第一标签用来输出数据,第二个标签用来进行迭代处理,这将在后面重点讲解。
(3)运行这个页面,如果出现如图 17.2 所示,则表示 JSTL 标签库的安装和设置正确,可以正常执行。
242 Eclipse 从入门到精通 图 17.2 helloJSTL.
jsp 页面效果 17.3 核心标签库 这一小节将重点向读者介绍 JSTL 中一组专门负责表达式操作以及流程控制的标签,这包括:out、set、remove、catch、if、choose、when 和 URL 等。
在下面的讲解过程可能会经常使用到 EL 表达式,例如之上的例子就是使用到了 EL 表达式。
关于 EL 表达式的介绍将在下面章节重点介绍。
17.3.1 表达式操作标签 表达式操作标签包括 out、set、remove 和 catch。
17.3.1.1 out 标签 核心标签库中最为基本的标签就是ltc:outgt。
它可以在页面中显示一个字符串或者一个 EL 表达式的值。
它的功能与
JSP 传统的lt表达式gt相类似。
out 标签的使用格式如下: ltc:out value”object” escapeXml”truefalse” /gt 这个标签还可以有一个体,如下: ltc:out value”object” escapeXml”truefalse” gtdefault valuelt/c:outgt 这表示当 value 属性指定的 object 值为 null 时,就会显示体中指定的值(也就是 default value),体中也可以是
JSP 代码。
ltc:outgt中的各个属性: value:可以指定一个字符串作为输出内容,也可以为 EL 表达式,例如35。
escapeXml:类型为 boolean,确定lt、gt、amp、’、”等这些字符在结构的字符串中是否被转换成字 符串实体代码,默认的是 true。
default value:可以是字符串,还是一个表达式(EL 表达式或者lt表达式gt的
JSP 表达式)。
如果属性指定的表达式或者对象值为 null 时,那么将输出这个 default value 部分的值。
下面通过一个ltc:outgt的简单实例,来示范以上各属性设置的效果,创建的 c_out.
jsp 页面代码如下: lt page contentTypequottext/htmlcharsetGBKquot gt lt page isELIgnoredquotfalsequot gt lt taglib prefixquotcquot uriquothttp://java.sun.com/
jsp/jstl/corequot gt lth4gtltc:out valuequot核心标签库中的 out 标签的简单实例quot/gtlt/h4gt ltc:out valuequot37quot/gtltbrgt 第 18 章 常用插件扩展点 243 ltc:out valuequotltpgt有特殊字符lt/pgtquot /gtltbrgt ltc:out valuequotltpgt有特殊字符lt/pgtquot escapeXmlquotfalsequot /gt 程序说明: (1)ltc:out valuequot核心标签库中的 out 标签的简单实例quot/gt直接输出 value 指定的字符串值。
(2)ltc:out valuequot37quot/gt中使用了 EL 表达式,输出 EL 表达式的计算结果 10。
(3)ltc:out valuequotltpgt有特殊字符lt/pgtquot /gt中因为默认 escapeXml 值为 true,即把ltpgt转换成字符实体代码,这段代码输出的 HTML 为: ltpgt有特殊字符lt/pgt (4)ltc:out valuequotltpgt有特殊字符lt/pgtquot escapeXmlquotfalsequot /gt中设置了 escapeXmlquotfalsequot,所以输出的 HTML 为: ltpgt有特殊字符lt/pgt 该
JSP 文件运行的效果如图 17.3 所示。
图 17.3 c_out.
jsp 页面效果 17.3.1.2 set 标签 set 标签是使用来在某个范围(request、session 或者 application)内设值,或者设置某个对象的属性值。
set 标签的使用格式如下: (1)使用 value 属性在一个特定的范围内指定某个变量的值,其使用格式如下: ltc:set var”varName” value”varValue” scope”pagerequestsessionapplication” /gt (2)当使用 value 属性在一个特定范围内指定某个变量的值时,也可以包括一个体,它的作用和out 标签体的作用一样,即 value 指定的值为 null 时,默认使用体中指定的值,使用格式如下: ltc:set var”varName” value” Value” scope”pagerequestsessionapplication” gt default value lt/c:setgt (3)设置某一个特定对象属性的使用格式如下: ltc:set property”propertyName” target”target” value”value” /gt (4)在设置某个特定对象的一个属性时,也可以有一个体,也指定默认值,使用格式如下: ltc:set property”propertyName” target”target” value”value” gt default value lt/c:setgt 该标签中的各属性说明如下: value:该属性指定变量或者对象中某个属性的值,并且可以是一个表达式。
var:变量名称,value 属性指定的值就保存在这个变量中。
244 Eclipse 从入门到精通 scope:设定变量的有效范围,如果不设置,则默认为 page。
target:设置属性的一个对象,它必须是 JavaBean 或者 java.util.Map 对象。
property:设置对象中的一个属性。
接下来给出一个ltc:setgt标签的应用实例,创建的 c_set.
jsp 页面代码如下: lt page contentTypequottext/htmlcharsetGBKquot gt lt page isELIgnoredquotfalsequot gt lt taglib prefixquotcquot uriquothttp://java.sun.com/
jsp/jstl/corequot gt lthtmlgt ltheadgt lttitlegtJSTL: -- Set 标签实例lt/titlegt lt/headgt ltbodygt lth3gtset 标签实例lt/h3gt lthrgt lt-- 通过 set 标签赋值 --gt ltc:set varquotnum1quot scopequotrequestquot valuequot35quot/gt ltc:set varquotnum2quot scopequotsessionquot gt 36 lt/c:setgt ltc:set varquotnum3quot scopequotsessionquot gt 10 lt/c:setgt ltbrgt lt-- 通过 out 标签输出变量值 --gt num1 变量值为:ltc:out valuequotnum1quot /gtltbrgt num2 变量值为:ltc:out valuequotnum2quot /gtltbrgt num3 变量值为:ltc:out valuequotnum3quot /gt lt/bodygt lt/htmlgt 程序说明:在这个页面程序中使用三种赋值方法给三个变量 num1、num2 和 num3 赋值。
然后使用out 标签把变量值输出。
运行效果如图 17.4 所示。
图 17.4 c_set.
jsp 页面效果 17.3.1.3 remove 标签 remove 标签一般和 set 标签配套使用,两者是相对应的,remove 标签用于删除某个变量或者属性。
使用格式如下: ltc:remove var”varName” scope”pagerequestsessionapplication” /gt 第 18 章 常用插件扩展点 245 remove 标签中使用的各属性说明如下: scope:设定这个需要删除的变量所在范围。
var:需要删除的变量或者对象属性的名称。
如果没有设置 scope 的属性,即采用默认值,那么就相当于调用 PageContext.removeAttributevarName方法;如果指定了这个变量所在的范围,那么系统会调用 PageContext.removeAttributevarNamescope方法。
接下来还是通过一个实例来了解 remove 标签的使用,创建的 c_remove.
jsp 源代码如下: lt page contentTypequottext/htmlcharsetGBKquot gt lt page isELIgnoredquotfalsequot gt lt taglib prefixquotcquot uriquothttp://java.sun.com/
jsp/jstl/corequot gt lthtmlgt ltheadgt lttitlegtJSTL: -- Set 标签实例lt/titlegt lt/headgt ltbodygt lth3gtset 标签实例lt/h3gt lthrgt lt-- 通过 set 标签赋值 --gt ltc:set varquotnumquot scopequotpagequot valuequot35quot/gt lt-- 此定义的变量只能在本页范围内有效 --gt ltc:set varquotnumquot scopequotrequestquot gt 36 lt/c:setgt ltc:set varquotnumquot scopequotsessionquot gt ltc:out valuequot10quot/gt lt/c:setgt lt-- 变量显示 --gt lttable borderquot1quot widthquot50quotgt lttrgt lttdgtpageScope.numlt/tdgtlttdgtltc:out valuequotpageScope.numquot defaultquotNULLquot /gtlt/tdgt lt/trgt lttrgt lttdgtrequestScope.numlt/tdgtlttdgtltc:out valuequotrequestScope.numquot defaultquotNULLquot /gtlt/tdgt lt/trgt lttrgt lttdgtsessionScope.numlt/tdgtlttdgtltc:out valuequotsessionScope.numquot defaultquotNULLquot /gtlt/tdgt lt/trgt lt/tablegt lt-- 使用 remove 标签删除 page 范围中的 num 之后,变量值的显示 --gt ltc:out valueltc:remove varquotnumquot scopequotpagequot /gt之后,各变量的值:/gt ltc:remove varquotnumquot scopequotpagequot /gt lttable borderquot1quot widthquot50quotgt lttrgt lttdgtpageScope.numlt/tdgtlttdgtltc:out valuequotpageScope.numquot defaultquotNULLquot /gtlt/tdgt lt/trgt lttrgt lttdgtrequestScope.numlt/tdgtlttdgtltc:out valuequotrequestScope.numquot defaultquotNULLquot /gtlt/tdgt lt/trgt lttrgt lttdgtsessionScope.numlt/tdgtlttdgtltc:out valuequotsessionScope.numquot defaultquotNULLquot /gtlt/tdgt246 Eclipse 从入门到精通 lt/trgt lt/tablegt lt-- 使用 remove 标签删除 num 之后scope 没有指定,即把所有范围内的变量删除,变量值的显示 --gt ltc:out valueltc:remove varquotnumquot /gt之后,各变量的值:/gt ltc:remove varquotnumquot /gt lttable borderquot1quot widthquot50quotgt lttrgt lttdgtpageScope.numlt/tdgtlttdgtltc:out valuequotpageScope.numquot defaultquotNULLquot /gtlt/tdgt lt/trgt lttrgt lttdgtrequestScope.numlt/tdgtlttdgtltc:out valuequotrequestScope.numquot defaultquotNULLquot /gtlt/tdgt lt/trgt lttrgt lttdgtsessionScope.numlt/tdgtlttdgtltc:out valuequotsessionScope.numquot defaultquotNULLquot /gtlt/tdgt lt/trgt lt/tablegt lt/bodygt lt/htmlgt 程序说明: (1)此程序中,首先在三种不同范围内指定了 num 变量的值。
(2)ltc:remove varquotnumquot scopequotpagequot /gt表示把在 page 范围内设定的 num 变量删除掉,而其他范围内的 num 变量则可以正常显示原有值,效果请看图 9.4 所示。
(3)ltc:remove varquotnumquot /gt表示把所有范围内的 num 变量全部删除。
图 17.5 c_remove.
jsp 页面效果 17.3.1.4 catch 标签 catch 标签的功能和 Java 程序中 try…catch语句功能很类似,它用于捕获嵌入到它中间语句抛出的异常。
这个标签的使用格式如下: ltc:catch var”varName” gt 相关操作语句 lt/c:catchgt 第 18 章 常用插件扩展点 247 这个标签中的 var 属性用于保存异常错误的一个变量名。
下面还是通过一个实例来具体了解 catch标签的使用,创建的 c_catch.
jsp 页面代码如下: lt page contentTypequottext/htmlcharsetGBKquot gt lt page isELIgnoredquotfalsequot gt lt taglib prefixquotcquot uriquothttp://java.sun.com/
jsp/jstl/corequot gt.