JSTL标准标签库
一、 JSTL简介
标准标签库JSTL的全名为:Java Server PagesStandard Tag Library.
JSTL主要提供了5大类标签库:
1.核心标签库:为日常任务提供通用支持,如显示和设置变量,重复使用一组项目,测试条件以及其他操作(如导入和重定向web页面等).
2.国际化(I18N)标签库: 支持多种语言的引用程序.
3.SQL标签库: 对访问和修改数据库提供标准化支持.
4.XML标签库: 对XML文件处理和操作提供支持,包括XML节点的解析,迭代,基于XML数据的条件评估以及可扩展样式语言转换(Extensible StyleLanguage Transformations , XSLT)的执行.
5.函数标签库: 通过在EL表达式中调用函数标签库中的函数来实现特定的操作,例如:${fn:contains(sring,substring)},其功能是判断string字符串中是否包含substring字符串.
JSTL标签库使用方法(forJSTL 1.0):
标签库 |
uri |
前缀 |
使用模式 |
Core标签库 |
http://java.sun.com/jstl/core |
c |
<c:tagname…/> |
I18N formatting标签库 |
http://java.sun.com/jstl/fmt |
fmt |
<fmt:tagname…/> |
Database access标签库 |
http://java.sun.com/jstl/sql |
sql |
<sql:tagname…/> |
XML Processing标签库 |
http://java.sun.com/jstl/xml |
x |
<x:tagname…/> |
Functions标签库 |
http://java.sun.com/jstl/functions |
fn |
<fn:tagname…/> |
JSTL标签库使用方法(forJSTL 1.1):
标签库 |
uri |
前缀 |
使用模式 |
Core标签库 |
http://java.sun.com/jsp/jstl/core |
c |
<c:tagname…/> |
http://java.sun.com/jsp/jstl/fmt |
fmt |
<fmt:tagname…/> |
|
Database access标签库 |
http://java.sun.com/jsp/jstl/sql |
sql |
<sql:tagname…/> |
XML Processing标签库 |
http://java.sun.com/jsp/jstl/xml |
x |
<x:tagname…/> |
Functions标签库 |
http://java.sun.com/jsp/jstl/functions |
fn |
<fn:tagname…/> |
说明:JSTL 1.0和JSTL 1.1的uri区别是JSTL1.1多了/jsp,例如:
JSTL 1.0:http://java.sun.com/jstl/core
JSTL 1.1:http://java.sun.com/jsp/jstl/core
二、 Core标签库
Core标签库,又被称为核心标签库,该标签库的工作是对于JSP页面一般处理的封装。该标签库包含14个标签,分为四类:
l 多用途核心标签:<c:out>、<c:set>、<c:remove>、<c:catch>
l 条件控制标签:<c:if>、<c:choose>、<c:when>、<c:otherwise>
l 循环控制标签:<c:forEach>、<c:forTakens>
l URL相关标签:<c:import>、<c:url>、<c:redirect>、<c:para>
在JSP页面引入核心标签库的代码为:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
下面将按照功能分类,分别讲解每个标签的功能和使用方式。
(一) 多用途核心标签
1) out标签
核心标签库中最为基本的标签就是<c:out>,用来显示数据对象(字符串、表达式)的内容或结果,或者一个EL表达式的值。
使用Java脚本的方式为:<% out.println("hello") %> <% =表达式 %>
使用JSTL标签:<c:outvalue="字符串">
<c:out>标签的使用有两种语法格式。
【语法1】没有body内容:
<c:outvalue=”要显示的数据对象”[escapeXml=”true|false”] [default=”默认值”]/>
【语法2】有body内容:
<c:outvalue=”要显示的数据对象”[escapeXml=”true|false”]>默认值
</c:out>
这两种方式没有本质的区别,只是格式上的差别。
<c:out>中各属性的说明如下:
value :可以指定一个字符串作为输出内容,也可以指定为EL表达式,例如:${3+5}.
escapeXml :类型为boolean ,确定 , < , > , & , ‘ , “等字符在结构的字符串中是否被转换成字符串实体代码,默认值是true(即是否按html中的样式进行输出,设置true就是按照字符串原样进行输出,false就是按照html标识符进行输出)
default value :可以是字符串,也可以是一个EL表达式或者jsp表达式,如果属性(value)指定的表达式或者对象为null,那么将输出这个defalut value部分的值.
提示:JSTL的使用是和EL表达式分不开的,EL表达式虽然可以直接将结果返回给页面,但有时得到的结果为空,<c:out>有特定的结果处理功能,EL的单独使用会降低程序的易读性,建议把EL的结果输入放入<c:out>标签中。
例:
<body>
<c:outvalue="<要显示的数据对象(未使用转义字符)>"escapeXml="true"default="默认值"></c:out><br/>
<c:outvalue="<要显示的数据对象(使用转义字符)>"escapeXml="false"default="默认值"></c:out><br/>
<c:outvalue="${null}"escapeXml="false">使用的表达式结果为null,则输出该默认值</c:out><br/>
</body>
2) set标签
set标签用来在某个范围(request,session或者application)内设置值,或者设置某个对象的属性值.
Set标签使用格式如下:
1. 使用value 属性在一个特定的范围内指定某个变量的值,其使用格式如下:
<c:set var=”varName”value=”varValue” [scope=”page|request|session|application”]/>
2. 当使用value属性在一个特定范围内指定某各变量的值时,也可以包括body,他的作用与out标签体的作用一样,即value指定的值为null时,默认使用体中指定的值,使用的格式如下:
<c:setvar=”varName” value=”varValue” [scope=”page|request|session|application”]>
default value
</c:set>
3.设置某一个特定对象属性的使用格式如下:
<c:set property=”propertyName” target=”target” value=”value”/>
4.在设置某个特定对象的一个属性时,也可以使用body,并且指定默认的值,使用格式如下:
<c:setproperty=”propertyName” target=”target” value=”value”>
default value
</c:set>
该标签中的各属性说明如下:
1. value : 该属性指定变量或者对象中某个属性的值,并且可以是一个表达式.
2. var : 变量名称,value属性指定的值就保存在这个变量中.
3. scope : 设定变量的有效范围,如果不设置,默认为page.
4. target : 设置属性的一个对象,它必须是JavaBean或者java.util.Map对象.
5. property : 设置对象中的一个属性.
3) remove标签
remove标签一般和set标签配套使用,两者是相对应的,remove标签用于删除某个变量或者属性.
使用格式如下:
<c:remove var=”varName”[scope=”page|request|session|application”] />
Remove标签中使用的各属性说明如下:
1. scope : 设定这个需要删除的变量的所在范围.
2. var : 需要删除的变量或者对象属性的名称.
如果没有scope属性,即采用默认值,就相当于调用PageContext.removeAttribute(varName)方法,如果指定了这个变量所在的范围,那么系统会调用PageContext.removeAttribute(varName,scope)方法.
4) catch标签
catch标签的功能和java中的try{…}catch{…}语句的功能很相似,它用于捕获嵌入到其中间语句抛出的异常,这个标签的使用格式如下:
<c:catchvar=”varName”>
相关操作语句
</c:catch> --如果操作语句中出现异常,则catch会将异常保存在varName变量中.
(二) 流程控制标签
包括: if ,choose , when , otherwise等.
1) if标签
这个标签作用与java中的if语句作用相同,用于判断条件语句,主要的使用格式如下
1. 在<c:if>体中不包括体的使用格式:
<c:if test=”checkCondition” var=”varName”scope=”page|request|session|application”/>
2. 当<c:if> 体中包括体时,使用格式如下:
<c:if test=”checkCondition” var=”varName”scope=”page|request|session|application”>
body content
</c:if>
标签中使用的属性说明:
test : 判断条件的表达式,返回类型为true或者 false;(也就是if的条件)
var : 这个变量用于保存test条件表达式判断所返回的true或者false值
(if条件执行后所得到的boolean值将要保存在var变量中).
scope : 指定var变量所在的有效范围.
2) choose , when ,otherwise标签
这些标签相当于java中的 switch ,case , default条件,使用实例如下:
<c:set var=”num”scope=”page” value=”admin”/>
<c:choose>
<c:whentest=”${num==’guest’}”>
<c:outvalue=”guest”/>
</c:when>
<c:whentest=”${num==’admin’}”>
<c:outvalue=”admin”/>
</c:when>
<c:otherwise>
<c:outvalue=”other”/>
</c:otherwise>
</c:choose>
运行jsp页面后,输出 admin
(三) 循环控制标签
包括:<c:forEach>、<c:forTakens>
1) forEach迭代标签
该标签用来对一个collection集合中的一系列对象进行迭代输出,并且可以指定迭代次数,一般的使用格式如下:
<c:forEachitems=”collection” var=”varName” [varstatue=”varStatusName”] [begin=”begin”][end=”end”] [step=”step”]>
Body content
</c:forEach>
这个标签使用的属性描述如下:
1. var: 也就是保存在collection集合类中的对象名称.
2. items: 将要迭代的集合类名.
3. varStatus: 存储迭代的状态信息,可以访问到迭代自身的信息.
4. begin: 如果指定了begin值,就表示从items[begin]开始迭代;如果没有指定begin值,则从集合的第一个值开始迭代.
5. end: 表示迭代到集合的end位时结束,如果没有指定end值,则表示一直迭代到集合的最后一位.
6. step: 指定迭代的步长.
例:
<%
String Items[] =newString[5];
Items[0]=”核心标签库”;
Items[1]=”国际化标签库”;
Items[2]=”SQL标签库”;
Items[3]=”XML标签库”;
Items[4]=”函数标签库”;
Request.setAttribute(“ItemName”,Items);
%>
<B><c:outvalue=”不指定begin和end的迭代:”/><B><br>
<c:forEachvar=”ItemName” items=”${Items}”>
<c:out value=”${ItemName}”/><br>
</c:forEach>
<B><c:outvalue=”指定begin和end的迭代:”/><B><br>
<c:forEach var=”ItemName” items=”${Items}” begin=”1” end=”3” step=”1”>
<c:out value=”${ItemName}”/><br>
</c:forEach>
<B><c:outvalue=”输出整个迭代的信息:”/><B><br>
<c:forEach var=”ItemName” items=”${Items}” begin=”3” end=”4” step=”1”varStatus=”s”>
<c:out value=”${ItemName}”/>的四种属性:<br>
所在位置即索引:<c:out value=”${s.index}” /> <br>
总共已迭代的次数:<c:out value=”${s.count}”/><br>
是否为第一个位置:<c:out value=”${s.first}” /><br>
是否为最后一个位置:<c:out value=”${s.last}”/>
</c:forEach>
代码说明:
s.index 用来获取计数器的值
s.count用来获取这是第几次循环
s.first 用来获取是否是循环开始的第一次
s.last 用来获取是否是循环的最后一次
first 和last都返回boolean值.
2) forTokens标签
这个标签的作用和Java中的StringTokenizer类的作用非常相似,通过items属性来指定一个特定的字符串,然后通过delims属性指定一种分隔符(可以同时指定多个),通过指定的分隔符把items属性指定的字符串进行分组,与forEach标签一样,forTokens标签也可以指定begin和end以及step属性值.
使用格式如下:
<c:forTokens items=”stringOfTokens” delims=”delimiters”var=”varName” [varStatus=”varStatusName”] [begin=”begin”] [end=”end”][step=”step”]>
Body content
</c:forTokens>
标签中的各个属性描述如下:
1. var : 进行迭代的参数名称.
2. items : 指定的进行标签化的字符串.
3. varSatus : 每次迭代的状态信息.
4. delims : 使用这个属性指定的分隔符来分隔items指定的字符串.
5. begin : 开始迭代的位置.
6. end : 迭代结束的位置.
7. step : 迭代的步长.
例:
<c:out value=”forTokens标签实例”/>
<h4>使用” | ”作为分隔符</h4>
<c:forTokens var=”token”items=”bleu,rouge|vert,jaune|blanc,rouge” delims=”|”>
<c:outvalue=”${token}”/>
</c:forTokens>
<h4>使用” | , ”作为分隔符</h4>
<c:forTokens var=”token”items=”bleu,rouge|vert,jaune|blanc,rouge” delims=”|,”>
<c:outvalue=”${token}”/>
</c:forTokens>
代码说明:
delims=”|,” , 即使用”|”和”,”同时作为分隔符进行使用.如果需要更多的分隔符就是使用 “|,./” 在引号内输出.
(四) URL相关的标签
URL相关的标签主要用来将其他文件包含进来,或者提供页面之间的重定位以及URL地址的生成,参数的输出等.一般包括如下几个标签.
<c:import>标签:与传统JSP页面重的<jsp:include>标签类似.
<c:redirect>标签:进行页面的重定位.
<c:url> : 主要用来重写URL地址.
<c:param> : 一般param标签会与其他标签一起配套使用,用于参数值的传递.
1)<c:import>标签:
该标签用于把其他今天文件包含到该文件当中,它与传统的<jsp:include>相类似,不同的是<jsp:include>标签只能用来包括该应用中的其他文件,而<c:import>还可以包含其他web应用中的文件,甚至是网络上的资源所以它的功能更加强大.
使用格式如下:
<c:import url=”url” [context=”context”][var=”varName”] [scope=”page|request|session|application”][varReader=”varReader”] [charEncodion=”charEncoding”]>
Body content
</c:import>
标签中的属性描述如下:
url: 待引用静态文件的URL地址.
context: 当采用相对路径访问一个外部静态文件时,这里的context指定这个外部文件的名称.
var: 当使用字符串输出时,把输出的内容存储在这个var指定的变量中.
scope: 指定var参数变量的有效范围.
varReader: 这个属性指定的参数变量类型是Reader,可以用于读取文件的内容.
charEncoding: 引入文件所采用的字符编码.
Import标签即可以采用相对路径也可以采用绝对路径来引用本地点中的任何静态文件,还可以使用绝对路径引用外部站点中的静态文,甚至可以是ftp站点中的文件,例如:<c:import var=”myurl” url=”http://www.163.com” />就是引用http://www.163.com站点的主页面.
可以把引用文件中的内容赋值给var属性指定的变量,然后进行读取,也可以赋值给varReader指定的Reader类型的变量,然后进行相应的读取.
有时引入的文件在本地显示会出现乱码,这时可以通过charEncoding来指定这些内容所采用的字符集编码.
2) <c:redirect>和<c:param>标签:
Redirect标签用来进行页面之间的重定向,它与传统JSP程序重的<jsp:redirect>标签功能相类似,param标签是与redirect一起使用的,它用来进行参数值的传递,redirect标签的使用格式如下:
<c:redirect url=”url”[context=”context”]/>
在redirect标签中指定param参数的使用格式如下:
<c:redirect url=”url”[]context=”context”>
<c:paramname=”paramName” value=”value”/>
</c:redirect>
例: [通过创建c_redirect1.jsp 和c_redirect2.jsp 两个文件说明]
c_redirect1.jsp文件内容如下:
<c:redirecturl=”c_redirect2.jsp” >
<c:paramname=”userName” value=”admin”/>
</c:redirect>
c_redirect2.jsp 文件内容如下:
<body>
userName=<c:outvalue=”${param.userName}”>
</body>
c_redirect1.jsp页面文件内容不会显示,因为直接重定向到c_redirect2.jsp,重定向c_redirect2.jsp后,页面中输出 userName=admin
3) <c:url>标签:
这个标签主要用来重写url地址,使用格式如下:
<c:urlvalue=”value” [context=”context”] [var=”varName”][scope=”page|request|session|application”] />
当进行参数传递时,使用格式如下:
<c:urlvalue=”value” [context=”context”] [var=”varName”][scope=”page|request|session|application”] >
<c:paramname=”paramName” value=”value” />
</c:url>
标签中使用的属性描述如下:
value: 将要处理的URL地址.
context: 当使用相对路径方法指定外部文件时,这个属性指定的是外在文件的名称.
var: 给这个URL地址起一个标识.
Scope: 规定这个var属性所指定变量的有效范围.
创建一个c_url.jsp,其源代码如下:
<%@ taglib prefix=”c”uri=”http://java.sun.com/jsp/jstl/core” %>
<c:url var=”url”value=”c_url2.jsp” scope=”session” >
<c:paramname=”userName” value=”admin”/>
<c:paramname=”password” value=”123456”/>
</c:url>
<c:outvalue=”${url}”/>
<a herf=’<c:outvalue=”${url}”/>’>Link to other page</a>
代码说明:
url标签可以指定一个变量(var属性指定)来把url地址保存,并且可以指定这个变量的有效范围为session ,所以当需要用到这个url地址时,就可以使用session.getAttribute(varName)方法来获取这个地址,所以一般需要重复使用同一个url地址才会使用<c:url>标签的功能.
三、 国际化( I18N )标签库
JSTL标签提供了对国际化(I18N)的支持,它可以根据发出请求的客户端地域的不同来显示不同的语言。同时还提供了格式化数据和日期的方法。实现这些功能需要I18N格式标签库(I18N-capable formation tagsliberary)。
引入该标签库的方法为:
<%@ tagliburi="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
I18N格式标签库提供了12个标签,这些标签从功能上可以划分为3类如下:
(1)数字日期格式化。formatNumber标签、formatDate标签、parseNumber标签、parseDate标签、timeZone标签、setTimeZone标签。
(2)读取消息资源。bundle标签、message标签、setBundle标签。
(3)国际化。setlocale标签、requestEncoding标签, param标签。
(一) 数字日期格式化
数字日期格式化标签共有6个,用来将数字或日期转换成设定的格式。
1) <frm:formatNumber/>标签
该标签依据特定的区域将数字改变为不同的格式来显示。
【语法1】:
<frm:formatNumber value=”被格式化的数据”[type=”number|currency|percent”]
[pattern=”pattern”]
[currencyCode=”code”]
[currencySymbol=”symbol”]
[groupingUsed=”true|false”]
[maxIntergerDigits=”maxDigits”]
[minIntergerDigits=”minDigits”]
[maxFractionDigits=”maxDigits”]
[minFractionDigits=”minDigits”]
[var=”name”]
[scope=page|request|session|application]
/>
【语法2】:
<frm:formatNumber[type=”number|currency|percent”]
[pattern=”pattern”]
[currencyCode=”code”]
[currencySymbol=”symbol”]
[groupingUsed=”true|false”]
[maxIntergerDigits=”maxDigits”]
[minIntergerDigits=”minDigits”]
[maxFractionDigits=”maxDigits”]
[minFractionDigits=”minDigits”]
[var=”name”]
[scope=page|request|session|application]
>
被格式化的数据
<frm:formatNumber>
属性说明如表9-4所示。
表9-4 <fmt:formatNumber>标签参数说明
名称 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
要格式化的数据 |
是 |
String |
是 |
无 |
type |
指定类型(单位、货币、百分比等)见表 |
是 |
String |
否 |
number |
pattern |
格式化的数据样式 |
是 |
String |
否 |
无 |
currencyCode |
货币单位代码 |
是 |
String |
否 |
无 |
cuttencySymbol |
货币符号($、¥) |
是 |
String |
否 |
无 |
groupingUsed |
是否对整数部分进行分组如(9,999) |
是 |
boolean |
是 |
true |
maxIntergerDigits |
整数部分最对显示多少位数 |
是 |
int |
否 |
无 |
minIntergerDigits |
整数部分最少显示多少位 |
是 |
int |
否 |
无 |
maxFractionDigits |
小数部分最多显示多少位 |
是 |
int |
否 |
无 |
minFractionDigits |
小数部分最少显示多少位 |
是 |
int |
否 |
无 |
var |
存储格式化后的数据 |
否 |
String |
否 |
无 |
scope |
var的JSP范围 |
否 |
String |
否 |
page |
Type属性的类型应用见表9-5.
表9-5 Type的属性类型
类型 |
说明 |
示例 |
number |
数字格式 |
0.8 |
currency |
当地货币 |
¥0.80 |
percent |
百分比格式 |
80% |
【示例代码】:代码9.14实现了对数字的格式化、货币的格式、货币的格式化。使用<frm:formatNumber>的各种属性的设定。
代码9.14 <fmt:formatNumber>标签示例:fmtdemo01.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>I18N标签库</title>
</head>
<body>
<h4align="center"><c:out value="<frm:number>标签的使用"></c:out></h4>
<hr>
<table border=1cellpadding="0" cellspacing="0"align="center">
<tr align="center">
<td width="100">类型 </td>
<td width="100">使用数据</td>
<td width="100">结果</td>
<td width="300">说明</td>
</tr>
<tr>
<td>数字格式化</td><td>108.75</td>
<td><fmt:formatNumber type="number"pattern="###.#">108.75</fmt:formatNumber></td>
<td>使用pattern可以定义显示的样式。本例设定为###.#小数部分将使用四舍五入法。</td>
</tr>
<tr>
<td>数字格式化</td><td>9557</td>
<td><fmt:formatNumbertype="number"pattern="#.####E0">9557</fmt:formatNumber></td>
<td>使用科学计数法。</td>
</tr>
<tr>
<td>数字格式化</td><td>9557</td>
<td><fmt:formatNumbertype="number" >9557</fmt:formatNumber></td>
</td>
<td>使用默认分组。</td>
</tr>
<tr>
<td>数字格式化</td><td>9557</td>
<td><fmt:formatNumbertype="number" groupingUsed="false">9557</fmt:formatNumber></td>
<td>不使用分组。</td>
</tr>
<tr>
<td>数字格式化</td><td>9557</td>
<td><fmt:formatNumbertype="number" maxIntegerDigits="3">9557</fmt:formatNumber></td>
<td>使用位数限定,根据指定的位数显示,其他数字忽略。例如:9不被显示。</td>
</tr>
<tr>
<td>百分比格式化</td><td>0.98</td>
<td><fmt:formatNumbertype="percent">0.98</fmt:formatNumber></td>
<td>用百分比形式显示一个数据。</td>
</tr>
<tr>
<td>货币格式化</td><td>188.88</td>
<td><fmt:formatNumbertype="currency" >188.8</fmt:formatNumber></td>
<td>将一个数据转化为货币形式输出。</td>
</tr>
<tr>
<td>存储数据</td><td>188.88</td>
<td><fmt:formatNumbertype="currency"var="money">188.8</fmt:formatNumber>
<c:outvalue="${money}"></c:out>
</td>
<td>存储的money的值为${money} </td>
</tr>
</table>
</body>
</html>
【代码说明】:
(1)从应用角度可以把属性分为三类:数字格式化、货币格式化、百分比格式化。使用type指定类型。
(2)应用于数字格式化的属性有:partten属性、maxIntegerDigits属性、minIntegerDigits属性、maxFractionDigits属性和minFactionDigits属性。其中partten属性在设定格式化样式时会比较准确如:四舍五入、科学计数法的使用。而使用maIntegerDirgits等属性时,只把设定位数以外的数字舍去。
(3)货币格式化可以使用数字格式化的所有属性。如果有必要建议使用partten属性。currencyCode属性和currencySymbol只用于货币格式化。
(4)百分比格式化使用到的属性为type属性、partten属性,设定type属性的类型为percent即可。
(5)使用var属性时,会将格式化后的值存在JSP的某个范围内(一个String类型的字符串包括符号等)。<frm:forNumber>将不再输出格式化后的值可以使用EL表达式输出。
(6)通用属性:type属性、partten属性、var属性和scope属性。
提示:如果给定的数据类型有错误将或产生异常。例如:给定的数据为aa进行类型转化,将使应用程序无法显示。因此在实际应用中显示的格式化应该放入<c:catch/>语句中。
2) <frm:parseNumber>标签
将格式化后的数字、货币、百分比都转化为数字类型。
【语法1】:
<fmt:parseNumbervalue="number" [type=”number|currency|percent”]
[pattern=”pattern”]
[parseLocale=”locale”]
[intergerOnly=”true|false”]
[scope=”page|request|session|application”]
/>
【语法2】:
<fmt:parseNumber[type=”number|currency|percent”]
[pattern=”pattern”]
[parseLocale=”locale”]
[intergerOnly=”true|false”]
[scope=”page|request|session|application”]
>
Number
</fmt:parseNumber>
属性说明见表9-6。
表9-6 <fmt:parseNumber>标签参数说明
名称 |
说明 |
EL |
类型 |
是否必须 |
默认值 |
value |
被解析的字符串 |
是 |
String |
是 |
无 |
type |
指定单位(数字、货币、百分比) |
是 |
String |
是 |
number |
pattern |
格式样式 |
是 |
String |
否 |
无 |
parseLocale |
用来替代默认区域的设定 |
是 |
String, Java.util. Locale |
是 |
默认本地样式 |
var |
存储已经格式化的数据 |
否 |
String |
否 |
无 |
scope |
var变量的作用域 |
否 |
String |
是 |
page |
<fmt:parseNumber>可以看作是<fmt:formatNumber>的逆运算。相应的参数和类型的配置和使用<fmt:formatNumber>格式化时相同。
【示例代码】:代码9.15实现了从字符串中提取数据,并用合适的数据类型进行存储(浮点性、整型等)。可以对转换后的数据进行加法运算。
代码9.15 <fmt:parseNumber>标签示例:fmtdemo02.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>I18N标签库</title>
</head>
<body>
<h4 ><c:outvalue="<frm:parseNumber>标签的使用"></c:out></h4>
<hr>
</body>
<fmt:formatNumbertype="currency"var="money">188.8</fmt:formatNumber>
<li>格式化前的数据为:<c:out value="${money}"></c:out>
<fmt:parseNumber var="money"type="currency">${money}</fmt:parseNumber>
<li>格式化后的数据为:<c:out value="${money}"></c:out>
<li>可以对格式化的后的数据进行运算:
<c:outvalue="${money+200}"></c:out>
<li>对百分比进行格式化98%为:
<fmt:parseNumbertype="percent">98%</fmt:parseNumber>
</html>
【代码解析】:
(1)首先使用<fmt:formatNumber>将188.8转换为字符串¥188.8并在page范围内存储一个String类型的变量,变量名为money。
(2)使用<fmt:parseNumber>将¥188.8转化为浮点型的数据188.8并赋值为变量money,
则变量money转变为一个浮点型的值188.8,对188.8进行加运算。
(3)直接对一个百分比数98%进行转化。
提示:<fmt:parseNumber>属性参数的配置和使用同<fmt:formatNumber>标签使用的方式一样。同时,在进行类型转换时如果给出的类型不正确将会出现异常。例如在进行百分比转化时如果没有给type类型或者给出type类型但提供的数据中没有%都会产生异常。因此在实际应用中用<c:catch/>捕获异常。
3) <fmt:formatDate>标签
该标签主要用来格式化日期和时间。
【语法】:
<fmt: formatDate value=”date”[type=”time|date|both”]
[pattern=”pattern”]
[dateStyle=”default|short|medium|long|full”]
[timeStyle=”default|short|medium|long|full”]
[timeZone=”timeZone”]
[var=”name”]
[scope=”page|request|session|application”]
/>
参数说明见表9-7。
表9-7 <fmt:formatDate>标签属性说明
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
将要格式化的日期对象。 |
是 |
Java.util.Date |
是 |
无 |
type |
显示的部分(日期、时间或者两者)。 |
是 |
String |
否 |
date |
partten |
格式化的样式。 |
是 |
String |
否 |
无 |
dateStyle |
设定日期的显示方式。 |
是 |
String |
否 |
default |
timeStyle |
设定时间的显示方式。 |
是 |
String |
否 |
default |
timeZone |
设定使用的时区。 |
是 |
String |
否 |
当地所用时区 |
var |
存储已格式化的日期或时间。 |
否 |
String |
否 |
无 |
scope |
指定var存储的JSP范围。 |
否 |
String |
否 |
无 |
其中type属性参数说明见表9-8。
表9-8 type属性参数说明
参数名 |
说明 |
time |
只显示时间 |
date |
只显示时期 |
both |
显示日期和时间 |
【示例程序】:代码9.16实现了对日期的格式化,使用了type、dateStyle、timeStyle等属性。
代码9.16 <fmt:formatDate>标签示例:fmtdemo03.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date"class="java.util.Date"></jsp:useBean>
<html>
<head>
<title>I18N标签库</title>
</head>
<body>
<fmt:formatDatevalue="${date}"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}"type="both"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}" type="both" dateStyle="default"
timeStyle="default"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}" type="both" dateStyle="short"
timeStyle="short"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}" type="both" dateStyle="long"
timeStyle="long"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}" type="both" dateStyle="full"
timeStyle="full"></fmt:formatDate><br>
<fmt:formatDatevalue="${date}" type="both" dateStyle="full"
timeStyle="full"></fmt:formatDate><br>
</body>
</html>
【代码解析】:
(1)首先通过配置JavaBean在页面上实例化java.util.Date对象。实现代码如下:
<jsp:useBean id="date"class="java.util.Date"></jsp:useBean>
(2)对日期对象进行格式化时${date}是一个日期对象,如果给value设的值为String时程序会报错。
(3)设置type为both时,将显示日期和时间,同时示例中依次改变dateStyle和timeStyle的值作为比较。
4) <fmt:parseDate>标签
<fmt:parseDate>标签主要将字符串类型的时间或日期转化为时间或日期对象。
【语法1】:
<fmt:parseDate value=”date”[type=”time|date|both”]
[pattern=”pattern”]
[parseLocale=”locale”]
[dateStyle=”default|short|medium|long|full”]
[timeStyle=”default|short|medium|long|full”]
[timeZone=”timezone”]
[var=”name”]
[scope=”page|request|session|application”]
/>
【语法2】:
<fmt:parseDate [type=”time|date|both”]
[pattern=”pattern”]
[parseLocale=”locale”]
[dateStyle=”default|short|medium|long|full”]
[timeStyle=”default|short|medium|long|full”]
[timeZone=”timezone”]
[var=”name”]
[scope=”page|request|session|application”]
>
Date
</fmt:parseDate>
【参数说明】参数说明见表9-9.
表9-9 <fmt:parseData>标签属性说明
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
将要格式化的日期时间 |
是 |
String |
是 |
无 |
type |
字符串的类型(日期、时间或全部) |
EL |
String |
是 |
date |
pattern |
字符串使用的时间样式 |
是 |
String |
是 |
无 |
parseLocale |
取代默认地区设定 |
是 |
String |
是 |
默认地区 |
dateStyle |
字符串使用的日期显示方式 |
是 |
String |
否 |
default |
timeStyle |
字符串使用的时间显示格式 |
是 |
String |
否 |
default |
timeZone |
使用的时区 |
是 |
String |
否 |
当地区时 |
var |
使用var定义的名字保存对象 |
否 |
String |
否 |
无 |
scope |
var的JSP范围 |
否 |
String |
否 |
page |
【示例代码】:代码9.16实现了以下功能:首先,使用了<fmt:formatDate>把一个日期对象格式化成一个日期的字符串,并把该字符串以参数名为a存储page范围内。其次,使用<fmt:parseDate>方法把a的值(字符串)格式化成一个Date并以参数名为b存储在page范围内。最后,使用Java脚本证明生成的b为对象。
代码9.16:<fmt:formatDate>标签示例:fmtdemo04.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date" class="java.util.Date"></jsp:useBean>
<html>
<head>
<title>I18N标签库</title>
</head>
<body>
<H4><c:outvalue="<frm:parseDate>标签的使用"></c:out></H4>
<hr>
<fmt:formatDatevalue="${date}" var="a" type="both"
dateStyle="full"timeStyle="full"></fmt:formatDate>
<fmt:parseDate var="b"type="both" dateStyle="full" timeStyle="full">
${a}
</fmt:parseDate>
<%
out.println(pageContext.getAttribute("b").toString());
out.println("<br>");
out.println(pageContext.getAttribute("b").hashCode());
%>
</body>
</html>
【代码解析】:
(1)使用<fmt:formatDate>把日期对象格式化成字符串。
(2)使用<fmt:parseDate>把字符串对象转化为日期对象,注意同(1)中的参数对比,可以发现两者是一个互逆的过程。
(3)使用Java脚本进行测试Date对象的toString()方法可以输出时间字符串。hashCode()可以得到一个对象的hashCode。该方法只能应用于对象,因此可以证明得到的是一个日期对象。
提示:<fmt:formatDate>和<fmt:parseDate>是相反的运算过程,可以对照学习。本例中的Java脚本的作用是为了证明生成的的确是一个对象。
5) <fmt:setTimeZone>标签
该标签用于设定默认时区或者将时区存储在指定的JSP范围内。
【语法】:
<fmt:setTimeZone value=”value”[var=”name”][scope=”page|request|session|application”]/>
【参数说明】:见表9-10
表9-10 <fmt:setTimeZone>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
使用的时区 |
是 |
String Java.util.TimeZone |
是 |
无 |
var |
使用var定义的参数名保存值 |
否 |
String |
否 |
无 |
scope |
存储var的JSP范围 |
否 |
String |
否 |
page |
value用来设定使用的时区,例如中国使用的时区为CST,其他的还有EST、PST等。可以把时区存储在指定的JSP范围内,例如存储在session中,用户访问的所有页面都可以显示使用的设定的时区下对应的时间。
【示例代码】
<fmt:setTimeZone value=”EST”scope=”session”/>
提示:有关TimeZone的说明见JDK帮助文档的java.util.TimeZone类。
6) <fmt:timeZone>标签
该标签主要用于设置标签体内使用的时区。
【语法】:
<fmt:timeZone value=”timeZone”>
…..
</fmt:timeZone>
使用<fmt:timeZone></fmt:timeZone>只会应用到标签体内使用的时区,对标签外部将不产生影响。
(二) 读取消息资源
读取消息资源用到的标签主要有4个:<fmt:message>标签、<fmt:param>标签、<fmt:bundle>标签和<fmt:setBundle>标签。主要用于从资源文件中读取信息。
1) <fmt:bundle>标签
该标签主要用于将资源文件绑定于它的标签体中的显示。
【语法】:
<fmt:bundlebasename=”name”[prefix=”prefix”]>
….标签主题
</fmt:bundle>
【参数说明】:见表9-11。
表9-11 <fmt:bundle>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
basename |
指定使用的资源文件的名称 |
是 |
String |
是 |
无 |
prefix |
前置关键字 |
是 |
String |
否 |
无 |
2) <fmt:setBundle>标签
该标签主要用于绑定资源文件或者把资源文件保存在指定的JSP范围内。
【语法】:
<fmt:setBundle basename=”name”[var=”name”]
[scope=”page|request|session|application”]
>
【参数说明】:见表9-12。
表9-12 <fmt:setBundle>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
basename |
指定使用的资源文件的名称 |
是 |
String |
是 |
无 |
var |
指定将资源文件保存的名称 |
否 |
String |
否 |
无 |
scope |
设定将资源文件保存的JSP范围 |
否 |
String |
否 |
page |
3) <fmt:message>标签
该标签主要负责读取本地资源文件,从指定的消息文本资源文件中读取键值,并且可以将键值保存在指定的JSP范围内。
【语法1】:
<fmt:messagekey=”keyName”[bundle=”bundle”]
[scope=”page|request|session|application”]
/>
【语法2】:
<fmt:messagekey=”keyName”[bundle=”bundle”]
[scope=”page|request|session|application”]
>
<fmt:param/>
</fmt:message>
【语法3】:
<fmt:messagekey=”keyName”[bundle=”bundle”]
[scope=”page|request|session|application”]
>
key<fmt:param/>
…
</fmt:message>
【参数说明】:见表9-13。
表9-13 <fmt:message>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
key |
指定键值的名称(索引) |
是 |
String |
是 |
无 |
bundle |
指定消息文本的来源 |
是 |
LocalizationContext |
否 |
无 |
var |
指定存储键值的变量名 |
否 |
String |
否 |
无 |
scope |
指定var的作用域 |
否 |
String |
否 |
page |
提示:建议此处的bundle使用EL表达式,因为属性bundle的类型为LocalizationContext,而不是一个String类型的URL。
【示例代码】:代码9.17实现从指定的资源文件中读取对应key的值。
首先编写一个资源文件内容下
name=olive
password=01234
使用标签从资源文件中读取相应的值。
代码9.17 <fmt:message>标签示例:fmtdemo05.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date"class="java.util.Date"></jsp:useBean>
<html>
<head>
<title>I18N标签库</title>
</head>
<body>
<H4><c:outvalue="资源文件读取示例"></c:out></H4>
<hr>
<fmt:bundlebasename="message">
<c:out value="从message资源文件中得到的key为name的值为:"></c:out>
<fmt:messagekey="name" ></fmt:message>
</fmt:bundle>
<hr>
<fmt:setBundlebasename="message" var="m"/>
<fmt:message key="password"bundle="${m}"></fmt:message>
${m}
</body>
</html>
【代码解析】:
(1)使用<fmt:bundle>标签指定从message.properties文件中读取值。
(2)使用<fmt:message>标签读取资源文件中key为name的值。<fmt:message>标签放在<fmt:bundle>标签体内使用。
(3)使用<fmt:setBundle>标签在page范围绑定一个配置文件,以m为参数名存储。
(4)使用<fmt:message>标签得到key为password的值,此处指定资源文件的方式为使用<fmt:message>标签的bundle属性来设定。
(5)输出参数m的值,加深对bundle的理解。
<fmt:bundle>标签中有一个prefix属性,该标签用来指明前缀。例如配置文件内容如下:
org.person.name=olive
org.personpassword=01234
如果不使用prefix标签,在取值是要指明前缀。例如:
<fmt:bundle basename=”message”>
<fmt:messagekey=”org.person.name”></fmt:message>
<fmt:messagekey=”org.person.password”></fmt:message>
</fmt:bundle>
使用prefix属性可以简化取值时的代码。
<fmt:bundle basename=”message”prefix=”org.person”>
<fmt:messagekey=”name”></fmt:message>
<fmt:message key=”password”></fmt:message>
</fmt:bundle>
4) <fmt:param>标签
该标签主要用于当<fmt:message>中资源文件中获得键值时,动态的为资源文件中的变量赋值。
【语法1】:
<fmt:param value=”value”/>
【语法2】:
<fmt:param >
…标签主体
</fmt:param>
【示例代码】:
(1)创建资源文件。在message.properties文件中增加一个key和value。
news={0} welcome to outwebsite!<br>today is :{1,date}
表达的含义是键news对应的是一个字符串,字符串中还有动态变量{0}表示第一个动态变量,{1,date}表示第二个动态变量并且该变量是一个日期类型的对象。
(2)通过标签从资源文件中取出键值,并给动态变量赋值显示在页面。
代码9.18 <fmt:param>标签示例:fmtdemo06.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date"class="java.util.Date"></jsp:useBean>
<html>
<head>
<title>I18N标签库</title>
</head>
<body>
<H4><c:outvalue="<fmt:param>标签的使用"></c:out></H4>
<hr>
<fmt:bundlebasename="message">
<fmt:messagekey="news">
<fmt:paramvalue="olive" />
<fmt:paramvalue="${date}"/>
</fmt:message>
</fmt:bundle>
</body>
</html>
【代码解析】:
(1)使用<fmt:bundle>标签把资源文件绑定在标签体内。
(2)在<fmt:bundle>标签体内使用<fmt:message>得到键值。
(3)使用<fmt:param>为资源文件中的动态变量赋值。
提示:资源文件经过修改后,应用程序需要重载才能生效。
(三) 国际化
国际化这个分类*包含两个标签:用于设定语言地区<fmt:setLocale/>和用于设定请求的字符编码的<fmt:requestEncoding>标签。
1) <fmt:setLocale/>标签
<fmt:setLocale>标签用来设定用户语言区域。
【语法】:
<fmt:setLocale value=”locale”[variant=”variant”]
[scope=”page|request|session|application”]>
【参数说明】:见表9-14。
表9-14 <fmt:setLocale>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
value |
指定区域代码 |
是 |
String java.util.Locale |
是 |
无 |
variant |
操作系统的类型 |
是 |
String |
是 |
无 |
scope |
设定时区的作用范围 |
否 |
String |
是 |
page |
value属性用来指定使用的语言代码,可以从浏览器的【工具】---【Internet选项】---【语言】---【添加】中查看浏览器支持的语言种类及语言代码。例如:中文(zh_cn)、*(zh_tw)、香港(zh_mo)等。
【示例代码】:代码9.19实现了设定不同的区域代码,根据不同的区域代码浏览将显示不同格式的日期。
代码9.19 <fmt:setLocale>标签示例:fmtdemo07.jsp
<%@ page language="java"pageEncoding="gbk"%>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<jsp:useBean id="date"class="java.util.Date"></jsp:useBean>
<html>
<head>
<title>I18N标签库</title>
</head>
<body>
<H4><c:outvalue="<fmt:setlocale>标签的使用"></c:out></H4>
<hr>
<fmt:setLocalevalue="en_us" />
<fmt:formatDatevalue="${date}" type="both" dateStyle="full"timeStyle="full"/>
<hr>
<fmt:setLocalevalue="zh_cn" />
<fmt:formatDatevalue="${date}" type="both" dateStyle="full"timeStyle="full"/>
<hr>
<fmt:setLocalevalue="zh_TW"/>
<fmt:formatDatevalue="${date}" type="both" dateStyle="full"timeStyle="full"/>
</body>
</html>
【代码解析】:
(1)浏览器默认跟您使用的操作系统的语言相同,因此默认值zh_cn。使用<fmt:setLocale/>标签设置使用的语言为en_us(英语)。使用<fmt:formateDate>格式化输出的时间字符串,该标签会根据不同的语言输出不同的日期格式。
(2)使用的语言修改为zh_cn,再次用格式化输出。
(3)使用语言修改为zh_TW,输出格式化后的时间。
2)<fmt:requestEncoding>标签
该标签用于设定请求的编码格式。功能同servletRequest.setCharacterEncoding()方法相同。
【语法】:
<fmt:requestEncoding[value=”charEncoding”]/>
【参数说明】:
value属性用来指定使用的编码集例如:gbk、gb2312等。当没有给出value的值时将会自动搜索取寻找合适的编码方式,因此能够很好的解决中文乱码问题。
四、 SQL标签库
JSTL提供了与数据库相关操作的标签,可以直接从页面上实现数据库操作的功能,在开发小型网站是可以很方便的实现数据的读取和操作。下面详细介绍这些标签的功能和使用方法。
SQL标签库从功能上可以划分为两类:
(1)、设置数据源标签:<sql:setDataSource>
(2)、SQL指令标签:<sql:query>,<sql:update>,<sql:param>,<sql:dateParam>,<sql:transaction>
引入SQL标签库的指令代码为:
<%@ taglib prefix="sql"uri="http://java.sun.com/jsp/jstl/sql" %>
(一) 设置数据源
1.<sql:setDataSource>标签
使用<sql:setDataSource>标签可以实现对数据源的配置。
【语法1】:直接使用已经存在的数据源。
<sql:setDataSourcedataSource=”dataSource”[var=”name”]
[scope=”page|request|session|application”]/>
【语法2】:使用JDBC方式建立数据库连接。
<sql:setDataSource driver=”driverClass”url=”jdbcURL”
user=”username”
password=”pwd”
[var=”name”]
[scope=”page|request|session|application”]/>
【参数说明】:见表9-15
表9-15 <sql:DataSource>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
dataSource |
数据源 |
是 |
String Javax.sql.DataSource |
否 |
无 |
driver |
使用的JDBC驱动 |
是 |
String |
否 |
无 |
url |
连接数据库的路径 |
是 |
String |
否 |
无 |
user |
连接数据库的用户名 |
是 |
String |
否 |
无 |
password |
连接数据库的密码 |
是 |
String |
否 |
无 |
var |
指定存储数据源的变量名 |
否 |
String |
否 |
无 |
scope |
指定数据源存储的JSP范围 |
否 |
String |
否 |
page |
提示:是否必须是相对的,比如说如果使用数据源则,driver、url等就不再被使用。如果使用JDBC则要用到driver、url、user、password属性。
例如连接SQL Server需要进行如下配置:
Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url=”jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs"
user=”sa”
password=””
使用<fmt:setDataSource>配置的代码如下:
<fmt:setDataSourcedriver=”com.microsoft.jdbc.sqlserver.SQLServerDriver”
url=”jdbc.microsoft:sqlserver://localhost:1433;DatabaseName=pubs”
user=”sa”
password=””>
如果连接其他数据库,只须把相对应的项修改即可。
提示:可以把数据连接的配置存入session中,如果再用到数据库连接只须配置使用DataSource属性。
(二) SQL指令标签
JSTL提供了<sql:query>、<sql:update>、<sql:param>、<sql:dateParam>和<sql:transaction>这5个标签,通过使用SQL语言操作数据库,实现增加、删除、修改等操作。下面将介绍这5个标签的功能和使用方式。
1. <sql:query>标签
<sql:query>标签用来查询数据。
【语法1】:
<sql:querysql=”sqlQuery” var=”name”
[scope=”page|request|session|application”]
[dataSource=”dateSource”]
[maxRow=”maxRow”]
[startRow=”starRow”]/>
【语法2】:
<sql:query var=”name”
[scope=”page|request|session|application”]
[dataSource=”dateSource”]
[maxRow=”maxRow”]
[startRow=”starRow”]
>
sqlQuery
</sql:query>
【属性说明】:见表9-16。
表9-16 <sql:query>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
sql |
查询数据的SQL语句 |
是 |
String |
是 |
无 |
dataSource |
数据源对象 |
是 |
String Javax.sql.DataSoutce |
否 |
无 |
maxRow |
设定最多可以暂存数据的行数 |
是 |
String |
否 |
无 |
startRow |
设定从那一行数据开始 |
是 |
String |
否 |
无 |
var |
指定存储查询结果的变量名 |
否 |
String |
是 |
无 |
scope |
指定结果的作用域 |
否 |
String |
否 |
page |
使用<sql:query>必须指定数据源,dataSource是可选的,如果未给定该属性标签会在page范围内查找是否设置过数据源,如果没有找到将抛出异常。
一般情况下使用<sql:setDateSource>标签设置一个数据源存储在session范围中,当需要数据库连接时使用dataSource属性并实现数据库的操作。
<sql:query>的var属性是必须的用来存放结果集,如果没有指定scope范围则默认为page,即在当前页面我们可以随时输出查询结果。结果集有一系列的属性如表9-17所示。
maxRows和startRow属性用来操作结果集,使用SQL语句首先吧数据放入内存中,检查是否设置了startRow属性,如果设置了就从starRow指定的那一行开始取maxRows个值,如果没有设定则从第一行开始取。
表9-17 结果集参数说明
属性名 |
类型 |
说明 |
rowCount |
int |
结果集中的记录总数 |
Rows |
Java.util.Map |
以字段为索引查询的结果 |
rowsByIndex |
Object[] |
以数字为作索引的查询结果 |
columnNames |
String[] |
字段名称数组 |
limitedByMaxRows |
boolean |
是否设置了maxRows属性来限制查询记录的数量 |
提示:limitedByMaxRows用来判断程序是否收到maxRows属性的限制。并不是说设定了maxRows属性,得到结果集的limitedByMaxRows的属性都为true,当取出的结果集小于maxRows时,则maxRows没有对结果集起到作用此时也为false。例如可以使用startRow属性限制结果集的数据量。
结果集的作用就是定义了数据在页面中的显示方式。下面给出了结果集每个属性的作用。
rowCount属性。该属性统计结果集中有效记录的量,可以使用于大批量数据分页显示。
Rows属性。等到每个字段对应的值。返回的结果为:字段名={字段值···}
rowsByIndex属性。常用得到数据库中数据的方式,从有效行的第一个元素开始遍历,到最后一个有效行的最后一个元素。
columnNames属性。用于得到数据库中的字段名。
limitedByMaxRows属性。用于判断是否受到了maxRows的限制。
【示例代码】:代码9.20给出了配置数据库连接,和使用<sql:query>查询数据以及结果集属性的使用。
代码9.20 数据库示查询示例:sqldemo01.jsp
<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglibprefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ pagecontentType="text/html;charset=GBK"%>
<html>
<head>
<title>JSTL:SQL标签</title>
</head>
<body >
<h3>SQL标签库</h3>
<hr>
<sql:setDataSourcedriver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
user="sa" password="" />
<sql:queryvar="result" sql="select * from person"maxRows="2" startRow="1"/>
结果集的实质是:${result}<br>
得到的行数为:${result.rowCount}<br>
是否收到了maxRows的限制:${result.limitedByMaxRows}
<hr>
<tableborder="1" align="center">
<tr><c:forEachvar="columnName" items="${result.columnNames}">
<td>
<c:outvalue="${columnName}"/>
</td>
</c:forEach></tr>
<c:forEachvar="row" items="${result.rowsByIndex}">
<tr>
<c:forEachvar="column" items="${row}">
<td><c:outvalue="${column}"/></td>
</c:forEach>
</tr>
</c:forEach>
</table>
</body>
</html>
【代码解析】:
(1)配置数据源。使用<sql:dataSource>标签配置数据源,因为只共本页使用因此存储在默认的page范围中。
(2)使用<sql:query>标签进行数据库查询,并定义了maxRows和startRow属性。并把结果集存储于作用于page范围的result变量。使用${result}输出可以发现结果集就是一个ResultImpl类。
提示:在进行数据源配置时程序不会检查数据库连接是否配置正确,直接根据设定的数据库及连接访问,如果没有找到则抛出操作的表异常,因此要放如<c:catch></c:catch>同时在编写程序时一定要注意数据源是否配置正确。
(3)使用结果集的rowCount属性得到记录的总量。代码为:
${result.rowCount}
(4)使用结果集的limitedMaxRows属性判断是否收到maxRows设定的影响。代码为:
${result.limitedMaxRows}
(5)从结果集中得到数据库中定义的所有的字段。${result.columnnames}得到的结果是一个字符串数组,因此需要使用<c:forEach>循环输出。代码如下:
<c:forEachvar="columnName" items="${result.columnNames}">
<c:outvalue="${columnName}"/>
</c:forEach>
(6)从结果集中得到所有的值。首先要遍历每一行,然后遍历每一行中的元素,因此需要循环嵌套。代码如下:
<c:forEachvar="columnName" items="${result.columnNames}">
<c:outvalue="${columnName}"/>
</c:forEach>
<c:forEachvar="row" items="${result.rowsByIndex}">
<c:forEachvar="column" items="${row}">
<c:outvalue="${column}"/></td>
</c:forEach>
</c:forEach>
提示:在代码解析中省略了html元素表格等标签的元素,本示例适用于任何数据库表,只要把数据库的URL、使用的JDBC进行相应的配置和操作的数据表名进行相应的修改即可看到结果。
2. <sql:update>标签
<sql:update>用来实现操作数据库如:使用create、update、delete和insert等SQL语句,并返回影响记录的条数。
【语法1】:SQL语句放在标签属性中。
<sql:update sql=”SQL语句” [var=”name”] [scope=”page|request|session|application”]
[dateSource=”dateSource”]/>
【语法2】:SQL语句放在标签体内。
<sql:update [var=”name”][scope=”page|request|session|application”]
[dateSource=”dateSource”]
>
SQL语句
</sql:update>
【参数说明】:见表9-18。
表9-18 <sql:update>标签属性说明
参数名 |
说明 |
EL |
类型 |
必须 |
默认值 |
sql |
查询数据的SQL语句 |
是 |
String |
是 |
无 |
dataSource |
数据源对象 |
是 |
String Javax.sql.DataSoutce |
否 |
无 |
var |
指定存储查询结果的变量名 |
否 |
String |
是 |
无 |
scope |
指定结果的作用域 |
否 |
String |
否 |
page |
提示:<sql:update>标签的属性同<sql:query>标签的属性相比只减少了maxRows和startRow2个属性。其他参数用法一样。
使用<sql:update>可以实现数据表的创建、插入数据、更行数据、删除数据。使用时只须在标签中放入正确的SQL语句即可,同时要捕获可能产生的异常。本节只对一个简单的插入操作进行说明。
【示例代码】:代码9.21实现了创建一个表、实现数据的插入。
代码9.21 数据库创建、数据插入示例:sqldemo02.jsp
<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglibprefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ pagecontentType="text/html;charset=GBK"%>
<html>
<head>
<title>JSTL:SQL标签</title>
</head>
<body >
<h3>SQL标签库</h3>
<hr>
<sql:setDataSourcedriver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
user="sa" password="" />
实现数据库表的创建<br>
<sql:update var="result1">
create table c_user (
id int primary key ,
name varchar(80),
sex varchar(80),
)
</sql:update>
<c:catchvar="error">
<sql:updatevar="result2" >
insert c_uservalues(05,'Linda','女')
insert c_uservalues(01,'Rom','男' )
</sql:update>
影响的记录数为:<c:outvalue="${result2}"></c:out>
</c:catch>
<c:outvalue="${error}"></c:out><br>
<hr>
</body>
</html>
【代码解析】:
(1)配置数据源。
(2)使用<sql:update>标签创建一个新表。
(3)向表中插入两行数据。
提示:本示例也没有针对固定的表进行操作,在使用时直接运行即可,如果使用的是其他数据库,需要更改数据源配置和SQL语句部分修改。
3. <sql:param>标签
<sql:param>标签用于动态的为SQL语句设定参数,同<sql:query>标签共同使用。可以防止SQL注入作用类似于java.sql.PreparedStatement。
【语法1】:
<sql:paramvalue=”value”/>
【语法2】:
<sql:param>
Value
</sql:param>
【参数说明】:
value的作用为SQL中的参数赋值。
【使用示例】:
<sql:queryvar=”result”>
select * from person where 序号=?
<sql:query>
4. <sql:dateParam>标签
<sql:dataParam>标签主要用于为SQL标签填充日期类型的参数值。
【语法】:
<sql:dateParamvalue=”date”[type=”timestamp|time|date”]/>
【参数说明】:
value属性:java.util.Date类型的参数。
type属性:指定填充日期的类型timestamp(全部日期和时间)、time(填充的参数为时间)、date(填充的参数为日期)。
5. <sql:transaction>标签
<sql:transaction>标签提供了数据操作的一种安全机制(即事务回滚),当操作数据库的某条SQL语句发生异常时,取消<sql:transaction>标签体中的所有操作,恢复原来的状态,重新对数据库进行操作。
【语法】:
<sql:transaction[dataSource=”dataSource”]
[isolation=”read_committed|read_uncommitted|repeatable|serializable”]
>
<sql:query>
<sql:uptade>
</sql:transation>
五、 XML标签库
JSTL的XML处理标签库提供XML剖析、取出元素与属性和XSLT转换等相关标签。
引入XML标签库的格式:
<%@ tagliburi="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
(一) XML核心标签库
1.<x:parse>标签
<x:parse/>标签用来解析指定的xml文件。
【语法1】:
<x:parse doc=”xmlDocument”
{var=”name”[scope=”page|request|session|application”]|varDom=”name”[scope=”page|request|session|application”]}
systemId=”systemId”
filter=”filter”
/>
【语法2】:
<x:parse
{var=”name”[scope=”page|request|session|application”]|varDom=”name”[scope=”page|request|session|application”]}
systemId=”systemId”
filter=”filter”
>
xmlDocument
</x:parse>
【参数说明】:见表9-20。
表9-20 <x:parse>标签属性说明
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
doc |
指定解析的xml文件 |
是 |
String/Reader |
是 |
无 |
var |
存储解析后的xml文件 |
否 |
String |
否 |
无 |
scope |
指定var的JSP范围 |
否 |
String |
否 |
page |
varDom |
以(org.w3c.dom.Doucemet)的形式存储解析的xml文件 |
否 |
String |
否 |
无 |
scopeDom |
指定varDom的JSP范围 |
否 |
String |
否 |
page |
systemId |
xml文件的url |
是 |
String |
否 |
无 |
filter |
解析xml文件的过滤器 |
否 |
Org.xml.sax.Filter |
否 |
无 |
提示:doc指定解析的xml文件并不是指定xml文件的路径,而是同<c:import>共同使用,由<c:import>加载并存储,然后使用<x:parse>解析。
例如:如果解析person.xml文件需要通过如下代码实现对xml文件的解析。
<c:import var="docString"url="person.xml"/><!--引入person.xml文件-->
<x:parse var="doc"doc="${docString}"/>
<c:import>语句用来导入或存储文件到JSP。如果不使用var来存储,xml文件将显式的出现在JSP文件中。
<x:parse>标签只用来解析xml文件,并不显示xml文件中的内容,如果想得到xml的节点元素或值需要使用<x:out>元素来实现。
2.<x:out>标签
<x:out>标签主要用来输出xml的信息。
【语法】:
<x:outselect=”XpathExperssion”[excapeXml=”true|false”]>
【参数说明】:见表9-21。
表9-21 <x:out>标签属性说明
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
select |
指定使用的XPath语句 |
否 |
String |
是 |
无 |
escapeXml |
是否转换特殊字符。如<等 |
否 |
boolean |
是 |
true |
提示:使用XPath语句需要用到xalan.jar支持包,可以从示例程序的lib中获取,获得直接从myEclipse中可以找到。
3.<x:set>标签
<x:set>标签用于将从xml文件节点解析的内容存储到JSP属性范围中。
【语法】:
<x:set select=”XPathExperssion” var=”name”scope=”page|request|session|application”>
【参数说明】:
(1)select通过指定的XPath表达式语句获取节点的值。
(2)var指定用于存储值的变量名。
(3)指定var的JSP属性范围。
(二) XML流程控制
使用xml标签库的流程控制标签可以迭代处理xml文件的内容,流程控制可以分为以下两个方面的内容:
(1)条件判断。
(2)循环功能。
1.<x:if>
<x:if>主要用于条件判断。
【语法1】:未含有本体内容。
<x:if select=”XPathExperssion”var=”name”[scope=”page|request|session|application”]/>
【语法2】:含有本体内容。
<x:if select=”XPathExperssion” var=”name”[scope=”page|request|session|application”]
>
Body内容
</x:if>
语法1只把根据条件表达式得到的结果的存储在JSP范围中,语法2根据<x:if>标签根据条件表达式的结果决定是否执行本体内的代码。
【参数说明】:
(1)select用来指定使用的XpathExperssion表达式。
(2)var设定标量名用来存储表达式的结果。
(3)scope指定var存储的JSP属性范围。
2.<x:choose>、<x:when>和<x:otherwise>标签
同核心标签库的<c:choose>、<c:when>和<c:otherwise>标签作用相似,只是使用的条件表达式不同。
<x;choose>是主标签,<x:when>和<x:otherwise>放在<x:choose>标签体内共同使用。
【语法】:
<x:choose>
<x:when>
<x:when>
<x:otherwise>
</x:choose>
其中只有<x:when>有属性。
【语法】:
<x:when select=”XPathExperssion”>
3.<x:forEach>标签
<x;forEach>标签实现了对xml文档的遍历。
【语法】:
<x:forEachselect=”XPathExperssion”[var=”name”][varStartus=”StartusName”]
[begin=”begin”][end=”end”][step=”step”]
>
//标签主体
</x:forEach>
【参数说明】:见表9-22。
表9-22 <x:forEach>标签属性说明
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
select |
指定使用的XPath语句 |
否 |
String |
是 |
无 |
var |
用于存储表达式的结果 |
否 |
String |
否 |
无 |
varStatus |
用来存放循环到的变量的相关信息 |
否 |
String |
否 |
无 |
begin |
循环的起始位置 |
是 |
int |
否 |
无 |
end |
循环的终止位置 |
是 |
int |
否 |
无 |
(三) xml的文件转换
<x:transform>和<x:param>能轻易使用XSLT样式包装xml文件,成为另一种显示方式。
1.<x:transform>标签
使用该标签可以轻松的实现xml到XSLT的转化。
【语法1】:
<x:transform doc=”xmldoc”xslt=”XSLTStytlesheet”[docSystemId=”xmlsystemid”]
[result=”result”]
[var=”name”]
[scope=”scopeName”]
[xsltSystemId=”xsltsystemid”]/>
【语法2】:
<x:transform doc=”xmldoc”xslt=”XSLTStytlesheet”[docSystemId=”xmlsystemid”]
[result=”result”]
[var=”name”]
[scope=”scopeName”]
[xsltSystemId=”xsltsystemid”]
>
<x:param/>
</x:transform>
【语法3】:
<x:transform doc=”xmldoc”xslt=”XSLTStytlesheet”[docSystemId=”xmlsystemid”]
[result=”result”]
[var=”name”]
[scope=”scopeName”]
[xsltSystemId=”xsltsystemid”]
>
Xml文件内容
<x:param/>
</x:transform>
【参数说明】:见表9-23。
表9-23 <x:transform>标签属性说明
属性名 |
说明 |
EL |
类型 |
必须 |
默认值 |
doc |
指定xml文件来源 |
是 |
String |
是 |
无 |
xslt |
转化xml的样式模板 |
是 |
String |
是 |
无 |
docSystemId |
xml文件的URI |
是 |
String |
否 |
无 |
xsltSystemId |
xslt文件的URI |
是 |
String |
否 |
无 |
result |
用来存储转换后的结果对象 |
是 |
java.xml.transform |
是 |
无 |
var |
以org.w3c.dom.Documet类型存储转换后的结果 |
否 |
String |
否 |
无 |
scope |
var的属性范围 |
否 |
String |
否 |
无 |
2.<x:param>标签
该标签用来为<x:transform>标签转换参数。
【语法1】:
<x:param name=”name” value=”value”/>
【语法2】:
<x:param name=”name” value=”value”
>
Value
</x:param>
【参数说明】:
(1)name指定参数的名称。
(2)value指定参数值。
六、 函数(function)标签库
引入函数(function)标签库的格式为:
<%@ taglib prefix="fn"uri="http://java.sun.com/jsp/jstl/functions" %>
方法的描述:
函数 |
描述 |
fn:contains(string, substring) |
如果参数string中包含参数substring,返回true |
fn:containsIgnoreCase(string, substring) |
如果参数string中包含参数substring(忽略大小写),返回true |
fn:endsWith(string, suffix) |
如果参数 string 以参数suffix结尾,返回true |
fn:escapeXml(string) |
将有特殊意义的XML (和HTML)转换为对应的XML character entity code,并返回 |
fn:indexOf(string, substring) |
返回参数substring在参数string中第一次出现的位置 |
fn:join(array, separator) |
将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。 |
fn:length(item) |
返回参数item中包含元素的数量。参数Item类型是数组、collection或者String。如果是String类型,返回值是String中的字符数。 |
fn:replace(string, before, after) |
返回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果 |
fn:split(string, separator) |
返回一个数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素 |
fn:startsWith(string, prefix) |
如果参数string以参数prefix开头,返回true |
fn:substring(string, begin, end) |
返回参数string部分字符串, 从参数begin开始到参数end位置,包括end位置的字符 |
fn:substringAfter(string, substring) |
返回参数substring在参数string中后面的那一部分字符串 |
fn:substringBefore(string, substring) |
返回参数substring在参数string中前面的那一部分字符串 |
fn:toLowerCase(string) |
将参数string所有的字符变为小写,并将其返回 |
fn:toUpperCase(string) |
将参数string所有的字符变为大写,并将其返回 |
fn:trim(string) |
去除参数string 首尾的空格,并将其返回 |
举例:
函数名 |
使用举例 |
fn:contains(string, substring) |
<c:if test="${fn:contains(name, searchString)}"> |
fn:containsIgnoreCase(string, substring) |
<c:if test="${fn:containsIgnoreCase(name, searchString)}"> |
fn:endsWith(string, suffix) |
<c:if test="${fn:endsWith(filename, ".txt")}"> |
fn:escapeXml(string) |
${fn:escapeXml(param:info)} |
fn:indexOf(string, substring) |
${fn:indexOf(name, "-")} |
fn:join(array, separator) |
${fn:join(array, ";")} |
fn:length(item) |
${fn:length(shoppingCart.products)} |
fn:replace(string, before, after) |
${fn:replace(text, "-", "•")} |
fn:split(string, separator) |
${fn:split(customerNames, ";")} |
fn:startsWith(string, prefix) |
<c:if test="${fn:startsWith(product.id, "100-")}"> |
fn:substring(string, begin, end) |
${fn:substring(zip, 6, -1)} |
fn:substringAfter(string, substring) |
${fn:substringAfter(zip, "-")} |
fn:substringBefore(string, substring) |
${fn:substringBefore(zip, "-")} |
fn:toLowerCase(string) |
${fn.toLowerCase(product.name)} |
fn:toUpperCase(string) |
${fn.UpperCase(product.name)} |
fn:trim(string) |
${fn.trim(name)}
|
参考文献:
【1】 http://chengwei2009.blog.163.com/blog/static/22868328200921810384692/
【2】 http://www.blogjava.net/maverick1003/articles/236575.html