p:ajax没有调用bean方法

时间:2012-10-15 21:50:27

标签: jsf listener selectonemenu

我有一个简单的表单,应该在我的Login-Bean中调用countryChanged()方法。

<h:form id="languageForm">
    <p:selectOneMenu value="#{login.locale}" var="locale" effect="fold">
        <p:ajax listener="#{login.countryChanged}" />
        <f:selectItem itemLabel="#{gui.LANGUAGE}" itemValue=""></f:selectItem>  
        <f:selectItems value="#{login.locales}" var="locales" itemLabel="#{locales.displayLanguage}" itemValue="#{locales}" />                  
         <p:column><h:graphicImage library="images" name="flags/#{locale.country}.png" /></p:column>
         <p:column>#{locale.displayName}</p:column>
    </p:selectOneMenu>
</h:form>


<h:form id="loginForm">
<h:panelGrid columns="2" title="Flexicon Login">
    <h:outputLabel for="login">#{gui.LOGIN}</h:outputLabel>
    <h:inputText id="login" required="true" value="#{loginControl.login}" label=""></h:inputText>
    <h:outputLabel for="password">#{gui.PASSWORD}</h:outputLabel>
    <h:inputSecret id="password" value="#{loginControl.password}"></h:inputSecret>
</h:panelGrid>
<p:messages></p:messages>
<h:commandButton value="#{gui.BTN_LOGIN}" action="#{loginControl.login}"></h:commandButton>
</h:form>

登录-豆

@ManagedBean(name="login")
@SessionScoped
public class LoginControl implements Serializable {
private static final long serialVersionUID = 5887191233181008116L;
private String login;
private String password;
private Locale locale;
private List<Locale> locales; 

public LoginControl(){

}

public String getLogin() {
    return login;
}

public void setLogin(String login) {
    this.login = login;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public Locale getLocale() {
    if(locale==null){
        locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
    }
    return locale;
}

public void setLocale(Locale locale) {
    //FacesContext.getCurrentInstance().getViewRoot().setLocale(locale);
    this.locale = locale;
}

public List<Locale> getLocales() {
    if(locales==null){
        Logger.getLogger(LoginControl.class).info("initializing locales...");
        locales = new ArrayList<Locale>();
        locales.add(Locale.GERMANY);
        locales.add(Locale.UK);
        locales.add(Locale.FRANCE);
    }
    return locales;
}

public void setLocales(List<Locale> locales) {
    this.locales = locales;
}

public void countryChanged(){
    FacesContext.getCurrentInstance().getViewRoot().setLocale(getLocale());
}   
}

我遵循了stackoverflow中已经讨论过的几个建议。但不知何故,它不想工作。任何人都可以看到错误吗?

2 个答案:

答案 0 :(得分:0)

您遇到转换错误。如果您已经注意到服务器日志,那么您已经注意到有关已排队但未显示的面部消息的警告。您应该在提交期间使用<p:messages autoUpdate="true"/>来自动更新它,以便在UI中正确显示任何转换/验证错误消息。

您的具体问题是由于您尝试将非标准Java对象类型java.util.Locale设置为项值而引起的。 JSF / EL没有内置转换器/强制,就像它对StringNumberBoolean一样。

您有两种方法可以解决此问题:

  1. 使用String代替Locale作为项目值,并在侦听器方法中围绕提交的字符串重建Locale

    <p:selectOneMenu value="#{login.language}" ...>
        <f:selectItems itemValue="#{locales.language}" />                  
        ...
    </p:selectOneMenu>
    

    private String language;
    
    public void countryChanged() {
        Locale locale = new Locale(language);
        // ...
    }
    

  2. 创建自定义转换器,可在Locale(在模型中)和String(在HTML中)之间进行转换。

    @FacesConverter(forClass=Locale.class)
    public class LocaleConverter implements Converter {
        // Implement accordingly.
    }
    

答案 1 :(得分:-1)

您错过了客户端事件以触发ajax请求。

试试这个: event =“change”

<h:form>
   <p:selectOneMenu>
       <p:ajax event="change" listener="#{bean.action}" />
       <f:selectItem itemLabel="foo" itemValue="0"/>
       <f:selectItem itemLabel="bar" itemValue="1"/>
   </p:selectOneMenu>
</h:form>