9.3 国际化处理标签

【《JSP网络编程从基础到实践》第9章JSTL应用开发,JSTL(JSP Standard Tag Library,JSP标准标签库)专为Web开发定制,可用于页面中代码的基本输入/输出、流程控制、XML文件处理及SQL处理等,本章中将对这些内容进行介绍。本节为大家介绍国际化处理标签。】

 

9.3  国际化处理标签

JSTL的国际化格式标签能让数据适应不同的国家、语言、文化要求,分为国际化类、消息类、数字日期格式化类3种24个,如下所示。

(1)国际化类:

(2)消息类:

(3)数字日期格式化类:

要使用国际化格式标签库必须在JSP文件首部加入如下语句:

  1. <%@ taglib prefix="fmt" uri="http://
    java.sun.com/jsp/jstl/fmt"
     %> 

9.3.1  国际化类处理标签

1.

标签用于设置用户的语言与国家(或地区),仅对标签生效。标签的使用语法如下。

  1. "语言与国家(或地区)" [variant="浏览器类型"]  
  2.     [scope= "{page|request|session|application}" ]/> 

标签的属性说明详见表9-12。

表9-12  标签的属性

数据类型

是否必选项

默认值

属性值的说明

value

Stringjava.util.Locale

用户的语言与国家

(或地区)设置

variant

String

浏览器类型设置

scope

String

page

用户的语言与国家

(或地区)设置的有效范围

其中,属性value设置的是语言与国家(或地区)代码,可以是语言代码,如:zh、ch;也可在其后再加上两位国家(或地区)代码,中间用"-"或"_"连接起来,如:zh_TW,即为中文(中国台湾地区)。属性variant用于设置浏览器的类型,如:WIN代表Windows、Mac代表Macintonish。属性scope设置国家(或地区)的有效范围,默认为page。如果属性value中的值为null或empty,将使用Web容器默认的语言与国家(或地区)代码设置。

常用的语言与国家(或地区)代码如表9-13所示。

表9-13  常用的语言与国家(或地区)代码

语言及国家(或地区)代码

语言及国家(或地区)名称

en

英文

zh_CN

中文

fr

法语

de

德语

ja

日语

2.

标签用于设置请求中数据的字符集,使用标签的语法如下:

  1. "字符集名称"/> 

其中,参数charsetName是要设置的字符集名称。这在中文处理时特别有用,程序中将不必再为request请求发过来的每个参数作字符编码转换,只需如下的语句:

  1. "gb2312"/> 

9.3.2  消息类处理标签

1.

标签用于绑定消息资源。标签的使用语法如下:

  1. "资源文件名" [prefix="消息前缀"]>  
  2. 处理消息的语句或其他程序语句      
  3.  

这个标签根据属性basename指定的资源文件名去查找.properties文件,并作绑定处理。Web容器将处理标签的body中的语句并作输出,标签本身并不处理body中的语句。prefix指出在body中可能要作处理的消息的前缀。如果属性basename的值为null或empty,或要绑定的资源文件找不到,将装载一个为null的资源绑定。

在.properties文件中如果有中文,读取时将会显示乱码,要解决这个问题,就必须对.properties文件作编码转换。在JDK中提供了转换的工具--native2ascii.exe,此工具位于JDK安装目录的bin目录中。查看系统变量path中是否设置了JDK安装目录的bin目录,如果没有则将其添加上。或在使用native2ascii.exe工具前执行如下命令:

  1. set path=%path%;%JAVA_HOME%/bin; 

执行这个命令要与使用native2ascii.exe工具的命令在同一个命令会话(即打开的同一个command窗口)中。

用native2ascii.exe工具执行如下命令:

native2ascii -encoding gb2312 源.properties文件名 目标.properties文件名

如要把当前目录下的dbconn.properties文件进行转码,转码后的文件名为dbconn_ zh.properties,其命令为:

  1. native2ascii -encoding gb2312 
    dbconn.properties dbconn_zh.properties 

2.

标签用于从指定的资源文件中把指定的键值取出来。标签的使用语法如下。

第1种:不带body时

  1. "消息的键名" [bundle="绑定的资源文件名"]  
  2.     [var= "变量名" ] [scope= "{page|request|session|application}" ]/> 

第2种:带特定的消息参数body时

  1. "消息的键名" [bundle="绑定的资源文件名"]  
  2.     [var= "变量名" ] [scope= "{page|request|session|application}" ]>  
  3.     [标签语句]  
  4.  

标签的属性说明详见表9-14。

表9-14  标签的属性

        

数据类型

是否必选项

默认值

属性值的说明

key

String

要在资源文件中

查找的消息键名称

bundle

LocalizationContext

要查找的键所在的

要被绑定的资源或变量

var

String

存放查找出的

消息的变量

scope

String

page

属性var指定的

变量的有效范围

如果属性scope被指定了则属性var必须被指定。如果设置了属性var的值,则使用此标签时不会在JSP页面中显示键值,需要用标签输出。

如果key的值为null或empty,则会当作消息在资源文件中找不到的情况来处理,会在浏览器中显示"??????";如果key中指定的键值在资源文件中找不到,会显示"???key名称???"。

标签需要与标签配合使用,用于设定标签指向键的动态值。

资源文件键值中动态参数的编号从0开始。

3.

标签用于创建一个资源绑定,并把这种绑定存放到一个变量中。标签的使用语法如下。

  1. "资源文件名" [var="变量名称"]  
  2.      [scope= "{page|request|session|application}" ]/> 

标签的属性说明详见表9-15。

表9-15  标签的属性

数据类型

是否必选项

默认值

属性值的说明

basename

String

绑定的资源文件名

var

String

代表绑定的资源的

变量名称

scope

String

page

属性var中指定的

变量的有效范围

如果属性basename的值为null或empty,或要绑定的资源文件找不到,将装载一个为null的资源绑定。

标签与标签是有所区别的,前者把资源绑定的关系存放在变量中,这样就可以在标签之外的其他处使用绑定的资源;后者使用绑定的资源必须是在标签体内。

9.3.3  数字日期格式化类处理标签(1)

1.

标签用于对数字、货币、百分比数据作格式化处理。使用标签的语法如下。

第1种:不带body

  1. "数值" [type="
    {number|currency|percent}"
    ]  
  2.      [pattern= "格式定制模式"
    [currencyCode=
    "货币代码" ]  
  3.      [currencySymbol= "货币符号"
    [groupingUsed=
    "{true|false}" ]  
  4.      [maxIntegerDigits= "最多的整数位数"
    [minIntegerDigits=
    "最少的整数位数" ]  
  5.      [maxFractionDigits= "最多的小数位数" ]
    [minFractionDigits=
    "最少的小数位数" ]  
  6.      [var= "变量名" ] [scope= "{page|request
    |session|application}"
    ]/> 

第2种:带有body

  1. "{number|currency
    |percent}"
    ] [pattern="格式定制模式"]  
  2.      [currencyCode= "货币代码" ] [currencySymbol= "货币符号" ]  
  3.      [groupingUsed= "{true|false}"
    [maxIntegerDigits=
    "最多的整数位数" ]  
  4.      [minIntegerDigits= "最少的整数位数"
    [maxFractionDigits=
    "最多的小数位数" ]  
  5.      [minFractionDigits= "最少的小数位数" ] [var= "变量名" ]  
  6.      [scope= "{page|request|session|application}" ]>  
  7.      要被格式化处理的数字  
  8.  

标签的属性说明详见表9-16。

表9-16  标签的属性

数据类型

是否必选项

默认值

属性值的说明

value

String或数字

要被格式化的数值

type

String

number

指定被格式化的数

值的数据类型,

只能是numbercurrency

percent中的一种

pattern

String

定制的格式模式

currencyCode

String

ISO 4217标准中的货币代码,

仅当格式化货币数

据类型时有效

currencySymbol

String

货币符号,如¥;仅当格

式化货币数据类型时有效

groupingUsed

boolean

true

是否输出分隔符,

如:1,234,567

maxIntegerDigits

int

整数部分最多的整数位数

minIntegerDigits

int

整数部分最少的整数位数

maxFractionDigits

int

小数部分最多的小数位数

minIntegerDigits

int

小数部分最少的小数位数

var

String

存储格式化处理输出的

结果字符串的变量

scope

Strng

page

属性var中指定的变

量的有效范围

如果属性scope被指定了,则属性var也必须被指定。属性currencyCode中设置的值必须是ISO 4217标准中规定的有效代码。如果属性value中的值为null或empty,则不会作输出处理,即便是指定了var属性也会从scope属性指定的范围中把这个变量删除。如果格式化处理失败,则会将要格式化处理的数值转化为字符串输出。指定了属性var则不会作输出处理,只是把格式化的结果存入属性var指定的变量中。

如果处理的数据类型是percent,即百分比,则数值会被乘以100,再根据本地化设置来作输出处理,数值为".24"表示"24%",数值为"24"表示"2400%"。如下面的语句:

  1. "percent" value="24"/> 

在美国区域设置下,输出为"2,400%",但在法国区域设置下,输出为"2400%"。

货币数据有两个重要的特性:

(1)有货币符号,如美元为"$",人民币为"¥",法郎为"F"。

(2)小数点后的位数有特定的标准,如人民币和美元是小数点后2位,但意大利里拉是不能带小数的。

如下面的语句:

  1. "currency" value="78.74901"/> 

对于人民币输出为"¥78.75",对于意大利里拉输出为"L.79"。

一般情况下,使用系统默认的货币代码即可,如果需要设置特定的贷币代码,就要设置属性currencyCode的值,如:"USD"表示美圆。常用的货币代码见表9-17所示。

表9-17  常用的货币代码

货币代码

货币

CNY

人民币元

EUR

欧元

GBP

英镑

JPY

日圆

USD

美圆

需要更多的货币代码,可参见如下的网址:

  1. http://www.bsi-global.com/iso4217currency 

属性groupingUsed指出格式化数据时,是否加入分隔符,默认情况下是加入的。如下的语句:

  1. "500000.01" groupingUsed="true" /> 

在英国区域设置下,输出为"500,000.01"。但如下的语句:

  1. fmt:formatNumber value="500000.01" groupingUsed="true" /> 

在英国区域设置下,输出为"500000.01"。

maxIntegerDigits、minIntegerDigits、maxFractionDigits、minFractionDigits这4个属性用于设置数字位数。

如果整数部分位数少于minIntegerDigits,将在左边补0;如果多于maxIntegerDigits,将会截去前面多的位数。如果小数部分位数小于minFractionDigits,将在右边补0;如果多于maxFractionDigits,则会作四舍五入处理。

如数字"99.2",根据上述4个属性设置格式化之后的结果见表9-18所示。

表9-18  数字位数控制情况示例

minInteger

Digits

maxInteger

Digits

minFraction

Digits

maxFraction

Digits

 

 

2

 

99.20

 

 

3

 

99.200

 

 

4

 

99.2000

 

 

 

99

 

 

 

1

99.2

 

 

 

2

99.2

 

 

 

3

99.2

4

 

4

 

0099.2000

 

1

 

1

9.2

2

4

2

4

99.20

属性pattern可用于设置数值的显示风格,在针对大的数字需要作科学计数法处理时特别有用。如"# # #.# #E0"。有如下的语句:

  1. "203787490020343266877275964040" 
  2.     pattern= "###.###E0"  /> 

输出为:"203.787E27"。

9.3.3  数字日期格式化类处理标签(2)

2.fmt:formatDate>

标签用于格式化处理日期或时间数据。使用标签的语法如下:

  1. "日期或时间" [type="{time|date|both}"]  
  2.      [dateStyle= "{default|short|medium|long|full}" ]  
  3.      [timeStyle= "{default|short|medium|long|full}" ]  
  4.      [pattern= "定制的格式模式" ] [timeZone= "时区设置" ]  
  5.      [var= "变量名" ] [scope= "{page|request
    |session|application}"
    ]/> 

标签的属性说明详见表9-19。

表9-19  标签的属性

数据类型

是否必选项

默认值

属性值的说明

value

java.util.Date 

要被格式化处理的

日期或时间数据

type

String

数据类型,为time

(时间)、date(日期)

both(日期

与时间的组合)

dateStyle

String

default

格式化日期的风格

timeStyle

String

default

格式化时间的风格

pattern

String

定制数据的格式模式

timeZone

Strin java.util.

TimeZone

数据格式的时区设置

var

String

存放格式化后的

结果的字符串

scope

String

page

属性var中指定的

变量的有效范围

如果属性scope被指定了,则属性var也必须被指定。如果属性value中的值为null或empty,则不会作输出处理,即便是指定了var属性也会从scope属性指定的范围中把这个变量删除。

对于不同的时区,采用不同的timeStyle和dateStyle属性设置,格式化后结果可能并不相同。如时间"2007年6月20日 早上7:51:30",时区为英国,情形如表9-20所示。

表9-20  不同的属性timeStyle和dateStyle设置对格式化的影响

属性值

日期格式化后的结果

时间格式化后的结果

default

Jun 20, 2007

7:51:30 AM

short

6/20/07

7:51 AM

medium

Jun 20, 2007

7:51:30 AM

long

June 20, 2007

7:51:30 AM EDT

full

Monday, June 20, 2007

7:51:30 AM EDT

(1)SHORT完全为数字,如12.13.52 或3:30pm。

(2)MEDIUM较长,如Jan 12, 1952。

(3)LONG更长,如January 12, 1952 或3:30:32pm。

(4)FULL是完全指定,如Tuesday, April 12, 1952 AD或3:30:42pm PST。

属性pattern定制的格式样式可以用来对显示的数据格式作详细的指定。字母"y"表示年,字母"M"表示月,字母"d"表示日,字母"E"表示星期,字母"H"或"h"表示小时(大写表示军用,小写表示民用),字母"m"表示月,字母"s"表示"秒",字母"z"表示时区。可以用这些字母进行组合,不同的字母个数或不同的组合,表示的含义也会有所不同。如"MMMM"和"MM"两者的含义是不同的。各种字母代表的含义见表9-21所示。

表9-21  日期与时间模式分解

模式字符串

yy

两位数字表示的年份

07

yyyy

四位数字表示的年份

2007

M

月份

6

MM

两位数字表示的月份,

不足两位在左边补

06

MMM

月份名称的缩写

Apr

MMMM

完整的月份名称

April

d

某月中的具体日期

5

dd

某月中的具体日期,

不足两位在左边补

05

EE

星期几名称的缩写

Fri

EEEE

完整的星期几的名称

Friday

H

军事使用的小时

21

HH

军事使用的两位数字表示的小时,

不足两位在左边补

21

h

小时

9

hh

两位数字表示的小时,

不足两位在左边补

09

m

分钟

32

mm

两位数字表示的分钟,

不足两位在左边补

32

s

秒钟

6

ss

两位数字表示的秒钟,

不足两位在左边补

06

S

毫秒

251

a

AM(上午)或PM(下午)

PM

zz

缩写表示的时区

EST

zzzz

完整的时区名称

Eastern Standard Time

9.3.3  数字日期格式化类处理标签(3)

3.

标签用于解析被格式化处理的表示数字、货币或百分比数据的字符串。使用标签的语法如下。

第1种:没有body


                   
"被解析的字符串" [type="{number|currency|percent}"]        [pattern="定制的格式模式"] [parseLocale="区域设置"]        [integerOnly="{true|false}"] [var="变量名"]        [scope="{page|request|session|application}"]/> 

第2种:带有body


                   
"{number|currency|percent}"] [pattern="定制的格式模式"]        [parseLocale="区域设置"] [integerOnly="{true|false}"]        [var="变量名"] [scope="{page|request|session|application}"]>       被解析的字符串    

标签的属性说明详见表9-22。

表9-22  标签的属性

数据类型

是否必选项

默认值

属性值的说明

value

String 

要被解析的字符串

type

String

number

被解析的字符串

所代表的数值数据类型

pattern

String

被解析的字符串所

使用的定制的格式模式

parseLocale

String

Java.util.Locale

被解析的字符串格式

所使用的区域设置

integerOnly

boolean

false

是否放弃小数部分数据

var

String

存放解析结果的变量

scope

String

page

属性var中指定的变

量的有效范围

如果属性scope被指定了,则属性var也必须被指定。指定了属性var则不会作输出处理,只是把解析的结果存入属性var指定的变量中。如果被解析的字符串的值为null或empty,则不会作输出处理,即便是指定了var属性也会从scope属性指定的范围中把这个变量删除。

4.

标签用于解析表示日期与时间数据的字符串。使用标签的语法如下。

第1种:不带body


                   
"被解析的字符串" [type="{time|date|both}"]        [dateStyle="{default|short|medium|long|full}"]        [timeStyle="{default|short|medium|long|full}"]        [pattern="定制的格式模式"] [timeZone="时区设置"]        [parseLocale="区域设置"] [var="变量名"]        [scope="{page|request|session|application}"]/> 

第2种:带有body


                   
"{time|date|both}"] [dateStyle="{default|short|medium|long|full}"]        [timeStyle="{default|short|medium|long|full}"]        [pattern="定制的格式模式"] [timeZone="时区设置"]        [parseLocale="区域设置"] [var="变量名"]        [scope="{page|request|session|application}"]>       被解析的字符串    

标签的属性说明详见表9-23。

如果属性scope被指定了,则属性var也必须被指定。指定了属性var则不会作输出处理,只是把解析的结果存入属性var指定的变量中。如果被解析的字符串的值为null或empty,则不会作输出处理,即便是指定了var属性也会从scope属性指定的范围中把这个变量删除。

表9-23  标签的属性

数据类型

是否必选项

默认值

属性值的说明

value

String 

被解析的字符串

dateStyle

String

default

被格式化日期的风格

timeStyle

String

default

被格式化时间的风格

pattern

String

被定制的格式模式

timeZone

Strin java.

util.TimeZone

据格式的时区设置

续表

数据类型

是否必选项

默认值

属性值的说明

parseLocale

String Java.

util.Locale

被解析的字符串格式

所使用的区域设置

var

String

存放解析结果的

变量,数据类型为

java..util.Date

scope

String

page

属性var中指定的变

量的有效范围

9.3.3  数字日期格式化类处理标签(4)

5.

标签用于设定时区或将设定的时区存储到一个变量中,变量的类型为java.util.TimeZone。使用标签的语法如下:


                      
"时区" [var="变量名"]        [scope="{page|request|session|application}"]/> 

标签的属性说明详见表9-24。

表9-24  标签的属性

数据类型

是否必选项

默认值

属性值的说明

value

String  java.util.
TimeZone

时区设置

var

String

保存时区的变量

,变量的类型为

java.util.TimeZone

scope

String

page

属性var中指定的

变量的有效范围

如果value属性中的值为null或empty,则时区设置为GMT(格林威治标准时间)。

6.

标签用于设定时区。使用标签的语法如下:


                      
"时区">       body内容(标签语句、Java程序、HTML代码等)    

标签本身并不处理body内容。属性value的数据类型为String或java.util.TimeZone对象。如果value属性中的值为null或empty,则时区设置为GMT(格林威治标准时间)。

标签与标签的区别是:前者仅在标签嵌套的范围内有效;后者如果不是将时区存储在变量中,则会在标签之后的语句scope属性设定的范围内有效,如果是将时区存储在变量中则不会改变其他程序的时区设置。

【实例9-4】使用数字与日期格式处理标签


                      
useFormatJSTL.jsp   <%@ page language="java" contentType="text/html; charset=gb2312"%>   <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>           使用国际化处理标签       ------------fmt:formatNumber使用示例----------------
 
输出数字数据:
    
"500000.01" groupingUsed="true" />   "52577" pattern="###.###E0" />   "52577" minFractionDigits="4" />   "52577" minIntegerDigits="4" />   "52577" minIntegerDigits="1" minFractionDigits="1"/>  
输出货币数据:
    
"currency" value="78.74901"/>   "currency"  value="78.74901" currencyCode="JPY"/>   "currency"  value="78.74901" currencyCode="CNY"/>
 
--------------fmt:formatDate使用示例--------------------
 
 "tempDate" class="java.util.Date"/>    "${tempDate}" type="date"/>
 
 "${tempDate}" type="time"/>
 
 "${tempDate}" type="both"/>
 
 "${tempDate}"      pattern="yyyy'-'MM'-'dd hh':'mm':'ss"/>
 
 "${tempDate}"      pattern="yyyy'年'M'月'd'日'h'时'm'分's'秒'S'毫秒' a zzzz"/>      

程序运行的结果如图9-4所示。

9.3 国际化处理标签_第1张图片 
(点击查看大图)图9-4  使用数字与日期格式处理标签

来分析程序中最难的一句:


                      
"${tempDate}"      pattern="yyyy'年'M'月'd'日'h'时'm'分's'秒'S'毫秒' a zzzz"/> 
要在输出的时间表示中加入字符,以符合中国人的表示习惯,加入的字符要用两个"'"括起来;随后的"a"表示根据时间来输出是上午还是下午;"zzzz"表示输出所在的时区。

9.4  SQL标签

SQL标签使用方便,开发迅速,编写出来的代码可读性良好,但也有许多开发人员反对使用SQL标签,其根本原因是认为使用SQL标签破坏了软件的体系架构,比如MVC架构中,将M(Model,模型)中的功能也放在V(View)中直接实现了;其他就是安全性不够好,如果一个JSP页面出错或被攻击者得到源代码,则可能连接数据库的用户名和密码、操作数据的SQL语句都将暴露开来。但是SQL标签在一些应用开发的场合仍是有较大的使用价值,比如要快速开发一个系统的原型、要开发一个小型的管理信息系统等。

SQL标签主要有6个:标签、标签、标签、标签、标签、标签,用于设置数据源,做数据查询操作(select),做数据更新操作(update、insert、delete),以及做事务处理。要使用SQL标签需要在JSP文件首部加入如下语句:


                         
<%@ taglib prefix="sql" uri="http:// java.sun.com/jsp/jstl/sql" %> 

9.4.1  设置数据源

可以使用标签来设置一个数据源。使用标签的语法如下:


                            
"数据源" |url="JDBC连接URL"       [driver="驱动程序类名"]  [user="连接数据库时使用的用户名"]        [password="连接数据库的用户的密码"]}  [var="变量名"]        [scope="{page|request|session|application}"]/> 

如果属性dataSource的值为null,将抛出一个JspException异常。属性dataSource的值可以是一个已定义好的dataSource对象、JNDI路径、JDBC连接参数字符串,也可以通过4个属性url、driver、user、password的配合来连接数据库。标签的属性说明详见表9-25。

表9-25  标签的属性

数据类型

是否必选项

默认值

属性值的说明

dataSource

Stringjavax.

sql.DataSource

数据源

url

String

连接数据库的URL

driver

String

连接数据库的

驱动程序类名

user

String

连接数据库时

使用的用户名

password

String

连接数据库时

使用的用户密码

var

String

代表数据源的变量名

scope

String

var属性指定的变

量的有效范围

属性dataSource的设置推荐使用JNDI路径,因为这样就不必在每个JSP页面都出现连接数据库的参数了,如果连接参数有变化只要修改相关的配置文件就可以了,而不必修改每个JSP页面中的程序。

9.4.2  查询数据

标签用于查询数据库中的数据,这就相当于执行select查询SQL语句。使用标签的语法如下。

第1种:不带body


                               
"SQL查询语句"            var="变量名" [scope="{page|request|session|application}"]        [dataSource="数据源"] [maxRows="返回的记录集最大行数"]        [startRow="返回的记录集的起始位置"]/> 

第2种:带有指定查询参数的body


                               
" SQL查询语句"       var="变量名" [scope="{page|request|session|application}"]        [dataSource="数据源"] [maxRows="返回的记录集最大行数"]        [startRow="返回的记录集的起始位置">         标签语句    

第3种:带有指定查询和查询参数选项的body


                               
"变量名" [scope="{page |request|session|application}"]        [dataSource="数据源"] [maxRows="返回的记录集最大行数"]        [startRow="返回的记录集的起始位置">       SQL查询语句        标签语句    

第1种语法最简单,第2种和第3种语法就像是使用了JDBC中的PreparedStatement对象。标签的属性说明详见表9-26。

表9-26  标签的属性

数据类型

是否必选项

默认值

属性值的说明

sql

String

查询数据的SQL语句

dataSource

String
jav
ax.sql.DataSource

数据源,可以是一个已定义好的

dataSource对象、JNDI路径、

JDBC连接参数字符串

maxRows

int

返回查询结果记录集的最大行数

startRow

int

返回查询结果记录集的起始位置

var

String

保存查询结果的对象,数据类型为

javax.servlet.jsp.jstl.sql.Result

scope

String

page

var属性指定变量的有效范围

属性maxRows如果没有被设置或设置为"-1",则表示对最大行数不作限制;startRow是指返回的记录集在SQL查询结果中的起始位置,首行的位置为"0",如果没有指定此属性的值,则默认为"0"。从SQL查询结果记录集的位置"0"到"startRow-1"的记录将不会被包含到标签查询得到的结果记录集对象中。属性maxRows设置的值必须大于等于-1。

标签从数据库中查询数据将结果数据集放入到var属性指定的变量中。如果找到需要查询的数据,则得到一个结果为empty的javax.servlet.jsp.jstl.sql.Result对象,即记录条数为0。

startRow或maxRows这两个属性在做数据分页处理时特别有用,startRow可用于指定当前页在SQL查询结果中的起始位置,maxRows用于指定页面的尺寸,即当前页面的记录条数。

标签的分页处理并不能从根本上减少网络流量,如果要降低流量,应当想办法构造出仅查询当前页数据的SQL语句。

查询数据的SQL语句,如果使用的是第1种语法则在属性sql中设定,如果使用的是第2种语法和第3种语法则在标签的body内容中指定。SQL语句如果是参数语句,即其中含有"?"的语句,这就需要有标签语句来设置其中的"?"参数的值。

标签用于设置数据库操作标签语句中SQL语句中的参数值,嵌套的标签可以是


                               
"参数值"/> 

或:


                               
      参数值    

如果参数值设置为null,则会将SQL语句中相应的"?"参数的值设为"NULL"。

9.4.3  显示查询结果(1)

通过标签可以得到查询的结果记录集,要显示数据就需要用到这个结果记录集的一些属性,主要有如下几个。

(1)rows:返回的是一个java.util.SortedMap对象一维数组,数组中的每一个元素对应查询结果记录集中特定的一行。

(2)rowsByIndex:返回的是一个java.lang.Object二维数组,第一维代表结果记录集中特定的一行。

(3)columnNames:字段名(即列名)String数组。

(4)rowCount:结果记录集中记录的总条数。

(5)limitedByMaxRows:标签中的最多记录条数属性值。

因此可根据结果记录集再结合以上的5个属性,使用标签循环输出结果记录集中的数据。

【实例9-5】运用SQL标签查询数据

为调试本节中的程序,首先在testDatabase数据库中创建一个表:account。执行建表的SQL语句,语句如下:


                                  
--如果已存在account表则删除此表   if exists (select * from dbo.sysobjects where id  = object_id(N'[dbo].[account]') and        OBJECTPROPERTY(id, N'IsUserTable') = 1)   drop table [dbo].[account]   GO   --创建account表   CREATE TABLE [dbo].[account] (       [account_id] [bigint] IDENTITY (11) NOT NULL ,       [account_name] [varchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,       [account_money] [money] NULL ,       [add_time] [datetime] NULL    ) ON [PRIMARY]   GO   --声明add_time字段的默认值为getdate(),account表的主键为account_id   ALTER TABLE [dbo].[account] ADD        CONSTRAINT [DF_account_add_time] DEFAULT  (getdate()) FOR [add_time],       CONSTRAINT [PK_account] PRIMARY KEY  CLUSTERED        (           [account_id]       )  ON [PRIMARY]    GO 

account_id字段表示账户ID号,即账号,并设置为bigint类型,数据自动增量,步长值为1,设为主键,以唯一标识账户;account_name字段表示账户名,即客户的名称;account_money字段表示账户的余额;add_time字段表示账户创建的时间,默认值为getdate(),即创建记录时的时间。

实际工程中,银行的账户表设计会更复杂一些,比如账号的生成规则、账户表的信息字段数等,而且很少有银行采用SQL Server数据库,大多采用Unix系统下的数据库数据,但学习JSP编程并不必太多关心数据库的品种,不同的数据库品种使用的数据库驱动程序不同,操作数据库时使用的SQL语句也会稍有差异,因此读者在编程时应尽量使用标准SQL语句以方便程序的移植。

建表成功后,随机输入一些数据,以方便调试程序,最好能输入10行以上的数据,以方便调试本章后续的分页数据处理等程序实例。输入数据的方法可以在企业管理器中打开表直接输入数据,也可以在查询分析器中执行insert SQL语句,但编写SQL语句时应注意到account_id、add_time字段的值可以自动生成,不必给出值,如:


                                  
insert into account(account_name, account_money) values('邓佳容',1000.00)   viewData.jsp   <%@ page language="java" contentType="text/html; charset=gb2312"%>   <%@ taglib prefix="c" uri="http:// java.sun.com/jsp/jstl/core" %>   <%@ taglib prefix="fmt" uri="http:// java.sun.com/jsp/jstl/fmt" %>   <%@ taglib prefix="sql" uri="http:// java.sun.com/jsp/jstl/sql" %>           使用SQL标签       ----------sql:query标签与sql:param标签 应用示例-----------
 

使用JNDI方式建立数据源:


                                  
    url="jdbc:microsoft:sqlserver\\dengziyun: //localhost:1433;DatabaseName=testDatabase"      driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"      user="sa" password="123" var="sqlDS"/>   if test="${sqlDS==null}">       建立数据源失败!   if>   if test="${sqlDS!=null}">       建立数据源成功!   if>       sql="select top 5 * from account"        var="accountsRS" dataSource="${sqlDS}"/>   共查询出"${accountsRS.rowCount}"/>条记录
 

输出查询结果(使用rows输出):  
"1" cellpadding="0" cellspacing="0">                  "${accountsRS.columnNames}" var="cucN">               "${cucN}"/>                         "${accountsRS.rows}" var="cuRe">                      "${cuRe}" var=" cuValue" varStatus= "currentVarStaus">       "${cuRe[accountsRS. columnNames[currentVarStaus.index]]}"/>                                 
输出查询结果(使用rowsByIndex输出):  
"1" cellpadding="0" cellspacing="0">                  "${accountsRS.columnNames}" var="cucN">               "${cucN}"/>                         "${accountsRS.rowsByIndex}" var="cuRe">                      "${cuRe}" var="cuValue">               "${cuValue}"/>                                     

9.4.3  显示查询结果(2)

程序的运行结果如图9-5所示。

9.3 国际化处理标签_第2张图片 
(点击查看大图)图9-5  查询数据并显示

显示查询结果有两种方法:一种是使用rows记录集,一种是使用rowsByIndex记录集。

(1)使用rows输出查询结果。

rows记录集是一个java.util.SortedMap对象一维数组,数组中的每一个元素对应查询结果记录集中特定的一行。输出java.util.SortedMap对象中的数据时,本例使用了如下的语句:


                                     
"${ accountsRS.rows}" var="cuRe">              "${cuRe}" var="cuValue"  varStatus= "currentVarStaus">       "${cuRe[accountsRS. columnNames[currentVarStaus.index]]}"/>                  

外层的标签遍历的是java.util.SortedMap对象一维数组,内层的标签遍历的是每一个java.util.SortedMap对象中的元素。输出元素时不能使用如下的语句:


                                     
"${cuValue}"/> 

这是因为java.util.SortedMap对象并不能保证其中的元素是有序的,更不能保证顺序与输出列名的顺序相同,因此在输出值时,要多一些约束条件。此处,输出方式为:


                                     
"${cuRe[accountsRS. columnNames[currentVarStaus.index]]}"/> 

currentVarStaus.index表示当前输出的java.util.SortedMap对象中的元素的下标,accountsRS.columnNames[currentVarStaus.index]得到的是对应的结果记录集中的列名,因此,cuRe[accountsRS.columnNames[currentVarStaus.index]]得到的就是与accountsRS.columnNames对象顺序对应起来的值。这样做最根本的思想是考虑到accountsRS.columnNames对象的元素个数与java.util.SortedMap对象的元素个数相同。

可见,内层的标签内输出的并不一定是当前遍历的java.util.SortedMap对象中的元素值,而是java.util.SortedMap对象中与accountsRS.columnNames对象中相对应的元素值。

(2)使用rowsByIndex输出查询结果。

rowsByIndex是一个java.lang.Object二维数组,第一维代表结果记录集中特定的一行,因此输出某条记录的某个字段的值时需要双下标,或使用嵌套的,如下所示:


                                     
"${ accountsRS.rowsByIndex}" var="cuRe">         "${cuRe}" var="cuValue">           "${cuValue}"/>                  
幸好rowsByIndex中元素出现的顺序与columnNames中的顺序是相同的,故不必再作元素定位即可以直接输出。
 
 

转载于:https://my.oschina.net/willSoft/blog/32648

你可能感兴趣的:(9.3 国际化处理标签)