天天看點

多子產品Struts應用程式的幾個問題(及部分解決方法)

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

多子產品Struts應用程式的幾個問題(及部分解決方法)

package eg;

多子產品Struts應用程式的幾個問題(及部分解決方法)
多子產品Struts應用程式的幾個問題(及部分解決方法)

import java.util.Arrays;

多子產品Struts應用程式的幾個問題(及部分解決方法)
多子產品Struts應用程式的幾個問題(及部分解決方法)

import org.apache.struts.util.MessageResources;

多子產品Struts應用程式的幾個問題(及部分解決方法)

import org.apache.struts.util.MessageResourcesFactory;

多子產品Struts應用程式的幾個問題(及部分解決方法)
多子產品Struts應用程式的幾個問題(及部分解決方法)

public class CustomMessageResourcesFactory extends MessageResourcesFactory{

多子產品Struts應用程式的幾個問題(及部分解決方法)
多子產品Struts應用程式的幾個問題(及部分解決方法)

    public MessageResources createResources(String config) {

多子產品Struts應用程式的幾個問題(及部分解決方法)
多子產品Struts應用程式的幾個問題(及部分解決方法)

        return new CustomMessageResources(Arrays.asList(config.split(",")));

多子產品Struts應用程式的幾個問題(及部分解決方法)

    }

多子產品Struts應用程式的幾個問題(及部分解決方法)
多子產品Struts應用程式的幾個問題(及部分解決方法)

}

多子產品Struts應用程式的幾個問題(及部分解決方法)

這樣,在每個子產品的struts-config-xxx.xml裡,隻要像下面這樣定義資源檔案就可以實作共享資源的功能了,其中ErrorResources中是所有子產品都需要的錯誤資訊資源:

多子產品Struts應用程式的幾個問題(及部分解決方法)

<message-resources factory="eg.CustomMessageResourcesFactory" 

多子產品Struts應用程式的幾個問題(及部分解決方法)

    parameter="eg.ApplicationResources,eg.ErrorResources" />

多子產品Struts應用程式的幾個問題(及部分解決方法)

第二個問題暫時還沒有解決,也許要修改handler實作。