自定义实现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;
	}
	
	

}


 

相关文章推荐

【JavaWeb-17】国际化、自定义拦截器、struts2文件上传与下载、OGNL、contextMap

1、国际化。先写几个properties文件,格式是文件名(随便写)+语言名+国家名。——我们创建3个配置文件,用的是同一个key(UserField),但是值不一样。其中有一个没有语言和国家名的文件...

Struts2学习之国际化机制

什么叫国际化呢?自学时刚看到这个词的时候感觉好像很高端很难的样子,深入理解后才发现就那么一回事,不过其中的机制确实挺好的。        国际化主要是指语言的国际化,是不同地区和使用不同语言的用户都能...

自定义实现Struts2源代码

  • 2013年04月07日 16:04
  • 503KB
  • 下载

Struts2定义国际化资源文件

使用Struts国际化资源文件需要进行以下几个步骤:1.编写Struts国际化资源文件:首先我们需要了解Struts国际化资源文件的文件名称定义格式:baseName_countryName_coun...

在Struts2中实现自定义分页标签全攻略(二)

在前面的我们已经写好了一个自定义的分页标签,在jsp中引用该标签: pm其实是一个分页模型,里边包括了:当前页号(pageNo)、每页要显示的记录数(pageSize)、总记录数(rec...
  • tjcyjd
  • tjcyjd
  • 2011年10月15日 11:07
  • 5120

struts2自定义拦截器实现的分析说明附带代码

Struts2内建拦截器      Strus2框架内建了大量的拦截器完成了框架几乎70%的工作,比如,params拦截器将HTTP请求中的参数解析出来,设置成Action的属性;servlet-c...

struts2_11_自定义拦截器的实现

1)登录界面的代码: 用户已登录 2)退出界面的代码:

利用struts2拦截器加自定义注解实现权限控制

今天结合Java的Annotation和Struts2进行注解拦截器权限控制。 功能需求:添加、查找、删除三个功能,添加、查找功能需进行权限拦截判断,删除功能则不需进行权限拦截判断。 操作流程如下:客...
  • paul342
  • paul342
  • 2016年05月17日 15:42
  • 1931

在Struts2中实现自定义分页标签全攻略(一)

我们先看看这个分页标签的效果: 使用标签的最大好处就是下次再用到的话直接引用就行,而不必重写。 本人对Struts2自定义标签没有太深究,在网上找了一些资料可以参考参考: ...
  • tjcyjd
  • tjcyjd
  • 2011年10月04日 17:56
  • 8533
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义实现struts2中的国际化机制
举报原因:
原因补充:

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