【问题标题】:JSF Changing language from selectMenu doesn't invoke PostConstructJSF 从 selectMenu 更改语言不会调用 PostConstruct
【发布时间】: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()" 本质上是发出一个POST HTTP 请求。因此,视图范围 bean 中由 @PostConstruct 注释的方法将不会被调用,因为视图恰好回发给自身。
  • 谢谢!如果我将 onchange="submit()" 更改为其他内容,@PostConstruct 将被调用?
  • 这在下面的答案中已经提到(Luiggi Mendoza),“更改语言后,最好的选择是向服务器触发一个新的非 ajax 请求-响应周期我>”。另见thisthis
  • 我在我的应用程序中所做的是:由于我碰巧使用了 PrimeFaces,它让生活变得更加轻松。支持的语言列在&lt;p:selectOneMenu&gt; 中。选择/更改了来自此&lt;p:selectOneMenu&gt;的语言,触发onchange 987654337 @ javascript事件,所选的语言名称作为参数传递给JavaScript函数,就像这个onchange="changeLanguage([{name: 'language', value: this.value}]);"。此 JavaScript 事件绑定到 &lt;p:remoteCommand name="changeLanguage"...&gt;

标签: jsf


【解决方案1】:

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

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

可能的解决方案:

  • 将处理视图的bean标记为@RequestScoped
  • 为您的输出消息使用适当的 i18n 国际化。不要依赖从托管 bean 构造的消息。

就我而言,我会使用后者而不是前者。此外,更改语言后,最好的选择是向服务器触发一个新的非 ajax 请求-响应周期。

更多信息:

【讨论】:

  • 谢谢! 1)你说的是后者而不是前者。但为什么呢?
【解决方案2】:

我也尝试过像你过去那样做,但也没有运气。这是我解决问题的方法(使用 JQuery):

<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}"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多