2013-01-17 205 views
2

我目前正在嘗試以編程方式設置區域設置,但無法找到一個好的解決方案。用例是我有另一個網站發佈數據到我的網站,有一個區域設置參數,並基於此區域設置,我必須呈現我的網頁。如何在JSF中以編程方式設置區域設置

我已經嘗試在preRenderView,構造函數和PostConstruct上設置語言環境,但它似乎已經晚了。

有什麼建議嗎?謝謝。

+0

相關:[從瀏覽器和編程的JSF 2.0設置區域設置會話](http://stackoverflow.com/q/5388426/1065197) –

+0

是的,我知道如何設置區域設置。我的問題是如何在頁面呈現之前設置區域設置。這是因爲我的語言環境值來自post變量。 – czetsuya

+0

@czetsuya,只要確保重新加載頁面(沒有'f:ajax'的'h:commandButton'可以完成這個工作,例如或者用'f:ajax render =「@ all」') – Daniel

回答

1

我已經解決了這個問題,通過使用普通的JavaScript來加載頁面。

在我的PostConstruct中,我從上下文的請求參數映射中讀取參數。 //設置區域

try { 
    languageBean.setCurrentLocale(LocaleUtils.toLocale(temp.getLocale())); 
} catch (IllegalArgumentException | NullPointerException e) { 
    languageBean.setCurrentLocale(Locale.JAPAN); 
} 

,然後用普通的JavaScript重新加載頁面:

<script type="text/javascript"> 
    window.onload = function() { 
     if (!window.location.hash) { 
      window.location = window.location + '#loaded'; 
      window.location.reload(); 
     } 
    } 
</script> 

我在這裏寫了一個更詳細的代碼: http://czetsuya-tech.blogspot.com/2013/01/loading-locale-from-postget-parameter.html

+0

沒有'FacesContext.getCurrentInstance()。getViewRoot()。setLocale(LocaleUtils.toLocale(temp.getLocale()));'爲你工作? – Daniel

4

關鍵的一點是,你需要在渲染視圖之前將場所設置爲UIViewRoot#setLocale()<f:view locale="#{languageBean.currentLocale}">僅在構建視圖時設置。因此任何基於請求的動作,其後調用的意圖只是改變這個bean屬性不會有任何影響。您確實也需要手動調用UIViewRoot#setLocale()

最簡單的方法就是在屬性的setter中執行UIViewRoot#setLocale()作業。 Daniel在你的問題評論中提供的鏈接答案中提到的bean示例完全符合:JSF 2.0 set locale throughout session from browser and programmatically。這種方式沒有醜陋的JS黑客必須重新加載頁面一次。

根據您自己的回答,還有另一個可能的問題:您的「receiver bean」似乎是請求範圍,而不是#{languageBean}本身。如果這個bean是之後的第一次構建視圖的任何語言環境/語言相關方面(如語言下拉,本地化文本等),那麼改變它們爲時已晚。您想將bean的構建移至預渲染視圖事件(例如,通過<f:event listener>)。另一種方法是僅在currentLocale屬性的getter中執行請求參數收集作業。

+0

其實我的receiver bean是ConversationScope。不幸的是,我無法將收集工作放到languageBean currentLocale getter中,因爲我在整個項目中使用了languageBean。我會嘗試preRenderView事件。 – czetsuya

相關問題