7
第七章
JSTL 1.1
JSTL 全名为 JavaServer Pages Standard Tag Library,目前最新的版本为 1.1
版。JSTL 是由 JCP(Java Community Process)所制定的标准规范,它主要提供给
Java Web 开发人员一个标准通用的标签函数库。
Web 程序员能够利用 JSTL 和 EL 来开发 Web 程序,取代传统直接在页面上
嵌入 Java 程序(Scripting)的做法,以提高程序的阅读性、维护性和方便性。
本章中,笔者将详细介绍如何使用 JSTL 中各种不同的标签,将依序介绍条
件、循环、URL、U18N、XML、SQL 等标签的用法,让读者对 JSTL 有更深层
的了解,并且能够学会如何使用 JSTL。本章将分 6 节来介绍:
7-1 JSTL 1.1 简介
7-2 核心标签库 (Core tag library)
7-3 I18N 格式标签库 (I18N-capable formatting tags library)
7-4 SQL 标签库 (SQL tag library)
7-5 XML 标签库 (XML tag library)
7-6 函数标签库 (Functions tag library)
JSP2.0
技术手册
第七章
JSTL 1.1
126
JSP2.0
技术手册
7-1 JSTL 1.1
简介
JavaServer Pages Standard Tag Library (1.1 ),它的中文名称为 JSP 标准标签函数库。JSTL 是
一个标准的已制定好的标签库,可以应用于各种领域,如:基本输入输出、流程控制、循环、
XML 文件剖析、数据库查询及国际化和文字格式标准化的应用等。从表 7-1 可以知道,JSTL
所提供的标签函数库主要分为五大类:
(1) 核心标签库 (Core tag library)
(2) I18N 格式标签库 (I18N-capable formatting tag library)
(3) SQL 标签库 (SQL tag library)
(4) XML 标签库 (XML tag library)
(5) 函数标签库 (Functions tag library)
表 7-1
JSTL
前置名称
URI
范 例
核心标签库
c http://java.sun.com/jsp/jstl/core <c:out>
I18N 格式标签库
fmt http://java.sun.com/jsp/jstl/xml <fmt:formatDate>
SQL 标签库
sql http://java.sun.com/jsp/jstl/sql <sql:query>
XML 标签库
xml http://java.sun.com/jsp/jstl/fmt <x:forBach>
函数标签库
fn http://java.sun.com/jsp/jstl/functions <fn:split>
另外,JSTL 也支持 EL(Expression Language)语法,例如:在一个标准的 JSP 页面中可能会
使用到如下的写法:
<%= userList.getUser().getPhoneNumber() %>
使用 JSTL 搭配传统写法会变成这样:
<c_rt:out value="<%= userList.getUser( ).getPhoneNumber( ) %>" />
使用 JSTL 搭配 EL,则可以改写成如下的形式:
<c:out value="${userList.user.phoneNumber}" />
虽然对网页设计者来说,假如没有学过 Java Script 或者是第一次看到这种写法时,可能会
搞不太懂,但是与 Java 语法相比,这应该更加容易学习。
7-1-1
安装使用
JSTL 1.1
JSTL 1.1 必须在支持 Servlet 2.4 且 JSP 2.0 以上版本的 Container 才可使用。JSTL 主要由 Apache 组织
的Jakarta Project 所实现,因此读者可以到
http://jakarta.apache.org/builds/jakarta-taglibs/releases/standard/ 下载实
现好的 JSTL 1.1,或者直接使用本书光盘中 JSTL 1.1,软件名称为:jakarta-taglibs-standard-current.zip
。
下载完后解压缩,可以发现文件夹中所包含的内容如图 7-1 所示:
7-1 JSTL 1.1
简介
127
图 7-1 jakarta-taglibs-standard-1.1.0-B1 的目录结构
将 lib 中的 jstl.jar
、
standard.jar 复制到 Tomcat 的 WEB-INF\lib 中,然后就可以在 JSP 网页中使
用 JSTL 了。除了复制 .jar 文件外,最好也把 tld 文件的目录也复制到 WEB-INF 中,以便日后使用。
注意
lib 目录下,除了 jstl.jar 和 standard.jar 之外,还有 old-dependencies 目录,这目录里面的东西是
让之前 JSTL 1.0 的程序也能够在 JSTL 1.1 环境下使用。tld 目录下有许多 TLD 文件,其中大部
分都是 JSTL 1.0 的 TLD 文件,例如:c-1_0.tld 和 c-1_0-rt.tld。
下面写一个测试用的范例程序 HelloJSTL.jsp,程序主要是显示浏览器的版本和欢迎的字符串。
HelloJSTL.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>测试你的第一个使用到 JSTL 的网页</title>
</head>
<body>
<c:out value="欢迎测试你的第一个使用到 JSTL 的网页"/>
</br>你使用的浏览器是:</br>
<c:out value="${header['User-Agent']}"/>
<c:set var="a" value="David O'Davies" />
<c:out value="David O'Davies" escapeXml="true"/>
</body>
</html>
在 HelloJSTL.jsp 的范例里,笔者用到核心标签库(Core)中的标准输出功能和 EL 的 header
隐含对象。若要在 JSP 网页中使用 JSTL 时,一定要先做下面这行声明:
<
%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
这段声明表示我将使用 JSTL 的核心标签库。一般而言,核心标签库的前置名称(prefix)都
JSP2.0
技术手册
第七章
JSTL 1.1
128
为 c,当然你也可以自行设定。不过 uri 此时就必须为 http://java.sun.com/jsp/jstl/core。
注意
JSTL 1.0 中,核心标签库的 uri 默认为 http://java.sun.com/jstl/core,比 JSTL 1.1 少一个 jsp/ 的路径。
因为 JSTL 1.1 同时支持 JSTL 1.0 和 1.1,所以假若核心标签库的 uri 为
http://java.sun.com/jstl/core,
则将会使用到 JSTL 1.0 的核心标签库。
接下来使用核心标签库中的 out 标签,显示 value 的值。${header['User-Agent']}表示取
得表头里的 User-Agent 的值,即有关用户浏览器的种类。
<c:out value="欢迎测试你的第一个使用到 JSTL 的网页" />
<c:out value="${header['User-Agent']}" />
HelloJSTL.jsp 的执行结果如图 7-2 所示。
图 7-2 HelloJSTL.jsp 的执行结果
假若读者想要自定义 taglib 的 uri 时,那就必须在 web.xml 中加入设定值。例如:假若 uri
想要改为 http://www.javaworld.com.tw/jstl/core 时,web.xml 就必须加入如下设定:
<web-app>
:
<jsp-config>
<taglib>
<taglib-uri>http://www.javaworld.com.tw/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/tld/c.tld</taglib-location>
</taglib>
</jsp-config>
:
</web-app>
在上面的设定中,<taglib-uri>主要是设定标签库的 URI;而<taglib-location>则是用来设
定标签对应的 TLD 文件。因此,使用<%@ taglib %>指令时,可以直接写成如下语句:
<%@ taglib prefix="c" uri="http://www.javaworld.com.tw/jsp/jstl/core" %>
7-1-2 JSTL 1.1 VS. JSTL 1.0
JSTL 1.0 更新至 JSTL 1.1 时,有以下几点不同:
JSP2.0
技术手册
7-1 JSTL 1.1
简介
129
JSP2.0
技术手册
(1)
EL 原本是定义在 JSTL 1.0 的,现在 EL 已经正式纳入 JSP 2.0 标准规范中,所以在 JSTL
1.1 规范中,已经没有 EL 的部分,但是 JSTL 依旧能使用 EL。
(2) JSTL 1.0 中,又分 EL 和 RT 两种函数库,到了 JSTL 1.1 之后,已经不再分这两种了。
以下说明 EL 和 RT 的差别:
EL
完全使用 Expression Language
简单
建议使用
RT
使用 Scriptlet
Java 语法
供不想转换且习惯旧表示法的开发者使用
笔者在此强烈建议大家使用 EL 来做,简单又方便。
(3) JSTL 1.1 新增函数(functions)标签库,主要提供一些好用的字符串处理函数,例如:
fn:contains、fn:containsIgnoreCase、fn:endsWith、fn:indexOf、fn:join、fn:length、
fn:replace、fn:split、fn:startsWith 和 fn:substring 等等。
除了上述三项比较大的改变之外,还包括许多小改变,在此不多加说明,有兴趣的读者可
以去看 JSTL 1.1 附录 B“Changes”部分,那里有更详尽的说明。
7-1-3
安装
standard-examples
当解压缩 jakarta-taglibs-standard-current.zip 后,文件夹内(见图 7-1)有一个 standard-examples.war
的文件,将它移至 Tomcat 的 webapps 后,重新启动 Tomcat 会发现,在 webapps 目录下多
了一个 standard-examples 的目录。接下来我们打开 IE,在 URL 位置上输入
http://localhost:8080/
standard-examples
,你将会看到图 7-3 所示的画面。
这个站台有很多 JSTL 的范例,它包括以下几部分:
General Purpose Tags
Conditional Tags
Iterator Tags
Import Tags
I18N & Formatting Tags
XML Tags
SQL Tags
Functions
Tag Library Validators
Miscellaneous