1、12.1 JDK核心包中对国际化支持Java程序的国际化主要通过如下三个类完成。程序的国际化主要通过如下三个类完成。java.util.Locale Locale类:对应一个特定的国家区域及语言环境。用于表征语言和地类:对应一个特定的国家区域及语言环境。用于表征语言和地区,为其他类提供包含用户本地化的信息,如语言和国家。区,为其他类提供包含用户本地化的信息,如语言和国家。Locale的命名规则:的命名规则:_.例如:例如:“zh_CN.GB2312”中,中,zh表示中文,表示中文,CN表示中华人民共和国,表示中华人民共和国,GB2312表示使用的字表示使用的字符集为符集为GB2312。java
2、.util.ResourceBundle类:用于加载一个资源包。一个应用系统可以包含多个消息类:用于加载一个资源包。一个应用系统可以包含多个消息资源文件,每个消息资源文件存放和一种资源文件,每个消息资源文件存放和一种Locale相对应的本地化消息文本。这些资源包括文相对应的本地化消息文本。这些资源包括文本域或按钮的本域或按钮的Label、状态信息、图片名、错误信息和网页标题等。、状态信息、图片名、错误信息和网页标题等。例如:指定资源文件名称为例如:指定资源文件名称为message,而指定的,而指定的Locale是是zh_CH,最佳匹配资源文件名称,最佳匹配资源文件名称为为message_zh_
3、CN.properties。如果该资源文件没有找到,系统会查找近似匹配的属性。如果该资源文件没有找到,系统会查找近似匹配的属性文件。文件。java.text.MessageFormat类:用于将消息格式化。可以定义一个模式,允许在运行时类:用于将消息格式化。可以定义一个模式,允许在运行时用指定的参数来替换掉消息字符串中的占位符部分。例如,定义了一个占位符来代替信息可用指定的参数来替换掉消息字符串中的占位符部分。例如,定义了一个占位符来代替信息可变部分,得到模式:变部分,得到模式:Error.requiredfield=the0field is required to savel在运行时在运行时
4、,0占位符被第一个参数替换,占位符被第一个参数替换,1)占位符被第二个参数替换,依此类推。占位符被第二个参数替换,依此类推。12.2 服务端对Locale的解析配置12.2.1使用使用AcceptHeaderLocaleResolver 的配置的配置 AcceptHeaderLocaleResolver 会根据浏览器会根据浏览器Http Header中的中的accept-language域判定,可通过域判定,可通过HttpServletRequest.getLocale()方法获得此域的内容,例如:中文为方法获得此域的内容,例如:中文为“zh_CN”,美国英语为,美国英语为“en_US”。在配
5、置文件中增加如下节点:在配置文件中增加如下节点:Spring就会根据客户端计算机的就会根据客户端计算机的Locale设定决定返回界面所采用的语言设定决定返回界面所采用的语言种类。可通过种类。可通过AcceptHeaderLocaleResolver.resolveLocale()方法获方法获得当前语言设定。得当前语言设定。12.2.2 使用SessionLocaleResolver的配置 12.2.3使用CookieLocaleResolver配置browserLocale mypath 99999912.3 Web页静态显示的国际化处理12.3.1 在应用的配置文件中定义消息源在应用的配置文
6、件中定义消息源 在应用的配置文件中定义消息源,在应用的配置文件中定义消息源,并指定资源文件并指定资源文件基名为基名为“messages”。也就是资源文件的文件名前。也就是资源文件的文件名前缀为缀为“messages”,后面跟语言标识部分。,后面跟语言标识部分。messages 12.3.2建立针对语种的properties文件(1)中文:)中文:messages_zh_CN.properties login_title=用户登录用户登录username_label=用户名用户名password_label=密码密码 button_label=登录登录【注意注意】messages_zh_CN.p
7、roperties文件在部署时候须使用文件在部署时候须使用JDK工具工具native2ascii进行转码,也可利用在线进行转码,也可利用在线native2ascii网站网站(http:/ button_label=u767bu5f55(2)英文:英文:messages_en_US.propertieslogin_title=User loginusername_label=Username password_label=Password button_label=login on12.3.3 使用国际化数据使用使用Spring标签实现动态提示的编程步骤如下:标签实现动态提示的编程步骤如下:(1
8、)将将spring.tld文件拷贝到文件拷贝到/WEB-INF/目录;目录;(2)在在JSP文件中通过文件中通过taglib指令引入指令引入Spring的的表单标签,通过表单标签,通过标记将标记将其中硬编码的提示信息替换为动态其中硬编码的提示信息替换为动态Tag。INPUT type=submit name=log value=更改用户使用的语言环境,可从更改用户使用的语言环境,可从“控制面板控制面板”“区域和语言选项区域和语言选项”,可通过弹出对话框的,可通过弹出对话框的“标准和格式标准和格式”下拉框中选择下拉框中选择“英文(美英文(美国)国)”。(1)在在web.xml文件中要通过文件中要
9、通过ContextLoaderListener监听器装载应用环境。否监听器装载应用环境。否则,执行含则,执行含Spring标签的标签的JSP文件时会显示文件时会显示“找不到找不到Web应用应用”的错误。的错误。contextConfigLocation/WEB-INF/root-context.xmlorg.springframework.web.context.ContextLoaderListener在配置文件在配置文件root-context.xml文件中可安排文件中可安排localeResolver和和messageSource两个两个Bean的配置信息。的配置信息。messages
10、12.4 数据库动态访问的国际化(1)不同国家的数据采用同一库存储不同国家的数据采用同一库存储 如果将不同国家的数据用同一库来存储,采用同如果将不同国家的数据用同一库来存储,采用同一数据库存储的好处是连接数据库的一数据库存储的好处是连接数据库的Bean数据源可相数据源可相同,实现同,实现Bean的共享。在的共享。在SQL语句中要区分不同国家语句中要区分不同国家对应的字段或表格。对应的字段或表格。具体有以下处理方法:具体有以下处理方法:单表多字段方式:在同一个表中,对每个语种对应的单表多字段方式:在同一个表中,对每个语种对应的数据,用相同数据类型,不同名称的字段进行存储。数据,用相同数据类型,不
11、同名称的字段进行存储。分表方式:将国际化和非国际化字段分开,将原始表分表方式:将国际化和非国际化字段分开,将原始表拆分成多个表。拆分成多个表。(2)不同国家的数据分库存储方法方法1:在进行数据库的访问操作中不采用:在进行数据库的访问操作中不采用Bean,而是根据请求创建业务逻辑对象,在业而是根据请求创建业务逻辑对象,在业务逻辑对象中根据不同国家区域连接不同的数务逻辑对象中根据不同国家区域连接不同的数据源。据源。方法方法2:为每个国家的数据访问:为每个国家的数据访问JdbcTemplate创建自己的创建自己的Bean,分配不同的分配不同的标识。标识中可用国家区域的名称作为名称的标识。标识中可用国
12、家区域的名称作为名称的后缀。访问时根据国家区域取得对应的后缀。访问时根据国家区域取得对应的Bean。其它需要使用其它需要使用JdbcTemplate的对象,不再创的对象,不再创建建Bean,而是通过创建对象方式由程序根据,而是通过创建对象方式由程序根据具体国家语言引用不同的具体国家语言引用不同的JdbcTemplate对象。对象。12.5 Spring表单数据校验处理国际化12.5.1 Spring的数据校验接口逻辑的数据校验接口逻辑org.springframework.validation.Validator接口为接口为Spring MVC提供了数据合法性校验提供了数据合法性校验功能,该接
13、口有两个方法,说明如下:功能,该接口有两个方法,说明如下:boolean supports(Class clazz):判断校验:判断校验器是否支持指定的目标对象,每一个校验器负器是否支持指定的目标对象,每一个校验器负责对一个特定类型的模型对象进行检验;责对一个特定类型的模型对象进行检验;void validate(Object target,Errors errors):对:对target对象进行合法性校验,通对象进行合法性校验,通过过Errors返回校验错误的结果。返回校验错误的结果。【程序清单12-2】文件名为ColumnValidator.javapublic class ColumnV
14、alidator implements Validator public boolean supports(Class c)/该校验器支持的目标类该校验器支持的目标类return c.equals(Column.class);public void validate(Object target,Errors errors)Column v=(Column)target;/栏目栏目Column定义见程序清单定义见程序清单4-1 /通过通过Spring提供的校验工具类进行简单的规则校验提供的校验工具类进行简单的规则校验 ValidationUtils.rejectIfEmptyOrWhitespa
15、ce(errors,title,required.title,栏目名必须填写栏目名必须填写);if(v.getTitle().length()2)/对栏目标题长度再检查对栏目标题长度再检查 errors.rejectValue(title,invalid.title,名称太短名称太短);2.在控制器中应用校验程序(1)准备错误显示的资源文件准备错误显示的资源文件错误信息资源放在以错误信息资源放在以errors为前缀的资源文件为前缀的资源文件中,如中,如errors_en_US.properties和和errors_zh_CN.properties的资源文件,从的资源文件,从而实现错误信息显示的
16、国际化。而实现错误信息显示的国际化。在在Spring配置文件中定义配置文件中定义Locale解析器及资解析器及资源文件的前缀源文件的前缀(2)控制器方法中调用错误检查程序RequestMapping(method=RequestMethod.POST)public String onSubmit(ModelAttribute(column)Column mycolumn,BindingResult result,HttpServletRequest request)ColumnValidator v=new ColumnValidator();v.validate(mycolumn,resul
17、t);/进行错误校验,错误填入进行错误校验,错误填入result中中 if (result.hasErrors()return columninsert;/返回视图文件,显示校验错误返回视图文件,显示校验错误 else JdbcColumnDao dao=new JdbcColumnDao();dao.insert(mycolumn.title);/调用业务逻辑插入一条栏目调用业务逻辑插入一条栏目 return redirect:/column/insert;/继续转插入新栏目页面继续转插入新栏目页面 12.5.2 Spring的表单标签与模型的结合 :input type=submit value=/