窗体顶端
jstl
第9章 JSTL标签库
JSTL标签库的使用是为类弥补html表的不足,规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后,人们开始注重软件的分层设计,不希望在jsp页面中出现java逻辑代码,同时也由于自定义标签的开发难度较大和不利于技术标准化产生了自定义标签库。JSTL标签库可分为5类:
q 核心标签库
q I18N格式化标签库
q SQL标签库
q XML标签库
q 函数标签库
本章将对这些内容一一讲述。
JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。
(1)表达式控制标签:out标签、set标签、remove标签、catch标签。
(2)流程控制标签:if标签、choose标签、when标签、otherwise标签。
(3)循环标签:forEach标签、forTokens标签。
(4)URL操作标签:import标签、url标签、redirect标签。
在JSP页面引入核心标签库的代码为:
<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
下面将按照功能分类,分别讲解每个标签的功能和使用方式。
表达式控制分类中包括
1.
【功能】:用来显示数据对象(字符串、表达式)的内容或结果。
在使用Java脚本输出时常使用的方式为:
<% out.println(“字符串”)%>
<%=表达式%>
在web开发中,为了避免暴露逻辑代码会尽量减少页面中的Java脚本,使用
提示:JSTL的使用是和EL表达式分不开的,EL表达式虽然可以直接将结果返回给页面,但有时得到的结果为空,
【语法1】:
【语法2】:
这两种方式没有本质的区别,只是格式上的差别。标签的属性介绍如下。
q value:指定要输出的变量或表达式。
q escapeXml:设定是否转换特殊字符(如<、>等一些转义字符),在默认值为true的情况下直接在输出<的,如果改为false将会进行转义输出“<”等。
q default:为默认输出结果。如果使用表达式得到的结果为null(注意与空区别),将会输出默认结果。
【示例代码】:代码9.1演示了
代码9.1
1 <%@ pagepageEncoding="gbk" %>
2 <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3
4
5
6
7
8
9
10
11
12
13
14
【代码解析】:
(1)第8行为
(2)第9行和第10行对比,在改变escapeXml属性后页面输出的转义字符。
(3)第11行value得到null,如果方法体内有值,将输出方法体中的字符串,否则不输出,第12行没有输出结果。
程序运行结果如图9.1所示。
图9.1 coredemo01.jsp运行结果
【代码解析】:
(1)直接输出了一个字符串。
(2)字符串中有转义字符,但在默认情况下没有转换。
(3)使用了转义字符<和>分别转换成<和>符号。
(4)设定了默认值,从EL表达式${null}得到空值,所以直接输出设定的默认值。
(5)未设定默认值,输出结果为空。
2.
功能:主要用于将变量存取于JSP范围中或JavaBean属性中。
语法1:存值,把一个值放在指定(page、session等)的map中。
含义:把一个变量名为name1值为“值1”的变量存储在指定的scope范围内。
语法2:
值2
含义:把一个变量名为name2,值为值2的变量存储在指定的scope范围内。
语法3:
含义:把一个值为“值3”赋值给指定的JavaBean的属性名。相当与setter()方法。
语法4:
值4
含义:把一个值4赋值给指定的JavaBean的属性名。
提示:从共能上分语法1和语法2、语法3和语法4的效果是一样的只是把value值放置的位置不同至于使用那个根据个人的喜爱,语法1和语法2是向scope范围内存储一个值,语法3和语法4是给指定的JavaBean赋值。
【示例代码】:代码给出了给指定scope范围赋值的示例。使用
代码9.2 使用
1 <%@ pagelanguage="java" pageEncoding="gbk"%>
2 <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3
4
5
6
7
8
9
10
11
12
13
14
15
【代码解析】:
(1)第8行通过
(2)第9行使用EL表达式得到name1的值。
(3)第10行把name2放入application范围中。
(4)第11行使用EL表达式从application范围中取值,用
(5)第13行不指定范围使用EL自动查找得到值。
程序运行的结果如图9.2所示。
图9.2 coredemo02.jsp
在代码中未使用任何Java脚本使用程序的功能。为了对比期间,代码9.3给出了使用Java脚本实现以上功能的例子。
代码9.3 Java脚本实现值的存取:getvalue.jsp
1 <%@pagelanguage="java" pageEncoding="gbk"%>
2
3
4
5
6
7
8
9
10
11
12
【代码解析】:使用JSP内置对象的方法实现存值和取值的功能。
程序运行结果如图9.3所示:
图9.3 getvalue.jsp运行结果
提示:本章示例为了方便期间都是从一个页面中存取,在开发中值的存取是为了不同的JSP页面之间共享数据
从两个程序对比来看,JSTL实习了使用标签完成取值赋值的功能,减少代码的编写量同时避免了逻辑代码暴露的危险。
【程序示例】:代码9.4和代码9.5演示使用
(1)创建一个JavaBean对象。
代码9.4 JavaBean(vo数据传输对象):Person.java
1 package org.olive;
2 public class Person {
3 private Stringname; //定义私有变量姓名字符串
4 private intage; //定义私用变量年龄整型
5 private charsex; //定义私用变量性别字符性
6 private Stringhome; //定义私用变量家乡字符串
7 public String getName(){ //name的getter方法
8 return name;
9 }
10 public void setName(Stringname) { //name的setter方法。
11 this.name = name;
12 }
13 public int getAge(){ //age的getter方法
14 return age;
15 }
16 public void setAge(int age){ //age的setter方法
17 this.age = age;
18 }
19 public char getSex(){ //sex的getter方法
20 return sex;
21 }
22 public void setSex(char sex){ //sex的setter方法
23 this.sex = sex;
24 }
25 public String getHome(){ //home的getter方法
26 return home;
27 }
28 public void setHome(Stringhome){ //home的setter方法
29 this.home = home;
30 }
31 }
【代码解析】:一个只有getter和setter方法的JavaBean或者说一个pojo类,作为一个vo(数据传输对象)。定义了四个变量age、name、sex和home。
(2)创建JSP页面,实现对值的操作。
代码9.5 操作JavaBean:coredemo03.jsp
1 <%@ pagelanguage="java" pageEncoding="gbk"%>
2
3 <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
【代码解析】:
(1)第1行设置页面格式和字符编码集。
(2)第2行使用JSP的指令元素指定要使用的JavaBean。
(3)第3行引入JSTL核心标签库。
(4)第9~12行设置JavaBean的属性值,等同与setter方法。
(5)使用EL表达式得到JavaBean的属性值,并用out标签输出。
【关键代码】:
负责实例化Bean,id指定实例化后的对象名,可以通过${person}得到person在内存中的值(或者使用person.toString()方法)。
Target指向实例化后的对象,property指向要插入值的参数名。
注意:使用target时一定要指向实例化后的JavaBean对象,也就是要跟
使用Java脚本实例化:
<%@pageimport=”org.olive.Person”%
<% Personperson=new Person(); %>
程序运行结果如图9.4所示。
图9.4 coredemo03.jsp运行结果
3.
【语法】:
其中var属性是必须的,scope可以以省略。
【示例程序】:代码9.6使用set标签在session中插入2个值,然后用remove标签移除。
代码9.6
1 <%@ page language="java" pageEncoding="gbk"%>
2 <%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
【代码解析】:
(1)第8~9行使用set标签向session中插入三个值:name值为olive、age值为25、sex值为男。
(2)第11~13行使用out和EL表达式输出name、age、sex的值。
(3)第14行使用remove标签移除age的值,然后使用步骤第11~13行中的三个输出作为比较。
4.
用来处理JSP页面中产生的异常,并将异常信息存储。
【语法】:
容易产生异常的代码
【参数说明】:
var表示由用户定义存取异常信息的变量的名称。省略后也可以实现异常的捕获,当就不能显示的输出异常信息。
【示例代码】:代码9.7使用
代码9.7
1 <%@ page language="java" pageEncoding="gbk"%>
2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
3
4
5
6
7
8
9
10
11 < c:set target="Dank"property="hao">
12
13
14
15
【代码解析】:
(1)第10~12把容易产生异常的代码放在
(2)第11行实现了一段异常代码,向一个不存在的JavaBean中插入一个值。
(3)第13行用EL表达式得到error的值,并使用
程序结果如图所示。
图9.5 coredemo05.jsp
图中异常信息的提示为:在
图9.6 程序异常
提示:本示例没有使用捕获Java脚本的样式,如果使用标签再使用Java脚本的意义不大,由此可以看出
9.2.2 流程控制标签
流程控制标签主要用于对页面简单业务逻辑进行控制。流程控制标签包含有4个:
1.
【语法1】:
【语法2】:
【参数说明】:
(1)test属性用于存放判断的条件,一般使用EL表达式来编写。
(2)var指定名称用来存放判断的结果类型为true或false。
(3)scope用来存放var属性存放的范围。
【使用场景】:在开发中经常会出现不同用户的权限,首先对用户名进行判断(包括进行数据库验证,该功能可以由JavaBean实现,使用EL表达式得到一个布尔型的结果),把判断的结果存放在不同的JSP范围内(比如常用的session内),这样在每个页面都可以得到该用户的权限信息,根据不同权限的用户显示不同的结果。
【示例代码】:代码9.8实现了用户输入用户名提交到自身页面,页面判断用户是否为admin,如果是将出现欢迎界面,如果不是显示不同结果。
代码9.8
1 <%@ pagelanguage="java" pageEncoding="gbk"%>
2 <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3
4
5
6
7
8
9
10
14
15
16
17
18 ${adminchock}
19
20
【代码解析】:
(1)第10~13行创建一个表单,表单中的元素为一个text文本输入框,一个提交按钮,并把信息提交给本页。
(2)第14行使用if标签进行判断,如果输入的为admin将显示出定义的字符串,并把检验后的结果赋给adminchock,存储在默认的page范围中。
(3)第18行使用EL表达式得到adminchock的值,如果输入的用户名为admin将显示true。
程序运行效果如图9.7所示。
图9.7 coredemo06.jsp运行结果
提示:可以把adminchock的属性范围设置为session,可以在其他的页面中得到adminchock的值,使用
2.
这3个标签通常情况下是一起使用的,
【语法1】:
…..//业务逻辑1
…..//业务逻辑2
….//业务逻辑3
【语法2】:
表达式
【语法3】:
表达式
【参数说明】:
(1)语法1为3个标签的嵌套使用方式,
(2)语法2为
(3)
【示例代码】:代码9.9设定一个score变量的值为85,使用嵌套标签进行判断,根据判断返回结果。
代码9.9 循环控制标签:coredemo07.jsp
1 <%@ pagelanguage="java" pageEncoding="gbk"%>
2 <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3
4
5
6
7
8
9
10
11
12 c:when test="${score>=90}">
13 你的成绩为优秀!
14
15
16 您的成绩为良好!
17
18
19 您的成绩为及格
20
21
22 对不起,您没有通过考试!
23
24
25
26
【代码解析】:
(1)第10行通过set标签设定score的值为85。
(2)第12~22行使用
如果大于等于70小于90,输出“您的成绩为良好”;大于等于60小于70,输出“您的成绩为及格”;其他(otherwise)输出“对不起,您没能通过考试”。
程序运行结果如图9.8所示。
图9.8 coredemo07.jsp运行结果
9.2.3 循环标签
循环标签主要实现迭代操作。主要包含两个标签:
1.
该标签根据循环条件遍历集合(Collection)中的元素。
【语法】:
本体内容
【参数解析】:
(1)var设定变量名用于存储从集合中取出元素。
(2)items指定要遍历的集合。
(3)varStatus设定变量名,该变量用于存放集合中元素的信息。
(4)begin、end用于指定遍历的起始位置和终止位置(可选)。
(5)step指定循环的步长。
参数类型和相关说明见表9-1。
表9-1 循环标签属性说明
名称 |
EL |
类型 |
是否必须 |
默认值 |
var |
N |
String |
是 |
无 |
items |
Y |
Arrays Collection Iterator Enumeration Map String []args |
是 |
无 |
begin |
Y |
int |
否 |
0 |
end |
Y |
int |
否 |
集合中最后一个元素 |
step |
Y |
int |
否 |
1 |
varStatus |
N |
String |
否 |
无 |
其中varStatus有4个状态属性(见表9-2)。
表9-2 varStatus的4个状态
属性名 |
类型 |
说明 |
index |
int |
当前循环的索引值 |
count |
int |
循环的次数 |
frist |
boolean |
是否为第一个位置 |
last |
boolean |
是否为第二个位置 |
【示例代码】:代码9.10实现了遍历的两种方式:设定起始位置、不设定起始位置。同时实现了获得原属的状态信息。
代码9.10
1 <%@ pagecontentType="text/html;charset=GBK" %>
2 <%@pageimport="java.util.List"%>
3 <%@page import="java.util.ArrayList"%>
4 <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
5
6
7
8
9
10
11
12 <%
13 List a=new ArrayList();
14 a.add("贝贝");
15 a.add("晶晶");
16 a.add("欢欢");
17 a.add("莹莹");
18 a.add("妮妮");
19 request.setAttribute("a",a);
20 %>
21
22
23
24
25
26
27
28
29
30
31
32 所在位置,即索引:
33 总共已迭代的次数:
34 是否为第一个位置:
35 是否为最后一个位置:
36
37
38
【代码解析】:
(1)第13~18行通过Java脚本创建了一个集合对象a,并添加元素。
(2)第19行使用setAttribute()方法把集合存入request范围内。
(3)第22~24行未指定begin和end属性,直接从集合开始遍历到集合结束为止。
(4)第26~28行指定从集合的第二个(index值为1)元素开始,到第四个(index值为3)元素截止(index的值从0开始)。并指定step为2即每隔两个遍历一次。
(5)第30~35指定varStatus的属性名为s,并取出存储的状态信息。
程序运行结果如图9.9所示。
图9.9 coredemo08.jsp运行结果
【总结】:
(1)从图中可以看到不使用begin和end的迭代,从集合的第一个元素开始,遍历到最后一个元素。
(2)指定begin的值为1、end的值为3、step的值为2,从第二个开始首先得到晶晶,每两个遍历一次,则下一个显示的结果为莹莹,end为3则遍历结束。
(3)从指定的begin和end的值来看遍历第四个和第五个,因得到莹莹和妮妮。相关状态信息如图所示。
提示:本例使用的list是在JSP页面中使用Java脚本创建的,是因为JSTL缺少创建集合的功能,在开发中一般不会如此,可通过访问数据库得到数据集合,和通过设定JavaBean的值得到数据集合
2.
该标签用于浏览字符串,并根据指定的字符将字符串截取。
语法:
【参数说明】
(1)items指定被迭代的字符串。
(2)delims指定使用的分隔符。
(3)var指定用来存放遍历到的成员。
(4)begin指定遍历的开始位置(int型从取值0开始)。
(5)end指定遍历结束的位置(int型,默认集合中最后一个元素)。
(6)step遍历的步长(大于0的整型)。
(7)varStatus存放遍历到的成员的状态信息。
【示例代码】:代码9.11实现了遍历一个有符号的字符串,把指定的符号移除。指定begin和end值,并获得遍历到的元素的状态信息。
代码9.11
1 <%@ pagecontentType="text/html;charset=GBK" %>
2 <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 所在位置,即索引:
19 总共已迭代的次数:
20 是否为第一个位置:
21 是否为最后一个位置:
22
23
24
【代码解析】:
(1)本示例共实现了3个
(2)13~15行第2个循环遍历一串带有分隔符的电话号码,不读取分隔符号,将显示一个字符串。
(3)16~22行第3个循环遍历一个带“*”号的字符串,根据指定的起始位置把元素取出,并显示每个元素的状态信息。
提示:分隔符的作用是根据标识,截取字符串。如果未设定分隔符或在字符串中没有找到分隔付,将把整个元素作为一个元素截取。在实际应用中用于在除去某些符号在页面中显示。
程序运行结果如图9.10所示。
图9.10 coredemo08.jsp
9.2.4 URL操作标签
JSTL包含3个与URL操作有关的标签,分别为:
1.
该标签可以把其他静态或动态文件包含到本JSP页面。同
语法1:
[scope=”page|request|session|application”][charEncoding=”encoding”]> 语法2: 主要参数见表9-3。 表9-3 名称 说明 EL 类型 必须 默认值 url 被导入资源的URL路径 Y String 是 无 context 相同服务器下其他的web工程,必须以“"”开头 Y String 否 无 var 以String类型存入被包含文件的内容。 N String 否 无 Scope var变量的JSP范围 N String 否 page charEncoding 被导入文件的编码格式 Y String 否 无 varReader 以Reader类型存储被包含文件内容 N String 否 无 【参数说明】: (1)URL为资源的路径,当应用的资源不存在时系统会抛出异常,因此该语句应该放在 使用相对路径的实例如下: aa.txt放在同一文件目录。 如果以“/”开头表示应用的根目录下。例如:tomcat应用程序的根目录文件夹为webapps。导入webapps下的文件bb.txt的编写方式为: 如果访问webapps管理文件夹中其他web应用就要用context属性。 (2)context属性用于在访问其他web应用的文件时,指定根目录。例如,访问root下的index.jsp的实现代码为: 等同于webapps/root/index.jsp (3)var、scope、charEncoding、varReader是可选属性。具体使用方式见示例代码。 【示例代码】:代码9.12实现了从绝对路径导入文件和从相对路径导入,同时使用var对象指定用变量来存储文件,并输出存入的文件内容。 代码9.12 1 <%@ pagecontentType="text/html;charset=GBK" %> 2 <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
【代码解析】:
(1)第12行使用绝对路径导入百度首页,导入时使用
(2)使用相对路径导入同一文件夹下的a1.txt文件,接收的字符编码格式使用charEncoding设置为gbk。
(3)同样导入a1.txt,不同的时使用var定义的变量接收要导入的文件,并存储在session中,如果在其他页面同样也要导入该文件,只须使用
程序结果如图9.11所示。
图9.11 coredemo10.jsp运行结果
【说明】:
(1)在使用绝对路径导入时,因为电脑没有联网所以抛出异常。
(2)使用相对路径输出时,同样是引入的a1.txt文件显示的结果却不相同,这可以说明直接使用
提示:读者在练习时可以使用Tomcat的首页来导入url=”http://127.0.0.1:8080”来显示效果。
2.
该标签用来实现了请求的重定向。同时可以在url中加入指定的参数。例如:对用户输入的用户名和密码进行验证,如果验证不成功重定向到登录页面;或者实现web应用不同模块之间的衔接。
【语法1】:
【语法2】:
【参数说明】:
(1)url指定重定向页面的地址,可以是一个string类型的绝对地址或相对地址。
(2)用于导入其他web应用中的页面。
【示例代码】:代码9.13实现了当请求页面时重定向到tomcat首页。
代码9.13
<%@ pagecontentType="text/html;charset=GBK" %>
<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
【代码解析】
(1)使用重定向与载入页面不同,载入页面时在本页面中插入其他页面,而重定向是请求转发,等于在页面中重新输入了一次url。当重定向到某个页面时浏览器中的地址会发生变化。
(2)使用重定向时不用使用
(3)在重定向时为URL添加了两个参数和参数值:uname=olive和password=01234。
程序运行结果如图9.12所示。
图9.12 coredemo11.jsp运行结果
提示:注意图中的URL地址已经发生转变,同时可以看到传入的参数以参数值。
3.
该标签用于动态生成一个String类型的URL,可以同
【语法1】:指定一个url不做修改,可以选择把该url存储在JSP不同的范围中。
[context=”context”]/> 【语法2】:给url加上指定参数及参数值,可以选择以name存储该url。 [context=”context”]> 【示例代码】:代码9.14实现了使用动态生成url实现了网页的超链接。 代码9.14 <%@ pagecontentType="text/html;charset=GBK" %> <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>使用url标签生成一个动态的url,并把值存入session中.
程序运行结果如图9.13所示。
图9.13 coredemo12.jsp运行结果
单击图中超链接可以直接访问到Tomcat首页。
9.3 I18N格式标签库
JSTL标签提供了对国际化(I18N)的支持,它可以根据发出请求的客户端地域的不同来显示不同的语言。同时还提供了格式化数据和日期的方法。实现这些功能需要I18N格式标签库(I18N-capable formation tags liberary)。引入该标签库的方法为:
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
I18N格式标签库提供了11个标签,这些 标签从功能上可以划分为3类如下:
(1)数字日期格式化。formatNumber标签、formatData标签、parseNumber标签、parseDate标签、timeZone标签、setTimeZone标签。
(2)读取消息资源。bundle标签、message标签、setBundle标签。
(3)国际化。setlocale标签、requestEncoding标签。
接下将详细介绍这些标签的功能和使用方式。
9.3.1 数字日期格式化
数字日期格式化标签共有6个,用来将数字或日期转换成设定的格式。
1.
该标签依据特定的区域将数字改变为不同的格式来显示。
【语法1】:
[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】: [pattern=”pattern”] [currencyCode=”code”] [currencySymbol=”symbol”] [groupingUsed=”true|false”] [maxIntergerDigits=”maxDigits”] [minIntergerDigits=”minDigits”] [maxFractionDigits=”maxDigits”] [minFractionDigits=”minDigits”] [var=”name”] [scope=page|request|session|application] > 被格式化的数据 属性说明如表9-4所示。 表9-4 名称 说明 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实现了对数字的格式化、货币的格式、货币的格式化。使用 代码9.14 <%@ pagelanguage="java" pageEncoding="gbk"%> <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglibprefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
【代码说明】:
(1)从应用角度可以把属性分为三类:数字格式化、货币格式化、百分比格式化。使用type指定类型。
(2)应用于数字格式化的属性有:partten属性、maxIntegerDigits属性、minIntegerDigits属性、maxFractionDigits属性和minFactionDigits属性。其中partten属性在设定格式化样式时会比较准确如:四舍五入、科学计数法的使用。而使用maIntegerDirgits等属性时,只把设定位数以外的数字舍去。
(3)货币格式化可以使用数字格式化的所有属性。如果有必要建议使用partten属性。currencyCode属性和currencySymbol只用于货币格式化。
(4)百分比格式化使用到的属性为type属性、partten属性,设定type属性的类型为percent即可。
(5)使用var属性时,会将格式化后的值存在JSP的某个范围内(一个String类型的字符串包括符号等)。
(6)通用属性:type属性、partten属性、var属性和scope属性。
程序运行结果如图9.14所示。
图9.14 fmtdemo01.jsp运行结果
提示:如果给定的数据类型有错误将或产生异常。例如:给定的数据为aa进行类型转化,将使应用程序无法显示。因此在实际应用中显示的格式化应该放入
2.
将格式化后的数字、货币、百分比都转化为数字类型。
【语法1】:
[pattern=”pattern”] [parseLocale=”locale”] [intergerOnly=”true|false”] [scope=”page|request|session|application”] /> 【语法2】: [pattern=”pattern”] [parseLocale=”locale”] [intergerOnly=”true|false”] [scope=”page|request|session|application”] > Number 属性说明见表9-6。 表9-6 名称 说明 EL 类型 是否必须 默认值 value 被解析的字符串 是 String 是 无 type 指定单位(数字、货币、百分比) 是 String 是 number pattern 格式样式 是 String 否 无 parseLocale 用来替代默认区域的设定 是 String, Java.util. Locale 是 默认本地样式 var 存储已经格式化的数据 否 String 否 无 scope var变量的作用域 否 String 是 page 【示例代码】:代码9.15实现了从字符串中提取数据,并用合适的数据类型进行存储(浮点性、整型等)。可以对转换后的数据进行加法运算。 代码9.15 <%@ pagelanguage="java" pageEncoding="gbk"%> <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglibprefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
【代码解析】:
(1)首先使用
(2)使用
则变量money转变为一个浮点型的值188.8,对188.8进行加运算。
(3)直接对一个百分比数98%进行转化。
程序运行结果如图9.15所示。
图9.15 fmtdemo02.jsp运行结果
提示:
3.
该标签主要用来格式化日期和时间。
【语法】:
[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 属性名 说明 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 <%@ pagelanguage="java" pageEncoding="gbk"%> <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglibprefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
timeStyle="default">
timeStyle="short">
timeStyle="long">
timeStyle="full">
timeStyle="full">
【代码解析】:
(1)首先通过配置JavaBean在页面上实例化java.util.Date对象。实现代码如下:
(2)对日期对象进行格式化时${date}是一个日期对象,如果给value设的值为String时程序会报错。
(3)设置type为both时,将显示日期和时间,同时示例中依次改变dateStyle和timeStyle的值作为比较。
程序结果如图9.16所示。
图9.16 fmtdemo03.jsp
使用IE的语言标签可以设置语言种类如图9.17所示。
9.17 改变使用默认语言
语言设为英文是程序效果如图9.18所示。
图9.18 语言为英文状态下的显示
4.
【语法1】:
[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】: [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 【参数说明】参数说明见表9-9. 表9-9 属性名 说明 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实现了以下功能:首先,使用了 代码9.16: <%@ pagelanguage="java" pageEncoding="gbk"%> <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglibprefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
dateStyle="full"timeStyle="full"> ${a} <% out.println(pageContext.getAttribute("b").toString()); out.println(" out.println(pageContext.getAttribute("b").hashCode()); %> 【代码解析】: (1)使用 (2)使用 (3)使用Java脚本进行测试Date对象的toString()方法可以输出时间字符串。hashCode()可以得到一个对象的hashCode。该方法只能应用于对象,因此可以证明得到的是一个日期对象。 程序运行结果如图9.19所示。 图9.19 fmtdemo04.jsp 提示: 5. 该标签用于设定默认时区或者将时区存储在指定的JSP范围内。 【语法】: 【参数说明】:见表9-10 表9-10 参数名 说明 EL 类型 必须 默认值 value 使用的时区 是 String Java.util.TimeZone 是 无 var 使用var定义的参数名保存值 否 String 否 无 scope 存储var的JSP范围 否 String 否 page value用来设定使用的时区,例如中国使用的时区为CST,其他的还有EST、PST等。可以把时区存储在指定的JSP范围内,例如存储在session中,用户访问的所有页面都可以显示使用的设定的时区下对应的时间。 【示例代码】 提示:有关TimeZone的说明见JDK帮助文档的java.util.TimeZone类。 6. 该标签主要用于设置标签体内使用的时区。 【语法】: ….. 使用 9.3.2 读取消息资源 读取消息资源用到的标签主要有4个: 1. 该标签主要用于将资源文件绑定于它的标签体中的显示。 【语法】: ….标签主题 【参数说明】:见表9-11。 表9-11 参数名 说明 EL 类型 必须 默认值 basename 指定使用的资源文件的名称 是 String 是 无 prefix 前置关键字 是 String 否 无 2. 该标签主要用于绑定资源文件或者把资源文件保存在指定的JSP范围内。 【语法】: [scope=”page|request|session|application”] > 【参数说明】:见表9-12。 表9-12 参数名 说明 EL 类型 必须 默认值 basename 指定使用的资源文件的名称 是 String 是 无 var 指定将资源文件保存的名称 否 String 否 无 scope 设定将资源文件保存的JSP范围 否 String 否 page 3. 该标签主要负责读取本地资源文件,从指定的消息文本资源文件中读取键值,并且可以将键值保存在指定的JSP范围内。 【语法1】: [scope=”page|request|session|application”] /> 【语法2】: [scope=”page|request|session|application”] > 【语法3】: [scope=”page|request|session|application”] > key … 【参数说明】:见表9-13。 表9-13 参数名 说明 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 <%@ pagelanguage="java" pageEncoding="gbk"%> <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglibprefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
");
${m}
【代码解析】:
(1)使用
(2)使用
(3)使用
(4)使用
(5)输出参数m的值,加深对bundle的理解。
程序运行结果如图所示。
图9.20 fmtdemo05.jsp运行效果
org.person.name=olive
org.personpassword=01234
如果不使用prefix标签,在取值是要指明前缀。例如:
使用prefix属性可以简化取值时的代码。
4.
该标签主要用于当
【语法1】:
【语法2】:
…标签主体
【示例代码】:
(1)创建资源文件。在message.properties文件中增加一个key和value。
news={0} welcometo out website!
today is :{1,date}
表达的含义是键news对应的是一个字符串,字符串中还有动态变量{0}表示第一个动态变量,{1,date}表示第二个动态变量并且该变量是一个日期类型的对象。
(2)通过标签从资源文件中取出键值,并给动态变量赋值显示在页面。
代码9.18
<%@ pagelanguage="java" pageEncoding="gbk"%>
<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglibprefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
【代码解析】:
(1)使用
(2)在
(3)使用
程序运行结果如图9.21所示。
图9.21 fmtdemo06.jsp运行结果
提示:资源文件经过修改后,应用程序需要重载才能生效。
9.3.3 国际化
国际化这个分类中共包含两个标签:用于设定语言地区
1.
【语法】:
[scope=”page|request|session|application”]> 【参数说明】:见表9-14。 表9-14 参数名 说明 EL 类型 必须 默认值 value 指定区域代码 是 String java.util.Locale 是 无 variant 操作系统的类型 是 String 是 无 scope 设定时区的作用范围 否 String 是 page value属性用来指定使用的语言代码,可以从浏览器的【工具】---【Internet选项】---【语言】---【添加】中查看浏览器支持的语言种类及语言代码。例如:中文(zh_cn)、台湾(zh_tw)、香港(zh_mo)等。 【示例代码】:代码9.19实现了设定不同的区域代码,根据不同的区域代码浏览将显示不同格式的日期。 代码9.19 <%@ pagelanguage="java" pageEncoding="gbk"%> <%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglibprefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
【代码解析】:
(1)浏览器默认跟您使用的操作系统的语言相同,因此默认值zh_cn。使用
(2)使用的语言修改为zh_cn,再次用格式化输出。
(3)使用语言修改为zh_TW,输出格式化后的时间。
程序运行结果如图所示。
图9.22 fmtdemo07.jsp运行结果
2.
该标签用于设定请求的编码格式。功能同servletRequest.setCharacterEncoding()方法相同。
【语法】:
【参数说明】:
value属性用来指定使用的编码集例如:gbk、gb2312等。当没有给出value的值时将会自动搜索取寻找合适的编码方式,因此能够很好的解决中文乱码问题。
9.4 SQL标签库
JSTL提供了与数据库相关操作的标签,可以直接从页面上实现数据库操作的功能,在开发小型网站是可以很方便的实现数据的读取和操作。本章将详细介绍这些标签的功能和使用方法。
SQL标签库从功能上可以划分为两类:设置数据源标签、SQL指令标签。
引入SQL标签库的指令代码为:
<%@ taglibprefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
9.4.1 设置数据源
使用
【语法1】:直接使用已经存在的数据源。
[scope=”page|request|session|application”]/> 【语法2】:使用JDBC方式建立数据库连接。 user=”username” password=”pwd” [var=”name”] [scope=”page|request|session|application”]/> 【参数说明】:见表9-15 表9-15 参数名 说明 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=”” 使用 url=”jdbc.microsoft:sqlserver://localhost:1433;DatabaseName=pubs” user=”sa” password=””> 如果连接其他数据库,只须把相对应的项修改即可。 提示:可以把数据连接的配置存入session中,如果再用到数据库连接只须配置使用DataSource属性。 9.4.2 SQL操作标签 JSTL提供了 1. 【语法1】: [dataSource=”dateSource”] [maxRow=”maxRow”] [startRow=”starRow”]/> 【语法2】: [dataSource=”dateSource”] [maxRow=”maxRow”] [startRow=”starRow”] > sqlQuery 【属性说明】:见表9-16。 表9-16 参数名 说明 EL 类型 必须 默认值 sql 查询数据的SQL语句 是 String 是 无 dataSource 数据源对象 是 String Javax.sql.DataSoutce 否 无 maxRow 设定最多可以暂存数据的行数 是 String 否 无 startRow 设定从那一行数据开始 是 String 否 无 var 指定存储查询结果的变量名 否 String 是 无 scope 指定结果的作用域 否 String 否 page 使用 一般情况下使用 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属性限制结果集的数据量。 结果集的作用就是定义了数据在页面中的显示方式。下面给出了结果集每个属性的作用。 q rowCount属性。该属性统计结果集中有效记录的量,可以使用于大批量数据分页显示。 q Rows属性。等到每个字段对应的值。返回的结果为:字段名={字段值···} q rowsByIndex属性。常用得到数据库中数据的方式,从有效行的第一个元素开始遍历,到最后一个有效行的最后一个元素。 q columnNames属性。用于得到数据库中的字段名。 q limitedByMaxRows属性。用于判断是否受到了maxRows的限制。 【示例代码】:代码9.20给出了配置数据库连接,和使用 代码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"%>
SQL标签库
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs" user="sa" password="" /> 结果集的实质是:${result} 得到的行数为:${result.rowCount} 是否收到了maxRows的限制:${result.limitedByMaxRows}
【代码解析】:
(1)配置数据源。使用
(2)使用
提示:在进行数据源配置时程序不会检查数据库连接是否配置正确,直接根据设定的数据库及连接访问,如果没有找到则抛出操作的表异常,因此要放如
(3)使用结果集的rowCount属性得到记录的总量。代码为:
${result.rowCount}
(4)使用结果集的limitedMaxRows属性判断是否收到maxRows设定的影响。代码为:
${result.limitedMaxRows}
(5)从结果集中得到数据库中定义的所有的字段。${result.columnnames}得到的结果是一个字符串数组,因此需要使用
(6)从结果集中得到所有的值。首先要遍历每一行,然后遍历每一行中的元素,因此需要循环嵌套。代码如下:
提示:在代码解析中省略了html元素表格等标签的元素,本示例适用于任何数据库表,只要把数据库的URL、使用的JDBC进行相应的配置和操作的数据表名进行相应的修改即可看到结果。
程序运行结果如图9.23所示。
图9.23 查询操作结果图
2.
【语法1】:SQL语句放在标签属性中。
[dateSource=”dateSource”]/> 【语法2】:SQL语句放在标签体内。 [dateSource=”dateSource”] > SQL语句 【参数说明】:见表9-18。 表9-18 参数名 说明 EL 类型 必须 默认值 sql 查询数据的SQL语句 是 String 是 无 dataSource 数据源对象 是 String Javax.sql.DataSoutce 否 无 var 指定存储查询结果的变量名 否 String 是 无 scope 指定结果的作用域 否 String 否 page 提示: 使用 【示例代码】:代码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"%>
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs" user="sa" password="" /> 实现数据库表的创建 create table c_user ( id int primary key , name varchar(80), sex varchar(80), ) insert c_uservalues(05,'Linda','女') insert c_uservalues(01,'Rom','男') 影响的记录数为:
【代码解析】:
(1)配置数据源。
(2)使用
(3)向表中插入两行数据。
提示:本示例也没有针对固定的表进行操作,在使用时直接运行即可,如果使用的是其他数据库,需要更改数据源配置和SQL语句部分修改。
程序运行结果如图9.24所示。
图9.24 sqldemo02.jsp运行效果
从图9.24中可以发现,使用
图9.25 SQL表的内容
3.
【语法1】:
【语法2】:
Value
【参数说明】:
value的作用为SQL中的参数赋值。
【使用示例】:
select * from personwhere 序号=?
4.
【语法】:
【参数说明】:
q value属性:java.util.Date类型的参数。
q type属性:指定填充日期的类型timestamp(全部日期和时间)、time(填充的参数为时间)、date(填充的参数为日期)。
5.
【语法】:
[isolation=”read_committed|read_uncommitted|repeatable|serializable”] > 9.5 XML标签库 JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用Dom和SAX标签库的繁琐,能轻松的读取xml文件的内容。 9.5.1 XML核心标签库 1. 【语法1】: {var=”name”[scope=”page|request|session|application”]|varDom=”name”[scope=”page|request|session|application”]} systemId=”systemId” filter=”filter” /> 【语法2】: {var=”name”[scope=”page|request|session|application”]|varDom=”name”[scope=”page|request|session|application”]} systemId=”systemId” filter=”filter” > xmlDocument 【参数说明】:见表9-20。 表9-20 属性名 说明 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文件的路径,而是同 例如:如果解析person.xml文件需要通过如下代码实现对xml文件的解析。 2. 【语法】: 【参数说明】:见表9-21。 表9-21 属性名 说明 EL 类型 必须 默认值 select 指定使用的XPath语句 否 String 是 无 escapeXml 是否转换特殊字符。如<等 否 boolean 是 true 提示:使用XPath语句需要用到xalan.jar支持包,可以从示例程序的lib中获取,获得直接从myEclipse中可以找到。 【示例代码】: 3. 【语法】: 【参数说明】: (1)select通过指定的XPath表达式语句获取节点的值。 (2)var指定用于存储值的变量名。 (3)指定var的JSP属性范围。 9.5.2 XML流程控制 使用xml标签库的流程控制标签可以迭代处理xml文件的内容,流程控制可以分为以下两个方面的内容: (1)条件判断。 (2)循环功能。 1. 【语法1】:未含有本体内容。 【语法2】:含有本体内容。 > 本体内容 语法1只把根据条件表达式得到的结果的存储在JSP范围中,语法2根据 【参数说明】: (1)select用来指定使用的XpathExperssion表达式。 (2)var设定标量名用来存储表达式的结果。 (3)scope指定var存储的JSP属性范围。 2. 同核心标签库的 【语法】: 其中只有 【语法】: 3. 【语法】: [begin=”begin”][end=”end”][step=”step”] > //标签主体 【参数说明】:见表9-22。 表9-22 属性名 说明 EL 类型 必须 默认值 select 指定使用的XPath语句 否 String 是 无 var 用于存储表达式的结果 否 String 否 无 varStatus 用来存放循环到的变量的相关信息 否 String 否 无 begin 循环的起始位置 是 int 否 无 end 循环的终止位置 是 int 否 无 9.5.3 xml的文件转换 1. 使用该标签可以轻松的实现xml到XSLT的转化。 【语法1】: [result=”result”] [var=”name”] [scope=”scopeName”] [xsltSystemId=”xsltsystemid”]/> 【语法2】: [result=”result”] [var=”name”] [scope=”scopeName”] [xsltSystemId=”xsltsystemid”] > 【语法3】: [result=”result”] [var=”name”] [scope=”scopeName”] [xsltSystemId=”xsltsystemid”] > Xml文件内容 【参数说明】:见表9-23。 表9-23 属性名 说明 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. 该标签用来为 【语法1】: 【语法2】: > Value 【参数说明】: (1)name指定参数的名称。 (2)value指定参数值。 窗体底端