`
k_lb
  • 浏览: 799032 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

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

 
阅读更多

最近一段时间,一直在研究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属性文件详解

    该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开. struts.diSPAtcher.parametersWorkaround 对于某些Java EE服务器,不支持HttpServlet Request...

    Struts2入门教程(全新完整版)

    1.概述strust2中的拦截器 28 2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 ...

    低清版 大型门户网站是这样炼成的.pdf

    2.5.3 自定义国际化struts 2校验错误消息 92 2.5.4 struts 2的自带校验器 92 2.6 struts 2的拦截器 94 2.6.1 struts 2内建拦截器介绍 95 2.6.2 定义和使用拦截器栈 97 2.6.3 使用自定义拦截器 98 2.7 小结 100...

    Java Web程序设计教程

    第7章 struts2中应用模板语言 145 7.1模板语言简介 145 7.2应用velocity 146 7.2.1velocity基础 146 7.2.2struts2对velocity的支持 153 7.3应用freemarker 155 7.3.1freemarker基础 155 7.3.2struts2整合...

    JAVA程序开发大全---上半部分

    12.2.5 Struts 2.0中的国际化编程 221 12.2.6 创建基于POJO的Action 223 12.3 Spring整合Struts 2.0框架 224 12.4 Struts 2.0应用实例:登录系统 227 12.5 本章小结 231 第13章 JPA的开发与应用 232 13.1 JPA规范...

    达内java培训目录

    Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提交等)。 熟练掌握Struts2核心...

    Spring面试题

    Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 ☆ Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 ...

    Spring中文帮助文档

    3.8.2. 利用MessageSource实现国际化 3.8.3. 事件 3.8.4. 底层资源的访问 3.8.5. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.10. 以J2EE RAR文件的形式部署Spring ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. ...

    Spring 2.0 开发参考手册

    3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 ...

    花田考试系统MyExam 1.0.1

    5.动态国际化,结合spring国际化机制+jstl+filter+jquery实现系统全文包括js文件的100%国际化配置,系统实现了10种语言(2.0版) 6.SeaJs模块化,可以整合各式插件,起到命名空间和按需加载的功效。 当然还有许多...

    Spring API

    3.8.2. 利用MessageSource实现国际化 3.8.3. 事件 3.8.4. 底层资源的访问 3.8.5. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.10. 以J2EE RAR文件的形式部署Spring ...

    spring chm文档

    3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

     国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...

    java 面试题 总结

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    超级有影响力霸气的Java面试题大全文档

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

Global site tag (gtag.js) - Google Analytics