自定义实现struts2中的国际化机制

原创 2012年03月27日 12:48:01

最近一段时间,一直在研究struts2中的国际化实现方案.

对于struts2中标签的国际化中,key值的搜索顺序如下:

假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作:
(1)优先加载系统中保存在ChildAction的类文件相同位置,且baseName为ChildAction的系列资源文件。
(2)如果在(1)中找不到指定key对应的消息,且ChildAction有父类ParentAction,则加载系统中保存在ParentAction的类文件相同位置,且
   baseName为ParentAction的系列资源文件。
(3)如果在(2)中找不到指定key对应的消息,且ChildAction有实现接口IChildAction,则加载系统中保存在IChildAction的类文件相同位置,且
   baseName为IChildAction的系列资源文件。
(4)如果在(3)中找不到指定key对应的消息,且ChildAction有实现接口ModelDriven(即使用模型驱动模式),则对于getModel()方法返回的model对象,
   重新执行第(1)步操作。
(5)如果在(4)中找不到指定key对应的消息,则查找当前包下baseName为package的系列资源文件。
(6)如果在(5)中找不到指定key对应的消息,则沿着当前包上溯,直到最顶层包来查找baseName为package的系列资源文件。
(7)如果在(6)中找不到指定key对应的消息,则查找struts.custom.i18n.resources常量指定baseName的系列资源文件。
(8)如果经过上面的步骤一直找不到key对应的消息,将直接输出该key的字符串值。

 

后来我自定义了标签后,也想实现类似的功能.结果找来找去,

  • 要么需要在相关方法中指定包名如下面的:public static String getString(String baseName,String key)
  • 要么只能在全局资源文件中查找key值,如下面的:public static String getString(String key)

基本上很难实现struts标签中getText("user.title")或<s:text name="ttile"/>的查找方式.

再后来,参考了开源控件extremecomponents项目的代码,再加上ec-ext.jar中的部分代码,才找到解决方案.

废话不说了,先晒代码:

/**
 * 
 * 访问资源文件的方法

 * @author zhangpf
 * 
 */
public class ResourceUtil  {
	/**
	 * zhangpf 借用ectable中的国际化机制来实现国际化

	 */
	protected TextProvider textProvider;
	
	public ResourceUtil(PageContext pageContext)
	{
		//初使化国际化相关的变量
        ValueStack stack = TagUtils.getStack(pageContext);
        Iterator iter = stack.getRoot().iterator();
        Object o=null;
        do
        {
            if(!iter.hasNext())
               break;
            o = iter.next();
        } while(!(o instanceof TextProvider));
        
        textProvider = (TextProvider)o;
	}
	
	/**
	 * 该方法适合用在jsp的标签实现类中
	 * 此方法寻找属性文件的顺序和路径与一般的struts2标签中的用法一样.比如<s:text标签
	 * 国际化相关的方法:传入key值,取出对应的value
	 * @param code
	 * @return
	 */
	 protected String getMessage(String code)
    {
        return getMessage(code, null);
    }

	 protected String getMessage(String code, Object args[])
     {
        List theArgs = null;
        if(args != null)
        {
            theArgs = new ArrayList();
            Object arr[] = args;
            int len = arr.length;
            for(int i = 0; i < len; i++)
            {
                Object arg = arr[i];
                theArgs.add(arg);
            }

        }
        String message = null;
        if(textProvider != null)
            message = textProvider.getText(code, null, theArgs);
        else
        	return code;
        
        return message;
    }

	/**静态方法
	 * 通过全局资源文件来取值

	 * @param key
	 * @return
	 */
	public static String getString(String key)
	{		
		Locale locale = Locale.getDefault();    
		String value=LocalizedTextUtil.findDefaultText(key,locale);		
		return value==null?key:value;
	}
	/**
	 * 静态方法
	 * 指定资源文件取值

	 * @param baseName
	 * @param key
	 * @return
	 */
	public static String getString(String baseName,String key)
	{
		try{
			Locale locale = Locale.getDefault();    
			ResourceBundle bundle = ResourceBundle.getBundle(baseName,locale);  
			String value=bundle.getString(key);	
			return value==null?key:value;
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return key;
	}
	
	

}


 

struts2实现国际化

最近在学习struts2,学习资料是李刚著的《struts2权威指南》,这本书写得非常好,非常有学习价值。我在学习过程中,自己跟着做了些例子。下面就是关于在struts2中允许用户自行选择程序语言的原...
  • zhangweikai966
  • zhangweikai966
  • 2012年05月18日 19:48
  • 8960

Struts2国际化详细配置说明

一.首先了解一下什么是国际化:    国际化的英文为Internationalization,所以它又称为I18n(internationalization的首末字符i和n,18为中间的字符数)。i1...
  • dream0352
  • dream0352
  • 2016年02月18日 18:00
  • 5523

struts2的国际化(即实现网站整体中英文切换)实例

环境要求:Struts2框架环境搭建成功 为了实现程序的国际化,必须先提供程序所需要的资源文件。资源文件的内容基本是key-value对,其中key是程序使用的部分,而value是程序的显示部分...
  • weixin_36380516
  • weixin_36380516
  • 2017年05月18日 21:19
  • 2139

国际化之struts2实现研究

国际化之Struts2实现研究   一、基本原理 先不提Struts这一工具,也不用其他现成的工具,如何实现国际化? 最基本的实现就是,根据不同的Locale读取不同的文本。 例如有两个资源...
  • zollty
  • zollty
  • 2013年03月23日 19:46
  • 6560

Struts2标签以及国际化

【参考资料】《java EE技术实验教程》 韩珊珊、王春平编著,清华大学出版社 这里action的有关内容不再赘述。 首先,做一个注册页面,一个注册失败的页面,一个注册成功的页面。注册页面...
  • u013063099
  • u013063099
  • 2017年03月16日 09:14
  • 619

Struts2框架运行机制

文章属于入门级水平,重要事情说三篇,入门级,入门级,入门级 1.struts2=struts1+webwork 是实现MVC表示层的web框架 运行机制: 1>.客户端在浏览器中输入一个url地址...
  • fei641327936
  • fei641327936
  • 2016年07月23日 10:18
  • 424

struts2-多国语言国际化应用过程

转自:http://blog.sina.com.cn/s/blog_6608320c0100j4n1.html struts2-多国语言国际化应用过程: 1、新建三个.properties,分别为 ...
  • xuanjiewu
  • xuanjiewu
  • 2016年02月04日 23:44
  • 1415

菜鸟学SSH(二)——Struts2国际化手动切换版

转载自:http://blog.csdn.net/liushuijinger/article/details/16834039 国际化(internationalization,i18n)和...
  • u012377333
  • u012377333
  • 2016年02月15日 16:13
  • 848

菜鸟学SSH(二)——Struts2国际化手动切换版

localization,l10n)指让产品(出版物,软件,硬件等)能够适应非本地环境,特别是其他的语言和文化。程序在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。 国际化原理: 国...
  • liushuijinger
  • liushuijinger
  • 2013年11月20日 08:03
  • 10758

使用Struts2国际化

Struts2国际化是建立在Java国际化的基础之上,一样也是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再取得该资源文件中指定key...
  • kakarot5
  • kakarot5
  • 2015年03月30日 14:59
  • 702
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义实现struts2中的国际化机制
举报原因:
原因补充:

(最多只允许输入30个字)