JSF从selectMenu更改语言不会';不要调用后构造

JSF从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()}" /> <

我在header.xhtml的change language selectone菜单中找到了。通过选择它可以正确地更改任何xhtml文件的语言。但是很少有页面将语言字符串设置在由Post构造调用的Java类本身中

Header.xhtml

<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构造的消息
就我而言,我会使用后者而不是前者。另外,在更改语言之后,最好的选择是向服务器启动一个新的非ajax请求-响应周期

更多信息:


    • 你的问题基本上是关于
      @PostConstruct
      的行为。此方法将在创建bean之后和字段注入之后调用一次,例如,用
      @EJB
      @Resource
      注释修饰的字段

      由于您使用
      @ViewScoped
      bean,因此每个视图将创建一次。刷新页面将创建一个新视图,这就是为什么将重新创建
      @ViewScoped
      bean的实例,并用所需的语言处理数据

      可能的解决办法:

      • 将处理视图的bean标记为
        @RequestScoped
      • 对输出消息使用适当的i18n国际化。不要依赖于从托管bean构造的消息
      就我而言,我会使用后者而不是前者。另外,在更改语言之后,最好的选择是向服务器启动一个新的非ajax请求-响应周期

      更多信息:


      谢谢!1) 你说的是后者而不是前者。但是为什么?谢谢!1) 你说的是后者而不是前者。但是为什么呢?在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}"/>