第六章 JSTL 简介:
JavaServer Pages Standard Tag Library(JSTL),称为JSP标准标签函数库。JSTL是一个标准的已制定好的标签库,可以用于各种领域。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)
JSTL
前置名称
URI
范例
核心标签库
c
http://java.sun.com/jsp/jstl/core
I18N格式标签库
fmt
http://java.sun.com/jsp/jstl/fmt
SQL标签库
sql
http://java.sun.com/jsp/jstl/sql
XML标签库
xml
http://java.sun.com/jsp/jstl/xml
函数标签库
fn
http://java.sun.com/jsp/jstl/funcations
JSTL支持EL语法。示例: 第一节 核心标签库(Core tag library)
核心标签库主要有:基本输入输出、流程控制、迭代操作和URL操作。
分类
功能分类
标签名称
Core
基本输入输出
out
set
remove
catch
流程控制
if
choose
when
otherwise
迭代操作
forEach
forTokens
URL操作
import
param
url
param
redirect
param
在JSP中要使用JSTL中的核心标签库时,必须使用指令,并且设定prefix和uri的值。设定如下:
(1) 基本输入输出
基本输入输出中包含四个标签:、、和。以下我们详细介绍四个标签的用法。
l
主要用来显示数据的内容。
语法1:
语法2:
属性
名称
说明
EL
类型
必须
默认值
value
需要显示的值
Y
Object
是
无
default
如果value值为null,则显示default的值
Y
Object
否
无
escapeXml
是否转换特殊字符,如:转换为<
Y
boolean
否
true
说明:
示例:
l
l
l
(2) 第二节 .与[]运算符
EL提供.和[]两种运算符来存取数据。下列两者所代表的意思是一样的:
等于
.和[]也可以同时混合使用,如下:
不过,以下两种情况,两者会有差异:
(1)当要存取的属性名称中包含一些特殊字符,如.或-等非字母或数字的符号,就一定要使用[],例如:
上述是不正确的方式,应当改为:
(2)我们考虑下列情况:
此时,data是一个变量,假如data的值为“sex”时,那上述的例子等于${sessionScope.user.sex};因此,如果要动态取值时,就可以用上述的方法来做,但.无法做到动态取值。
接下来,我们详细地讨论一些情况。假设有一个EL:
(1)当expr-a的值为null时,它会回传null。
(2)当expr-b的值为null时,它会回传null。
(3)当expr-a的值为Map类型时:
l 假若!value-a.containsKey(value-b)为真,则回传null。
l 否则回传value-a.get(value-b)。
(4)当expr-a的值为List或array类型时:
l 将value-b的值强制转型为int,假若不能转型为int时,会产生error。
l 假若value-a.get(value-b)或Array.get(value-a,value-b)产生ArrayIndexOutOfBoundsException或IndexOutOfBoundsException时,则回传null。
l 假若value-a.get(value-b)或Array.get(value-a,value-b)产生其他的异常时,则会产生error。
l 最后都没有任何异常产生时,回传value-a.get(value-b)或Array.get(value-a,value-b)。
(5)当expr-a的值为JavaBean对象时:
l 将value-b的值强制转型为String。
l 假若 getter产生异常时,则会产生error。若没有异常产生时,则回传getter的结果。 第三节 EL变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page范围找,假如找不到,再依序到Request、Session、Application范围。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。