八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  244 随笔 :: 0 文章 :: 3241 评论 :: 14 引用

Struts从1.1版本开始支持把应用程序分为多个模块,每个模块可以看作独立的应用程序,在带来方便的同时,我也发现了一些问题。比如有一个struts应用程序分了大约十个模块,现在有以下问题不知道大家一般是怎么解决的:

1、因为要进行验证,所以在每个模块对应的资源文件里都要有“errors.required={0} is required.”等资源,有没有只用在一个文件里定义的方法?

2、用tiles的时候,要在每个模块对应的tiles-defs.xml里定义几乎相同的definition,有没有只用在一个文件里定义的方法?(我试过在缺省模块里定义一个definition,然后在模块里extends它,但不行,extends似乎只找当前模块)

3、使用ExceptionHandler的时候,为什么在exception标签里指定了bundle属性还是只在当前模块里找资源?我希望把一些重复使用的异常处理声明在一个文件里,例如NotLoginException、NoSuchObjectException等等,并且它们对应的key也指向同一个资源文件里的资源(利用bundle属性),怎么实现?

经过一段时间的摸索,第一个和第三个问题基本上解决了,其实它们可以看作同一类问题,就是资源的问题。在struts-config-xxx.xml里定义资源文件时,可以指定一个factory属性,不指定时使用缺省的“org.apache.struts.util.PropertyMessageResourcesFactory”类。我的解决方法是自定义一个CustomMessageResourcesFactory类,将多个资源文件以逗号分隔的形式作为参数(即message-resources的parameter属性)传给它,在需要资源的地方会遍历它们进行查找。同时还要自定义一个CustomMessageResources类,它的getMessage()方法里是查找资源的关键代码,而factory只是解析逗号分隔的参数构造并返回CustomMessageResources实例。

CustomMessageResourcesFactory的代码比较简单,如下所示:

package eg;

import java.util.Arrays;

import org.apache.struts.util.MessageResources;
import org.apache.struts.util.MessageResourcesFactory;

public class CustomMessageResourcesFactory extends MessageResourcesFactory{

    public MessageResources createResources(String config) {
        
        
return new CustomMessageResources(Arrays.asList(config.split(",")));
    }

}

CustomMessageResources就稍微复杂一些,不过很幸运,我在网上找到了一个完全符合自己要求的类,下载地址在这里,如果链接已失效请联系我。

这样,在每个模块的struts-config-xxx.xml里,只要像下面这样定义资源文件就可以实现共享资源的功能了,其中ErrorResources中是所有模块都需要的错误信息资源:

<message-resources factory="eg.CustomMessageResourcesFactory" 
    parameter
="eg.ApplicationResources,eg.ErrorResources" />

上面参考了这篇文章http://javaboutique.internet.com/tutorials/Dynaform/index-7.html,它是通过修改ActionServlet使用CustomMessageResources的,我觉得还是自定义factory的方式更自然些。

第二个问题暂时还没有解决,也许要修改handler实现。

posted on 2004-11-23 11:28 八进制 阅读(3277) 评论(8)  编辑 收藏 网摘 所属分类: Java

评论

#1楼[楼主] 2004-11-29 17:13 八进制      
最近发现上面提到的CustomMessageResources类有个问题,就是只能在缺省的资源文件里找资源,例如ApplicationResources.properties而不是ApplicationResources_zh_CN.properties,看来要解决这个问题才能算圆满。
  回复  引用  查看    

#2楼[楼主] 2004-12-01 17:19 八进制      
利用struts原先的PropertyMessageResources类作一些修改可以实现,从而解决了上面说的问题。
  回复  引用  查看    

#3楼[楼主] 2004-12-02 21:51 八进制      
CustomMessageResources的本地下载地址:http://www.cnblogs.com/Files/bjzhanghao/CustomMessageResources.zip">http://www.cnblogs.com/Files/bjzhanghao/CustomMessageResources.zip
  回复  引用  查看    

#4楼 2005-03-14 17:34 idkkk
resource bundle有个key的参数,可以用来区别不同的resource,应该不会出现楼主所说的那种情况吧~
  回复  引用    

#5楼[楼主] 2005-03-15 11:37 八进制      
在页面里可以用key指定使用哪个bundle,但validation和exception里则无法实现。
  回复  引用  查看    

#6楼 2005-06-01 14:29 qxo[未注册用户]
对于第3个问题:
在默认的struts-config.xml中配置plugin时设置
<set-property property="moduleAware" value="false" />
就可以在多个模块间共享tiles definitions了

  回复  引用    

#7楼 2005-09-17 20:17 deadsea[未注册用户]
十分感谢八进制,你(或者我应该说您),您的文章帮了我,我实在是很感激。

不知道您学java多久了,我不知道要多久才能到您的水平阿

  回复  引用    

#8楼 2007-02-27 13:55 madgirl[未注册用户]
最近也在研究多模块问题:
对于第1和3问题,在配置文件这样写,就可以资源共享了:
<message-resources parameter="CommenResources" />
<message-resources parameter="BizResources" />
第2个问题,就像楼上所说的方法可以实现
在默认的struts-config.xml中配置plugin时设置
<set-property property="moduleAware" value="false" />
就可以在多个模块间共享tiles definitions了

  回复  引用    

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 67425


相关文章:

相关链接: