【发布时间】:2015-02-26 00:18:38
【问题描述】:
我已经在 header.xhtml 中更改语言 selectOneMenu。通过选择正确更改任何 xhtml 文件的语言。但是很少有页面在 Java 类本身中设置语言字符串,后者由 Post-Construct 调用。
Header.xhtml
<h:selectOneMenu value="#{client.language}" onchange="submit()" >
<f:selectItems value="#{client.languages()}" />
</h:selectOneMenu>
在managed bean 中,我有ViewScoped,然后是PostConstruct。我的问题是 - 从菜单更改语言后,Java 设置的某些字符串未翻译。那是因为它是由 PostConstruct 调用的,而在更改语言时不会调用它。但是当我通过单击链接进入该页面时,字符串就会被翻译。只是一旦我更改语言,字符串就不会被翻译。
我认为这里的问题是因为在更改语言时没有调用PostConstruct。如何调用它?
【问题讨论】:
-
一个由
@PostConstruct修饰的方法在bean 类投入使用之前被调用。只要视图回发给自身,即当您将表单提交到同一个视图时,视图范围的 bean 就会存在。在您向视图范围 bean 发出GET请求后,在该视图范围 bean 中由@PostConstruct修饰的方法将不会在随后的POST请求中调用(直到您重新创建视图范围 bean - 通过导航到例如,不同的视图)。 -
onchange="submit()"本质上是发出一个POSTHTTP 请求。因此,视图范围 bean 中由@PostConstruct注释的方法将不会被调用,因为视图恰好回发给自身。 -
谢谢!如果我将 onchange="submit()" 更改为其他内容,@PostConstruct 将被调用?
-
我在我的应用程序中所做的是:由于我碰巧使用了 PrimeFaces,它让生活变得更加轻松。支持的语言列在
<p:selectOneMenu>中。选择/更改了来自此<p:selectOneMenu>的语言,触发onchange987654337 @ javascript事件,所选的语言名称作为参数传递给JavaScript函数,就像这个onchange="changeLanguage([{name: 'language', value: this.value}]);"。此 JavaScript 事件绑定到<p:remoteCommand name="changeLanguage"...>。
标签: jsf