2010-02-26 41 views
2

在Java Server Faces中,我們通常會使用UIViewRoot.getLocale()方法獲取當前請求的區域設置,該方法通常會返回瀏覽器中設置的區域設置。在分層應用程序中,如何在其他層中讀取相同的語言環境,並且無法訪問JSF對象?看起來Locale.getDefault()不適合,因爲它返回一個JVM範圍的默認語言環境。我需要上下文語言環境,僅由來自瀏覽器的當前請求設置。我認爲它需要具有某種線程親和力,就像.NET的Thread.CurrentCulture屬性一樣。如何將JSF區域設置傳播到應用程序中的其他層

+1

你到底需要什麼?你有沒有考慮過把它作爲一個論點來傳遞? – BalusC 2010-02-26 16:34:56

+0

這不應該是一個參數,它是一種上下文信息。 – 2010-02-26 18:20:35

回答

2

您可以將它作爲參數傳遞給需要它的方法。我認爲這是最好的方法。

public void businessMethod(String someArg, int otherArg, Locale locale) { 
    .. 
} 

但它需要修改您的方法簽名。您可以實現通過在.NET這樣的:

public final class LocaleProvider { 
    private static ThreadLoca<Locale> currentLocale; 
    //static setters and getters for the threadLocal 
} 

但實際上,這就是FacesContext.get....getLocale()在做什麼。所以除了在服務層中擺脫對JSF的依賴之外,你沒有做太多的事情。

也就是說,目前Locale應該很少需要在商業運作。兩個例子我能想到的:在合適的語言

  • 發送電子郵件(合適的模板應選擇)
  • 生成的文件(如PDF)

所以,三思包括前您的業​​務邏輯中的語言環境依賴關係。

+0

有趣的滾動你自己的解決方案。但是我正在尋找一種官方的,框架內的方式,就像.NET一樣。如果它不存在,我可能會跟你的想法。 – 2010-02-26 15:54:30

3

不是你可能期望的答案,但是在分層設計中,答案應該是:你不需要。

只有表示層應根據語言環境進行數據格式化。

業務層和數據層應該以獨立於區域的方式保存和操作數據。

+0

在極少數情況下,它需要語言環境(請參閱我的回答) – Bozho 2010-02-26 15:33:51

+0

我認爲,如果您引入一個客戶實體具有客戶的所有偏好(如默認語言),那麼與客戶溝通有關的這些情況會得到更好的支持,電子郵件地址等,然後您將客戶實體一起傳遞。大多數時候,我不想用法語進行通信,而我的瀏覽器是英文:)但是我明白你的觀點。 – ewernli 2010-02-26 15:48:21

+0

語言環境還可用於例如從數據訪問層獲取用戶語言的產品名稱。這不是從低層訪問用戶的區域設置的有效點嗎? – 2010-02-26 15:51:10

1

語言環境僅針對Web層;服務層和dao層應該使用自定義語言域對象。對於模板,電子郵件等將區域設置轉換爲語言或使用默認語言。

想一想:如果我調用一個將調用使用語言環境的服務的Web服務,會發生什麼情況?區域設置將爲空!