10标准标签库.docx
《10标准标签库.docx》由会员分享,可在线阅读,更多相关《10标准标签库.docx(40页珍藏版)》请在冰豆网上搜索。
10标准标签库
JSTL:
Java标准标签库
JSP技术通过在Html中插入Java代码(脚本)的方式实现动态网页内容。
那么,对于不熟悉Java语言的人,能不能编写JSP页面呢?
在JSP规范的1.1版中增加了自定义标签库规范,自定义标签库是一种非常优秀的表现层组件技术。
通过使用自定义标签库,可以在简单的标签中封装复杂的Java脚本实现的功能。
在页面里使用JSTL标签可以使美工象处理HTML标签一样对待,增加了代码的可读性。
此外,在比较大的项目中使用标签库可以减少代码量。
然而,自定义标签很容易造成重复定义和非标准的实现。
鉴于此,出现了JSP标准标签库JSTL(JSPStandardTagLibrary),为大多数JSP页面逻辑提供了实现。
JSTL还可以在应用程序服务器之间提供了一致的接口,最大程度地提高了WEB应用在各应用服务器之间的移植。
Sun公司Java规范标准的JSTL一直以来由ApacheJakarta项目组负责维护,作为开源的标准技术,它一直在不断地完善。
但是在2010年4月14日该工程转入ApacheAttic,意味着JSTL将不再产生新的版本。
JSTL总共发布包有两个版本:
Standard-1.0Taglib和Standard-1.1Taglib,它们在使用时略有不同:
ØStandard-1.0Taglib(JSTL1.0)支持Servlet2.3和JSP1.2规范,Web应用服务器Tomcat4支持这些规范,而它的发布也在Tomcat4.1.24测试通过了。
ØStandard-1.1Taglib(JSTL1.1)支持Servlet2.4和JSP2.0规范,Web应用服务器Tomcat5支持这些规范,它的发布在Tomcat5.0.3测试通过了。
JSTL由表达式语言和四个定制标记库(core、format、xml和sql)组成。
表达式语言类似于简化的JSP表达式,提供了一些标识符、存取器和运算符,用来检索和操作驻留在JSP容器中的数据。
核心(core)标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。
它还提供了用来生成和操作URL的标记。
顾名思义,国际化(format)标记库定义了用来格式化数据(尤其是数字和日期)的操作。
它还支持使用本地化资源束进行JSP页面的国际化。
xml库包含一些标记,这些标记用来操作通过XML表示的数据,而数据库(sql)标签库定义了用来查询关系数据库的操作。
本讲涉及的重要知识将包括以下JSTL1.1规范中的标签库:
Ø核心标签库:
包含Web应用的常见工作,比如:
循环、表达式赋值、基本输入输出等。
Ø国际化标签库:
用来格式化显示数据的工作,比如:
对不同区域的日期格式化等。
Ø数据库标签库:
可以做访问数据库的工作。
ØXML标签库:
用来访问XML文件的工作,这是JSTL标签库的一个特点。
此外,JSTL还提供了EL(ExpressionLanguage)表达式语言来进行辅助的工作。
因此,下面将首先学习EL表达式语言。
在JSTL1.1规范中,JSP2.0容器已经能够独立的理解任何EL表达式。
EL可以独立出现在JSP页面的任何角落。
1.1表达式语言(ExpressionLanguage)
在前面的章节中,我们学习了JSP页面的构成,知道JSP表达式是JSP脚本中的一种(另外两种分别是JavaScriptlet和JSP声明)。
本节要学习的表达式语言EL(ExpressionLanguage)是用另一种更简单的形式来书写JSP的表达式。
在JSP2.0中默认是启用EL表达式,但是如果在页面中使用 <%@ pageisELIgnored="true"%>表示禁用EL语言。
1.1.1EL简介
EL(ExpressionLanguage)目的是为了使JSP写起来更加简单。
它的灵感来自于ECMAScript和XPath表达式语言,它提供了在JSP中简化表达式的方法。
它是一种简单的语言,基于可用的命名空间(PageContext属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到Java类中静态方法的可扩展函数以及一组隐式对象。
EL提供了在JSP脚本编制元素范围外使用运行时表达式的功能。
脚本编制元素是指页面中能够用于在JSP文件中嵌入Java代码的元素。
它们通常用于对象操作以及执行那些影响所生成内容的计算。
JSP2.0将EL表达式添加为一种脚本编制元素。
语法结构
在JSP页面中调用EL表达式的一般格式为:
${expression}
其中,expression表示一个有效的EL表达式。
一个EL表达式由操作数(一般为变量或文字)和操作符以及方法调用构成。
关于有效EL表达式参见1.1.2。
变量
EL存取变量数据的方法很简单,例如:
${username}。
它的意思是取出某一范围中名称为username的变量。
由于没有指定哪一个范围的username,所以它会依序从page、request、session、application范围内进行查找。
如找到username,就返回该值,不再继续查找;如果全部的范围都没有找到该变量,则返回null。
各内置变量的属性范围在EL中的名称对应于下表:
表示范围的内置对象
EL中对应的属性范围变量名称
page
pageScope
request
requestScope
session
sessionScope
application
applicationScope
EL中可以使用的默认变量分为作用域变量、请求参数变量等,将在下节具体介绍。
EL中的对象数据访问
EL提供“.”和“[]”两种运算符来存取对象中的数据,使用方法类似对Java中对象属性或数组元素的访问。
这两个操作符有时可以通用,但在下面两种情况下有所区别。
当要存取的属性名称中包含一些特殊字符,如.或?
等并非字母或数字的符号时,就一定要使用“[]”。
例如:
${user.My-Name}应当改为${user["My-Name"]}。
同时如果要动态取值时(即要获取的值的名称由变量表示,其值会根据运行环境的不同发生变化),就必须用“[]”来实现,而“.”无法做到动态取值。
例如:
${sessionScope.user[data]}中data是一个变量时只能使用“[]”进行获取。
而user是sessionScope中的一个变量,该变量名是静态的,可以使用“.”进行获取。
关于EL中的其他操作符的使用请参见下节。
1.1.2EL中的有效表达式
类似于Java或JSP的表达式,一个有效的EL表达式可以包含文字、操作符、变量(对象引用)和方法调用。
下面将分别对每种表达式的构成元素进行讲解。
文字
EL中可以使用的文字包括布尔类型、整数类型、小数类型、字符串类型以及空值类型,类似于Java中的值,其对应可使用的值见下表:
文字类型
文字的值
布尔类型
true和false
整数类型
与Java相同,可以是任何带符号整数,如24,-45等。
小数类型
与Java相同,可以是任何带符号小数,如-1.8E-3,4.5等。
字符串类型
任何由单引号或双引号限定的字符串。
对于单引号、双引号和反斜杠,使用反斜杠字符作为转义序列。
必须注意:
如果在字符串两端使用双引号,则单引号不需要转义。
空值类型
null
操作符
EL表达式可使用的操作符大部分与Java中的操作符相同。
操作符可以帮助完成各种所需的操作,之前的示例中“.”、“[]”就是其中的两个,下面的表展示了所有操作符及它们各自的功能。
操作符
功能和作用
.
访问一个bean属性或者Mapentry
[]
访问一个数组或者链表元素
()
对子表达式分组,用来改变赋值顺序
?
:
条件语句,比如:
条件?
ifTrue:
ifFalse
如果条件为真,表达式值为前者,反之为后者
+
数学运算符,加操作
-
数学运算符,减操作或者对一个值取反
*
数学运算符,乘操作
/或div
数学运算符,除操作
%或mod
数学运算符,模操作(取余)
==或eq
逻辑运算符,判断符号左右两端是否相等,如果相等返回true,否则返回false
!
=或ne
逻辑运算符,判断符号左右两端是否不相等,如果不相等返回true,否则返回false
<或lt
逻辑运算符,判断符号左边是否小于右边,如果小于返回true,否则返回false
>或gt
逻辑运算符,判断符号左边是否大于右边,如果大于返回true,否则返回false
<=或le
逻辑运算符,判断符号左边是否小于或者等于右边,如果小于或者等于返回true,否则返回false
>=或ge
逻辑运算符,判断符号左边是否大于或者等于右边,如果大于或者等于返回true,否则返回false
&&或and
逻辑运算符,与操作赋。
如果左右两边同为true返回true,否则返回false
||或or
逻辑运算符,或操作赋。
如果左右两边有任何一边为true返回true,否则返回false
!
或not
逻辑运算符,非操作赋。
如果对true取运算返回false,否则返回true
empty
用来对一个空变量值进行判断:
null、一个空String、空数组、空Map、没有条目的Collection集合
func(args)
调用方法,func是方法名,args是参数,可以没有,或者有一个、多个参数.参数间用逗号隔开
下面通过几个示例来演示它们的使用方法:
${pageScope.sampleValue+12}
//显示12
${(pageScope.sampleValue+12)/3}
//显示4.0
${(pageScope.sampleValue+12)/3==4}
//显示true
${(pageScope.sampleValue+12)/3>=5}
//显示false
//显示值为10的Text控件
可以看到,对于这些示例,程序设计者完全无需管理它们的类型转换,在表达式内部都已经处理了。
有了EL表达式,在JSP页面的编程变得更灵活,也更容易。
变量
EL表达式中可使用的变量包括默认变量和用户在各范围内自定义的变量。
EL中可以使用的默认变量分为作用域变量、请求参数变量等。
ØpageScope,requestScope,sessionScope,applicationScope
这4个默认作用域变量包含Scope作用范围的参数集合,分别表示JSP内置对象page、request、session和application作用范围内的变量集合。
看下面的示例:
<%session.setAttribute("sampleValue",newInteger(10));%>
${sessionScope.sampleValue}
上例中第一句话表示在内置对象session中保存“键”为“sampleValue”,“值”为整数对象10的键值对。
第二句话是使用EL表达式获取保存在该session对象中的“键”为“sampleValue”的值并显示在页面上,显示结果为10。
其中,“.”是属性访问操作符。
Øparam,paramValues
这两个默认变量包含请求参数的集合,这两个参数返回的值分别对应于request.getParameter(String)和request.getParameterValues()返回的值。
param表示请求包含的参数值为单个值。
paramValues表明请求包含的参数值为数组。
下面看一个简单示例:
Sample.jsp:
在这个页面中定义了两组控件,名为“sampleValue”的控件对应的值为数组,名为“sampleSingleValue”的控件对应的值为单个字符串,通过递交请求将参数传送到以下SampleResponse.jsp:
${paramValues.sampleValue[2]}
${param.sampleSingleValue}
这是请求转发到的页面,通过EL表达式的paramValues变量得到控件数组中最后一个控件的递交参数,通过EL表达式的param变量得到单一控件的递交参数。
控件数组参数的EL表达式使用操作符“[]”来指定数组下标。
本示例将显示控件数组中最后一个值“12”和单一控件的值“SingleValue”。
Øheader、headerValues
这两个默认变量包含请求参数头部信息的集合,header将请求头名称映射到单个字符串头值(通过调用ServletRequest.getHeader(Stringname)获得)。
表达式${header.name}相当于request.getHeader(name)。
headerValues将请求头名称映射到一个数值数组(通过调用ServletRequest.getHeaders(String)获得)。
它与头隐式对象非常类似。
表达式${headerValues.name}相当于request.getHeaderValues(name)。
Øcookie
将cookie名称映射到单个cookie对象。
向服务器发出的客户端请求可以获得一个或多个cookie。
表达式${cookie.name.value}返回带有特定名称的第一个cookie值。
如果请求包含多个同名的cookie,则应该使用${headerValues.name}表达式。
ØinitParam
包含所有应用程序初始化参数的集合。
ØpageContext
等价于page环境类javax.servlet.jsp.PageContext的实例,用来提供访问不同的请求参数。
以上11个默认变量几乎包含了Web应用的所有基本操作,若一个表达式不使用这些变量而直接使用参数名,那么就采用就近原则,该表达式将使用最近取得的参数值。
如在页面中使用以下EL:
${sampleValue+10}
该表达式被解释执行时将会依次在pageScope、requestScope、sessionScope以及applicationScope中寻找“键”为“sampleValue”的变量,如果不存在则使用默认值0。
用户自定义的变量包括:
ØJSP页面中用<%!
%>进行声明的变量;
Ø通过useBean>定义的JavaBean;
Ø通过setAttribute()方法保存在各内置对象中的变量。
方法调用
与Java表达式类似,在EL表达式中也可以调用对象变量的方法。
如:
${sessionScope.user.toInterestsString()}表示调用sessionScope范围内的对象user中的方法toInterestsString()。
1.2JSTL标签库
在JSTL1.1中有以下标签库是被支持的:
Core标签库、XMLprocessing标签库、I18Nformatting标签库、Databaseaccess标签库、Functions标签库。
对应的标识符见下表所示:
标签库
URI
前缀
Core
c
XMLprocessing
x
I18Nformatting
fmt
Databaseaccess
sql
Functions
fn
本讲将主要讲解前四种标签库的用法。
1.2.1如何在JSP中使用JSTL
由于JSTL是用Java实现的标签库,其运行依赖于相应Java字节码文件,因此要在JSP中使用JSTL,必须首先下载实现JSTL标签库的包含所有类文件的jar包,主要有两个jar文件(分别为jstl.jar和standard.jar),已经随本文档一起提供。
在Eclipse中的安装方法和安装JDBC驱动的方法一样,将这两个文件作为外部jar文件添加到项目的库中,并设置模块依赖。
这样,在项目发布时,这两个jar文件将被放到WEB-INF\lib目录下。
如下图所示:
另一种方法是,直接将这两个jar文件复制到Web工程的WEB-INF目录下的lib目录下。
安装完成后就可以在Web工程中编写含有JSTL标签的JSP页面了。
下面通过一个简单的示例看如何在JSP使用JSTL中的标签库。
<%@pagecontentType="text/html;charset=UTF-8"%>
<%@taglibprefix="c"uri="%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
forEachvar="i"begin="1"end="10"step="1">
${i}
forEach>
在本例的JSP页面中首先声明了将使用Core标签库,它的URI为c”。
之后,页面中forEach>标签就是使用了JSTL的标签forEach。
对于该标签的功能,这里暂时不作具体讲解。
通过本例,可以看出使用JSTL标签库的基本步骤为:
1)首先通过JSP的page指令的taglib属性声明将使用的标签库;
2)其次在页面中可以通过tag>的方式使用该标签库中的标签,其中prefix为标签前缀,tag为标签库中的标签,每个标签都能实现某个特定的功能。
下面将分别讲解JSTL中的Core标签库,I18NFormating标签库,数据库标签库以及XML标签库。
下面章节中出现的示例都需要首先复制两个jar文件到Web项目的WEB-INF目录下的lib文件夹中,并在JSP页面中使用taglib指令指明要使用的JSTL标签库。
1.2.2Core标签库
Core标签库,又被称为核心标签库,主要封装了对于JSP页面一般处理的标签。
在该标签库中的标签一共有14个,被分为了四类,分别是:
Ø多用途核心标签:
out>,set>,remove>和catch>。
Ø条件控制标签:
if>,choose>,when>和otherwise>。
Ø循环控制标签:
forEach>和forTokens>。
ØURL相关标签:
import>,url>,redirect>和param>。
下面分别讲述各类标签的使用。
用于显示的out>标签
out>标签是一个最常用的标签,用于在JSP中显示数据。
它的属性和描述如下表所示:
属性
描述
value
输出到页面的数据,可以是EL表达式或常量(必须)
default
当value为null时显示的数据(可选)
escapeXml
当设置为true时会主动更换特殊字符,比如“<,>,&”(可选,默认为true)
在JSTL1.0的时候,在页面显示数据必须使用out>来进行。
然而,在JSTL1.1中,由于JSP2.0规范已经默认支持了EL表达式,因此可以直接在JSP页面使用表达式。
下面看一个示例。
示例:
default属性
<%=request.getAttribute("str1")%>
outvalue="${requestScope.str1}"/>
outvalue="${requestScope.str1}"default="novalue"/>
三条语句分别显示“null”、空白、“novalue”。
示例:
对特异字符的处理
<%request.setAttribute("str","tagsmakethingsbold");%>
<%=request.getAttribute("str")%>
outvalue="${requestScope.str}"default="novalue"escapeXml="true"/>
outvalue="${requestScope.str}"default="novalue"escapeXml="false"/>
escapeXml属性设为"true"时,显示结果对特异字符“”做了处理。
用于赋值的set>标签
set>标签用于为变量或JavaBean中的变量属性赋值的工作。
它的属性和描述如下表所示:
属性
描述
value
值的信息,可以是EL表达式或常量
target
被赋值的JavaBean实例的名称,若存在该属性则必须存在property属性(可选)
property
JavaBean实例的变量属性名称(可选)
var
被赋值的变量名(可选)
scope
变量的作用范围,若没有指定,默认为page(可选)
下面看一个示例:
setvalue="thisisandy"var="oneString"/>
${oneString}
该示例将为名为oneString的变量赋值为thisisandy,其作用范围为page。
后面的语句将该值显示在页面上。
当不存在value属