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>

ログイン Bean

@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.util.Locale非標準のJavaオブジェクトタイプをアイテム値として設定しようとしているため、具体的な問題が発生しています。JSF/EL には、String、 、NumberおよびBoolean.

この問題を解決するには、次の 2 つのオプションがあります。

  1. 項目値としてStringの代わりに使用し、リスナー メソッドで送信された文字列を再構築します。LocaleLocale

    <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 に答える