第六章:struts2国际化

上传人:飞*** 文档编号:4083156 上传时间:2017-08-06 格式:PPT 页数:36 大小:834.50KB
返回 下载 相关 举报
第六章:struts2国际化_第1页
第1页 / 共36页
第六章:struts2国际化_第2页
第2页 / 共36页
第六章:struts2国际化_第3页
第3页 / 共36页
第六章:struts2国际化_第4页
第4页 / 共36页
第六章:struts2国际化_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《第六章:struts2国际化》由会员分享,可在线阅读,更多相关《第六章:struts2国际化(36页珍藏版)》请在金锄头文库上搜索。

1、第六章:Struts 2国际化主讲:刘雷,本章内容,Struts2国际化的实现原理国际化资源文件LocaleResourceBundleI18nInterceptor简单的struts2国际化实现过程的讲解国际化资源文件的优先级手动选择显示语言,国际化Internationalization,国际化Internationalization是使程序在不做任何修改的情况下,就可以在不同的国家或地区和不同的语言环境下,按照当地的语言和格式习惯显示字符。例如,一个数字123456.78,在法国它的书写格式是123 456,78,在德国是123.456,78,而在美国则是123,456.78.国际化又被

2、称为I18N,因为国际化的英文是Internationalization,它以I开头,以N结尾,中间有18个字母。一个国际化的程序,当它运行在本地机器时,需要根据本地机器的语言和地区设置显示相应的字符,这个过程就叫做本地化(Localization),通常简称为:L10N。在JAVA中编写国际化程序主要通过两个类来完成:java.util.Locale类和java.util.ResourceBundle抽象类。Locale类用天提供本地信息,通常称它为语言环境。不同的语言,不同的国家和地区采用不同的Locale对象来表示。ResourceBundle类称为资源包,包含了特定于语言环境的资源对象

3、。当程序需要一个特定于语言环境的资源时(如字符串资源),程序可以从适合当前用户语言环境的资源包中加载它。采用这种方式,可以编写独立于用户语言环境的程序代码,而与特定语言环境相关的信息则通过资源包来提供。,Locale类,Java.util.Locale类的常用构造方法如下:public Locale(String language)public Locale(String language,String country)其中language表示语言,它的取值是由ISO-639定义的小写的、两个字母组成的语言代码。其中country表示国家或地区,它的取值由ISO-639定义的大写的、两个字母组

4、成的代码左表列出了常用的ISO-639语言代码。右表列出了常用的ISO-3166国家和地区代码,举例,例如:应用于中国的Locale为:Locale locale = new Locale(“zh”,”CN”);例如:应用于美国的Locale为:Locale locale = new Locale(“en”,”US”);例如:应用于英国的Locale为:Locale locale = new Locale(“en”,”GB”);,资源包(一),最理想的实现国际化的方法是将要显示的字符内容从程序中分离,然后统一存储到一个资源包中,当显示时,从资源包中取出和平Locale对象相一致的字符内容。在J

5、ava中, 这种资源包是由类来实现的,这个类必须要扩展java.util.ResourceBundle.在编写国际化程序时, 要为不同的国家地区和语言编写不同的资源类,这些资源类同属一个资源系列,共享同一个基名(base name).不同语言所对应的资源类的名称为基名加上ISO-639标准的语言代码,而应用于某个特定国家或地区的资源类的名称,则是在基名和语言代码后加上ISO-3166标准的同家或地区代码。例如:有一个资源包系列的基名是MyResource,那么说中文的所有国家或地区共享的资源属于MyResource_zh类,中国台湾的特定资源则属于MyResource_zh_TW类。一个资源包

6、系列可以有一个默认的资源包, 它的名字就是基名,当请求的资源包不存在时,将使用默认的资源包。要获取某个资源包,可以调用java.util.ResourceBundle类中的静态方法getBundle(),如下:public static final ResourceBundle getBundle(String baseName)根据基名得到资源包,使用系统缺省的Locale对象。public static final ResourceBundle getBundle(String baseName,Locale locale)根据基名和Locale对象得到资源名。,资源包(二),利用getB

7、undle()方法可以得到对应于某个Locale对象的资源包,然后就可以利用ResourceBundle类的getString()方法得到相应语言版本的字符串。public final String getString(String key)从资源包中根据关键字得到字符串。例如:Locale locale = new Locale(“zh”,”CN”);bundle = ResourceBundle. getBundle(“MyResource”,locale);String name = bundle.getString(“name”);利用ResourceBundle类的getObject

8、()方法,还可以从资源包中得到任意的对象。public final Object getObject(String key)从资源包中根据关键字得到对象。,资源包(三),假设Locale为使用中文的中国大陆地区,资源包基名为MyResource , ResourceBundle类的静态方法getBundle(String baseName)按照下列的顺序查找资源包:MyResource_zh_CN.classMyResource_zh_CN.propertiesMyResource_zh.classMyResource_zh.propertiesMyResource.classMyResour

9、ce.properties,消息格式化,在资源文件中的消息文本可以带有参数,例如:greeting=0,欢迎学习struts2.花括号中的数字是一个占位符,可以被动态的数据替换。在消息文本中的占位符可以使用0到9的数字,也就是说,消息文本的参数最多可以有10个。例如:greeting=0,欢迎学习struts2,今天是星期1.要替换消息文本中的占位符,可以使用java.text.MessageFormat类,该类提供了一个静态方法format(),用来格式化带参数的文本,format() 方法定义如下:public static String format(String pattern,Obj

10、ect arguments)示例greeting=0,欢迎学习struts2,今天是 1.我们编写代码:Locale loc = Locale.getDefault();ResourceBundle bundle = ResourceBundle.getBundle(“MyResource”,loc);String greeting = bundle.getString(“greeting”);Object obj = 张三,new java.util.Date();String msg = MessageFormat.format(greeting,obj);消息文本中的数字占位符将按照Me

11、ssageFormat.format()方法参数的顺序(从第二个参数开始)而被替换,在上例中,占位符0被“张三”替换,1被new java.util.Date()所替换。此外format()方法参数的顺序是与占位符的数字顺序对应的,而不是与占位符出现在消息文本中的顺序对应,Struts2资源包的组织和加载方式,Struts2提供了灵活的资源包组织和加载方式,你可以为某个类提供一个资源包,也可以为某一个接口提供一个资源包,还可以为包中所有的类提供一个资源包,不同级别的资源包适用的范围的加载的顺序是不一样的。在查找字符串时,Struts2将按照下面的顺序搜索资源包:1)查找与调用的Action类同

12、名的资源文件(与Action在同一个包中)。例如,Action类名为RegAction,当访问RegAction时,将首先查找RegAction.properties.2)查找所有与Action类的基类同名的资源文件,直到Object.properties.例如,RegAction的基类为ActionSupport,那么将查找ActionSupport.properties,如果没有找到消息字符串,则继续查找ActionSupport基类,直到object.properties.3)查找所有与Action类实现的接口同名的资源文件,例如,RegAction实现了Action, Validate

13、able接口,则依次搜索Action.properties和Validateable.properties.4)如果Action类实现了ModelDriven接口,则struts2会调用getModel()方法获得模型对象,然后以模型对象所属的类进行了类层次的查找,这将从步骤1)开始重复。5)查找类所在的包和父包中的package.properties,直到最顶层包。例如:RegAction在com.ibm.action中,则依次查找action目录、ibm目录、com目录中的package.properties资源文件。6)查找I18N消息key本身的层次关系。例如:某个消息key是user

14、.label.username,如果user是Action类的某个属性,则以该属性所属的类,在它的类层次中去查找key为label.username的消息字符串,这与前面的步骤是一样的。7)查找默认的资源包。,查找资源文件的优先级,你可以在struts.properties或struts.xml文件中,通过struts.custom.i18n.resources属性设置默认的资源包。例如: struts.custom.i18n.resources=com.ibm.action.ApplicationResources这表明ApplicationResources是默认的资源包,它可以在com.

15、ibm.action包中找到。除了上述加载资源包的方式外,我们还可以使用struts2和i18n标签来加载特定的资源包。如果消息字符串没有在i18n标签指定的资源包中找到,则将按照上述的7个步骤进行查找。,在消息文本中使用参数,Struts2提供了两种在消息文本中设置参数的方式。一种是沿袭了Java中设置文本参数的方式,即使用从0到9的占位符。当使用MessageFormat类的format方法格式化消息字符串时,参数被传进来,用来替换消息文本中的占位符。另一种方式是在消息文本中使用OGNL表达式,不同于在标签的属性中使用OGNL表达式,在消息文本中使用的OGNL表达式以“$”开始,并以“”结

16、束,其语法格式为:$expr.例如:当用户登录后, 我们要向用户显示如下的欢迎信息:张三,你好,欢迎你的访问!那么我们可以在资源文件中编写如下的消息文本:Greeting=$username,你好,欢迎你的访问!在登录成功页面中,使用text标签输出资源文件中的消息文本,如下所示:在获取键为greeting的消息文本时,“$“和“”中的表达式username将根据值栈自动进行计算,最终action类的username属性值将被用于替换消息文本中的”$username”.在消息文本中使用数字占位符可以看成是被动地接受值,而使用OGNL表达式则可以看成主动的去获取值。,访问国际化消息,Struts2提供了多种方式来访问资源文件中的本地化消息,以适应不同的应用场景,主要分为在action中访问本地化消息在JSP页面中访问本地化消息在表单标签的属性中访问本地消息在资源文件中访问本地消息。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号