JSF ActionListener总是在Action之前运行 - 我该如何切换语言?

时间:2013-11-12 16:02:35

标签: jsf jsf-2 web

这就是我想要做的事情:

    <h:commandButton image="resources/frontend/img/persion.PNG" styleClass="persion"  action="#{language.changeLocaleCode('fa')}">
        <f:actionListener binding="#{home}" />
    </h:commandButton>

首先更改LanguageBean中的语言,然后回调home.xhtml的bean以根据新语言加载数据。

@ManagedProperty(value = "#{language}")
private LanguageBean language;

public HomeView() implements ActionListener{

}


@PostConstruct
    public void init() {
        String lang = language.getReadableLang();
.
. // do DAO stuff whil lang
.


public void processAction(ActionEvent arg0) throws AbortProcessingException {
        init();

}

首先我想如果我在processAction中放入一个Thread.sleep()命令,我可以推迟监听器的动作,直到commandButton的动作完成但没有做任何改变。还有一个与HomeView相关联的LanguageBean,还是因为HomeView的监听器总是在LanguageBean动作之前运行?我怎么能做这个工作?有没有标准的解决方案?

1 个答案:

答案 0 :(得分:2)

根据我收集的评论,#{home} bean是请求范围的,需要在语言更改时重建。在这种情况下,您应该重定向回相同的视图,而不是导航到同一视图。

public String changeLocaleCode(String language) {
    // ...

    FacesContext context = FacesContext.getCurrentInstance();
    return context.getViewRoot().getViewId() + "?faces-redirect=true";
}

然后你就可以摆脱<f:actionListener>