我目前正在尝试以编程方式设置区域设置,但无法找到一个好的解决方案。用例是我有另一个网站发布数据到我的网站,有一个区域设置参数,并基于此区域设置,我必须呈现我的网页。如何在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