0

我有一个简单的表单,它应该在我的 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 中已经讨论过的几个建议。但不知何故,它不想工作。有人能看出错误吗?

4

2 回答 2

0

你有一个转换错误。如果您注意服务器日志,您会注意到有关排队但未显示的面孔消息的警告。您应该<p:messages autoUpdate="true"/>改为在提交期间自动更新它,以便任何转换/验证错误消息都将正确显示在 UI 中。

您的具体问题是因为您试图将非标准 Java 对象类型设置java.util.Locale为项目值。JSF/EL 没有内置的转换器/强制转换,就像它对String,NumberBoolean.

您有 2 个选项来解决此问题:

  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.
    }
    
于 2012-10-18T19:17:06.917 回答
-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>
于 2012-10-18T19:08:50.677 回答