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

}

 

时间: 2024-09-17 00:01:03

自定义实现struts2中的国际化机制的相关文章

Struts2中的ModelDriven机制及其运用

ModelDriven 所谓ModelDriven,意思是直接把实体类当成页面数据的收集对象. 比如,有实体类User如下:   package cn.com.leadfar.struts2.actions;   public class User {     private int id;     private String username;     private String password;     private int age;     private String addre

struts2中页面表示国际化的方法

在struts2中,前端页面表示国际化的实现更加简单.简单的应用struts2提供的支持国际化的表达式 即可快速方便的进行页面的国际化的实现.如何做呢?本文以英文和中文为例进行说明. 1,自定义struts2的属性, 属性项目:struts.custom.i18n.resources 首先生成一个struts.properties文件, 文件位置:WEB-INF/src目录下 文件内容: struts.custom.i18n.resources=globalMessages 2,根据属性所指定的

Struts2框架,表单请求到action出错,貌似找不到自定义action类中的方法。

问题描述 Struts2框架,表单请求到action出错,貌似找不到自定义action类中的方法. 关键代码如下: ${Msg.sendUser.username } 上面代码的意思是:把${Msg.sendUser}提交到action,赋值给 action类属性message的sendUser.(sendUser数据类型是User对象) 请求后提示找不到action中的自定义方法,但是我表单中的值换成下面 的,变成赋值给message的属性sendUser的属性username,就能成功. 是

input视图-Struts2中action出现错误返回input的机制

问题描述 Struts2中action出现错误返回input的机制 2C 当action出现错误后,如何返回的input?通过哪个类返回的?希望大神们说的尽量详细点,先谢过了! 解决方案 链接:http://pan.baidu.com/s/1nuUL6OD 密码:igtz 解决方案二: return ""input"";或者return Action.Input;就OK了呀然后返回的就是input 如果你说的是显示错误信息的话调用addFieldError()方法时

【转】Struts2中转换Date类型的问题

好久没有写Blog了,最近似乎变懒了.今天上班没有很多事,于是把之前遇到的一个问题记录下来. Web开发会涉及到很多类型转换的情况.我们知道,页面中的一切值都是字符串类型,而到后台,我们需要的可能是其他各种类型:同时,页面显示也是字符串类型.这就涉及到Web中基本的类型转换问题:从String转换为各种类型与从各种类型转换为String类型. 在Java Web开发中,进行上述转换一般有以下几种:1.在Servlet中,这一切的转换我们得自己写代码完成:2.在Struts1.x中,我们通过apa

自定义—扩展struts2的标签

     最近在做j2ee的项目,需要封装很多标签,发现直接从BodyTagSupport继承的话,无法获取valuestack,也无法借用struts的国际化解决方案.所以需要扩展struts的标签.      看了网上很多的扩展方法,觉得只能做为参考或示例,但却一点也不实用.索性自已用ComponentTagSupport来做个封装.      下面是关于ComponentTagSupport的一些介绍:             在struts2.x中实现自定义标签时,继承的2个类分别是or

在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等

目录(?)[-] ValueStack 如何得到值栈: 如何将对象存入值栈: 让值栈执行表达式来获得值: 在JSP中跳过栈顶元素直接访问第二层: 在JSP中访问值栈对象本身(而不是它们的属性) ActionContext ValueStack与ActionContext的联系和区别: 如何获得ActionContext: 如何向ActionContext中存入值: 如何从ActionContext中读取值: HttpServletRequest类或request的Map 使用HttpServle

在自定义Server Control中捆绑JS文件 Step by Step

js|server 注:本文基于.NET 2.0 和 VS2005 我们在编写 Server Control 的时候难免要用到一些客户端脚本(javascript),如何把脚本和编译好的dll一起发布就成了一个问题.把一段一段的javascript block写在cs文件里是一件很"丑陋"的事情,javascript就应呆在*.js文件里.js文件怎样才能"打包"到dll里呢?查了很多文档,最后实践下来发现有很多细节是需要注意的.整理出来,免得大家走弯路.废话无多,

Objective-C中的属性机制

        Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现.在学习OC中属性之前我们先要知道为什么要为变量实现getter和setter方法,我们先来了解一下实例的作用域.     实例变量的作用域如下:         1. @public : 共有的,该实例变量谁都可以访问:         2.@protected :受保护的,该实例变量只能在该类和其子类内访问,父类protected的实例变