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的代碼比較簡單,如下所示: