我目前正在嘗試以編程方式設置區域設置,但無法找到一個好的解決方案。用例是我有另一個網站發佈數據到我的網站,有一個區域設置參數,並基於此區域設置,我必須呈現我的網頁。如何在JSF中以編程方式設置區域設置
我已經嘗試在preRenderView,構造函數和PostConstruct上設置語言環境,但它似乎已經晚了。
有什麼建議嗎?謝謝。
我目前正在嘗試以編程方式設置區域設置,但無法找到一個好的解決方案。用例是我有另一個網站發佈數據到我的網站,有一個區域設置參數,並基於此區域設置,我必須呈現我的網頁。如何在JSF中以編程方式設置區域設置
我已經嘗試在preRenderView,構造函數和PostConstruct上設置語言環境,但它似乎已經晚了。
有什麼建議嗎?謝謝。
我已經解決了這個問題,通過使用普通的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
沒有'FacesContext.getCurrentInstance()。getViewRoot()。setLocale(LocaleUtils.toLocale(temp.getLocale()));'爲你工作? – Daniel
關鍵的一點是,你需要在渲染視圖之前將場所設置爲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中執行請求參數收集作業。
其實我的receiver bean是ConversationScope。不幸的是,我無法將收集工作放到languageBean currentLocale getter中,因爲我在整個項目中使用了languageBean。我會嘗試preRenderView事件。 – czetsuya
相關:[從瀏覽器和編程的JSF 2.0設置區域設置會話](http://stackoverflow.com/q/5388426/1065197) –
是的,我知道如何設置區域設置。我的問題是如何在頁面呈現之前設置區域設置。這是因爲我的語言環境值來自post變量。 – czetsuya
@czetsuya,只要確保重新加載頁面(沒有'f:ajax'的'h:commandButton'可以完成這個工作,例如或者用'f:ajax render =「@ all」') – Daniel