2013-01-17 263 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

相关问题