Struts
中的本地化
Struts自己封装了 实现国际化的一套方法,虽然这部分内容不是Struts的核心内容,但是对于构建多语言支持的web应用在将来是应该非常热门的课题,熟悉了解Struts的本地化,对熟悉Struts,掌握国际化应用是非常有益处的,废话不多说,将自己对Struts中本地化的一些理解写在下面,供自己以后参考,也希望对朋友们有所帮助enjoying~^_^
Locale
对象
可以通过Locate的构造方法来创建Locale对象,如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
而对于Web应用程序,通常不必创建自己的Locale实例,因为Web容器会负责创建所需要的Locale实例。在应用程序中可以调用
httpServletRequest对象的以下两个方法,来取得包含Web客户的Locale信息的Locale实例:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在处理每一个用户请求时,RequestProcessor类都会调用它的processLocale()方法把Locale对象存储在session范围,不过需要满足两个条件:
1. Struts配置文件的<controller>元素的locale属性为true
2. 在session范围内的Locale对象还不存在
processLoale()方法把Locale对象存储在session范围中时,属性key为Globals.LOCALE_KEY,这个常量的字符串值为“org,apache.struts.action.LOCALE”
Struts中用RequestUtils.getUserLocale(request,null)方法来获取Locale信息。该方法返回一个Locale对象,该方法一般被封装在Action基类中的getLocale()方法中,在Web其他应用程序的其他地方也可以直接调用RequestUtils类的getUserLocale()方法来获得Locale对象。
说了很多Locale的知识,再来看看实现国际化另一个重要的类:
ResourceBundle
java.util.ResourceBundle类提供存放和管理与Locale相关的资源的功能。Struts框架没有直接使用Java提供的ResourceBundle,Struts框架自己提供了两个类:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
如何在Struts
配置文件中对应用需要用到的Resource Bundle
进行配置呢?
Struts配置文件中的每个<message-resources>元素定义了一个Resource Bundle。当应用中包含多个Resource Bundle时,它们通过<message-resource>元素的key属性来区分。例如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
通过编程来访问Resource Bundle
在Action基类中定义了getResources(request)方法,他可以返回默认的Message Resource对象,代表当前应用模块使用的默认Resource Bundle。如果要获得特定的MessageResource对象,可以调用Action基类的getResources(request,key)方法,其中参数key和Struts配置文件的<message-resources>元素的key属性对应。得到MessageResources对象后,就可以通过它得方法来访问消息文本,例如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
Org.apache.struts.util.MessageResources的getMessage()方法有好几种重载形式,下面列出常用的几种:
根据参数指定的Locale检索对应的自愿文件,然后返回和参数key对应的消息文本
getMessage(java.util.Locale locale,java.lang.String key);
根据参数指定的Locale检索对应的资源文件,然后返回和参数key对应的消息文本,args参数用于替换复合消息文本中参数
getMessage(java.util.Locale locale,java.lang.String key,java.lang.Object[]args)
根据默认的Locale检索对应的资源文件,然后返回和参数key对应的消息文本
getMessage(String key);
Struts框架中的许多内在组件和Resource Bundle是绑定在一起的。如:
ActionMessage类和<html:errors>标签(new ActionMessage(“YOUR_RESOURCE_KEY”))
Struts Bean标签库的<bean:message>标签(<bean:message key=”YOUR_RESOURCE_KEY”/>)
在Validator验证框架中访问Resource Bundle.
在声明异常处理中访问Resource Bundle。
对一个具体应用实施国际化的步骤:
1. 设置字符编码
为了保证同一个JSP页面能支持多种语言,可以将所有JSP页面的字符编码同一设为”UTF-8”
<%@page contentType=”text/html”;charset=”UTF-8’ language=”java”%>
2. 对文本国际化
在JSP中不应该直接包含本地化的消息文本,而应该通过<bean:message>标签从Resource Bundle中获取文本。如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
3. 对按钮国际化
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
小技巧:
要生成按GB2312编码的中文资源文件,可以先写一个临时的资源文件,里面用中文写好信息,然后用JDK提供了native2ascii命令,来对怎个文件实现字符编码转换,如:
DOS下:
native2ascii –encoding gb2312 application_temp.properties application_zh_CN.properties
执行以上命令后,将生成用gb2312编码代替你的中文字符后的application_zh_CN.properties文件。当Web客户的Locale为中文时,Struts框架将自动选择来自application_zh_CN.properties文件的消息文本