JSF从selectMenu更改语言不会';不要调用后构造
我在header.xhtml的change language selectone菜单中找到了。通过选择它可以正确地更改任何xhtml文件的语言。但是很少有页面将语言字符串设置在由Post构造调用的Java类本身中 Header.xhtmlJSF从selectMenu更改语言不会';不要调用后构造,jsf,Jsf,我在header.xhtml的change language selectone菜单中找到了。通过选择它可以正确地更改任何xhtml文件的语言。但是很少有页面将语言字符串设置在由Post构造调用的Java类本身中 Header.xhtml <h:selectOneMenu value="#{client.language}" onchange="submit()" > <f:selectItems value="#{client.languages()}" /> <
<h:selectOneMenu value="#{client.language}" onchange="submit()" >
<f:selectItems value="#{client.languages()}" />
</h:selectOneMenu>
在managedbean
中,我有ViewScoped
,然后是PostConstruct
。我这里的问题是-在从菜单更改语言后,Java设置的一些字符串不会被翻译。这是因为它是由PostConstruct调用的,而在语言更改时,PostConstruct不会被调用。但当我点击链接进入该页面时,字符串被翻译。只是只要我改变语言,字符串就不会被翻译
我认为这里的问题是因为当语言更改时,
PostConstruct
没有被调用。我如何调用它?我试着像你过去那样调用它,但也没有运气。下面是我如何解决这个问题(使用JQuery):
我试着像你过去那样做,但也没有运气。下面是我如何解决这个问题(使用JQuery):
你的问题基本上是关于
@PostConstruct
的行为。此方法将在创建bean之后和字段注入之后调用一次,例如,用@EJB
和@Resource
注释修饰的字段
由于您使用@ViewScoped
bean,因此每个视图将创建一次。刷新页面将创建一个新视图,这就是为什么将重新创建@ViewScoped
bean的实例,并用所需的语言处理数据
可能的解决办法:
- 将处理视图的bean标记为
@RequestScoped
- 对输出消息使用适当的i18n国际化。不要依赖于从托管bean构造的消息
- 你的问题基本上是关于
@PostConstruct
的行为。此方法将在创建bean之后和字段注入之后调用一次,例如,用@EJB
和@Resource
注释修饰的字段
由于您使用@ViewScoped
bean,因此每个视图将创建一次。刷新页面将创建一个新视图,这就是为什么将重新创建@ViewScoped
bean的实例,并用所需的语言处理数据
可能的解决办法:
- 将处理视图的bean标记为
@RequestScoped
- 对输出消息使用适当的i18n国际化。不要依赖于从托管bean构造的消息
@PostConstruct
修饰的方法。视图作用域bean的存在时间与视图发回自身的时间相同,即当您将表单提交到同一视图时。向视图范围bean发出GET
请求后,该视图范围bean中由@PostConstruct
修饰的方法将不会在后续的POST
请求中调用(直到您重新创建视图范围bean-例如,通过导航到其他视图)。onchange=“submit()”
本质上是发出POST
HTTP请求。因此,视图作用域bean中由@PostConstruct
注释的方法将不会被调用,因为视图恰好回发到自身。谢谢!如果我将onchange=“submit()”更改为其他内容,@PostConstruct将被调用?下面的答案(Luiggi Mendoza)中已经提到了这一点,“在更改语言后,最好的选择是向服务器启动一个新的非ajax请求-响应周期”。另请参见和。我在应用程序中所做的是:因为我碰巧使用了PrimeFaces,所以它使生活变得更加轻松。支持的语言列在
中。当选择/更改此
中的语言时,将触发onchange
JavaScript事件,并将所选语言名称作为参数传递给JavaScript函数,如下所示onchange=“changeLanguage([{name:'language',value:this.value}];”
。此JavaScript事件绑定到
。在bean类投入使用之前,将调用由@PostConstruct
修饰的方法。视图作用域bean的存在时间与视图发回自身的时间相同,即当您将表单提交到同一视图时。向视图范围bean发出GET
请求后,该视图范围bean中由@PostConstruct
修饰的方法将不会在后续的POST
请求中调用(直到您重新创建视图范围bean-例如,通过导航到其他视图)。onchange=“submit()”
本质上是发出POST
HTTP请求。因此,视图作用域bean中由@PostConstruct
注释的方法将不会被调用,因为视图恰好回发到自身。谢谢!如果我将onchange=“submit()”更改为其他内容,@PostConstruct将被调用?下面的答案(Luiggi Mendoza)已经提到了这一点,“在更改语言后,最好的选择是启动一个新的非ajax请求-响应周期
<h:selectOneMenu value="#{client.language}" onchange="$(document).find('.submitBtn').click();" >
<f:selectItems value="#{client.languages()}" />
</h:selectOneMenu>
<h:commandButton style="visibility: hidden;" styleClass="jsfHidden submitBtn" action="#{yourpostconstructmethod}"/>