最近一段时间,一直在研究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;
}
}
分享到:
相关推荐
该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开. struts.diSPAtcher.parametersWorkaround 对于某些Java EE服务器,不支持HttpServlet Request...
1.概述strust2中的拦截器 28 2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 ...
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...
第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整合...
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规范...
Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提交等)。 熟练掌握Struts2核心...
Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 ☆ Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 ...
3.8.2. 利用MessageSource实现国际化 3.8.3. 事件 3.8.4. 底层资源的访问 3.8.5. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.10. 以J2EE RAR文件的形式部署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. ...
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. 简介 ...
5.动态国际化,结合spring国际化机制+jstl+filter+jquery实现系统全文包括js文件的100%国际化配置,系统实现了10种语言(2.0版) 6.SeaJs模块化,可以整合各式插件,起到命名空间和按需加载的功效。 当然还有许多...
3.8.2. 利用MessageSource实现国际化 3.8.3. 事件 3.8.4. 底层资源的访问 3.8.5. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.10. 以J2EE RAR文件的形式部署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. 简介 ...
国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...