2. 描述

a) Struts的资源国际化,用到了JDK如下类:

o java.text.MessageFormat

o java.util.ResourceBundle

o java.util.PropertyResourceBundle

o java.util.Properties

b)  相关类描述

i. MessageResources

1. 抽象类,已知子类PropertyMessageResources,可自行继承该类进行相关操作,(注意:继承的对象,必须实现 Serializable接口)。通过静态方法getMessageResources(String config)获取MessageResources,config参数为资源文件配置地址。

具体代码如下:



            public synchronized static MessageResources getMessageResources(String config)

            {

        

                 if (defaultFactory == null)

                 {

                     defaultFactory = MessageResourcesFactory.createFactory();

                 }

                return defaultFactory.createResources(config);

}

2. 调用没有Locale的getMessage(String key)方法,获取默认的语言环境消息。

3. 如果传入的key在配置文件当中不存在,将会返回null,同时getReturnNull()方法将会返回true。

ii. MessageResourcesFactory

1. 抽象类,已知子类PropertyMessageResourcesFactory,可自行继承该类进行相关操作,通过静态方法createFactory()返回当前对象的单实例。具体代码入下:

         /**

* Create and return a <code>MessageResourcesFactory</code> instance of the

              * appropriate class, which can be used to create customized

              * <code>MessageResources</code> instances.  If no such factory can be

              * created, return <code>null</code> instead.

             */

             public static MessageResourcesFactory createFactory()

{

                 // Construct a new instance of the specified factory class

                 try

{

                     if (clazz == null)

{

                         clazz = RequestUtils.applicationClass(factoryClass);

                    }

                      MessageResourcesFactory factory =

                     (MessageResourcesFactory) clazz.newInstance();

                     return (factory);

                  }

catch (Throwable t)

       {

                      LOG.error("MessageResourcesFactory.createFactory", t);

                      return (null);

                  }

}

iii. PropertyMessageResourcesFactory

1. 继承自PropertyMessageResourcesFactory实现了createResources(String config)方法,创建了一个PropertyMessageResources对象。



iv. PropertyMessageResources

1. 该类用于初始化资源文件,并根据传入的资源文件名称进行初始化内容并存入到HashMap当中.(注意:资源文件名称后缀名必须为Properties)



3. 处理流程

a) 系统启动加载ActionServlet,进入init方法,调用initInternal()初始化国际化资源文件到HashMap当中。

i. 先根据传入的路径,如:org.apache.struts.action.ActionResources,将“.”转换成“/”,再将Loacle转 换成对应语言的缩写(如中国:zh_CN),最后将路径进行拼接,并拼接上. properties,最后的路径结果为: org/apache/struts/action/ActionResources_zh.properties。



ii. 获取路径后,使用java.util.Properties对象进行加载资源文件,并将信息缓存到内存当中,结构:HashMap{locale.key,value}如HashMap{zh_CN.alertInfo,”提示信息”}。



iii. 根据locale, key设置和获取资源文件信息。

     1. 根据传入的语言信息进行获取和设置资源文件信息,如果找到返回,没有找到——》2.

     2. 根据本地语言信息获取资源文件信息,如果找到返回,没有找到——》3.

     3. 使用不带Locale进行设置和获取资源文件信息,如果找到返回,没有找到——》4.

     4. 如果returnNull参数为true,则返回null,否则返回"???Loacle.key???".



iv. 设置和获取资源文件信息,内存结构,一条信息对应一个MessageFormat,并存放在HashMap缓存当中,key值为,locale加key组 合成的formatKey,value为资源文件当中的value所构造成的MessageFormat,最后根据传入的args,进行格式化,args 主要用于设置在资源文件当中“{0},{1}”符号的值,数组下标对应资源文件当中的占位符,如果没有占位符,传入null。如果数组下标不够,占位符将 作为字符串进行处理并输出。

b) 在jsp当中,标签调用MessageResources获取资源文件,JAVA类当中使用MessageResources获取资源文件。

下载地址 http://www.haowanw.com/bbs/viewthread.php?tid=946&extra=page%3D1