Struts從1.1版本開始支持把應(yīng)用程序分為多個(gè)模塊,每個(gè)模塊可以看作獨(dú)立的應(yīng)用程序,在帶來方便的同時(shí),我也發(fā)現(xiàn)了一些問題。比如有一個(gè)
struts應(yīng)用程序分了大約十個(gè)模塊,現(xiàn)在有以下問題不知道大家一般是怎么解決的:
1、因?yàn)橐M(jìn)行驗(yàn)證,所以在每個(gè)模塊對應(yīng)的資源文件里都要有“errors.required={0} is required.”等資源,有沒有只用在一個(gè)文件里定義的方法?
2、用tiles的時(shí)候,要在每個(gè)模塊對應(yīng)的tiles-defs.xml里定義幾乎相同的definition,有沒有只用在一個(gè)文件里定義的方法?(我試過在缺省模塊里定義一個(gè)definition,然后在模塊里extends它,但不行,extends似乎只找當(dāng)前模塊)
3、使用ExceptionHandler的時(shí)候,為什么在exception標(biāo)簽里指定了bundle屬性還是只在當(dāng)前模塊里找資源?我希望把一些重復(fù)使用的異常處理聲明在一個(gè)文件里,例如NotLoginException、NoSuchObjectException等等,并且它們對應(yīng)的key也指向同一個(gè)資源文件里的資源(利用bundle屬性),怎么實(shí)現(xiàn)?
經(jīng)過一段時(shí)間的摸索,第一個(gè)和第三個(gè)問題基本上解決了,其實(shí)它們可以看作同一類問題,就是資源的問題。在struts-config-xxx.xml里定義資源文件時(shí),可以指定一個(gè)factory屬性,不指定時(shí)使用缺省的“org.apache.struts.util.PropertyMessageResourcesFactory”類。我的解決方法是自定義一個(gè)CustomMessageResourcesFactory類,將多個(gè)資源文件以逗號分隔的形式作為參數(shù)(即message-resources的parameter屬性)傳給它,在需要資源的地方會(huì)遍歷它們進(jìn)行查找。同時(shí)還要自定義一個(gè)CustomMessageResources類,它的getMessage()方法里是查找資源的關(guān)鍵代碼,而factory只是解析逗號分隔的參數(shù)構(gòu)造并返回CustomMessageResources實(shí)例。
CustomMessageResourcesFactory的代碼比較簡單,如下所示: