2012-10-15 64 views
0

我有一個簡單的表單,它應該在我的Login-Bean中調用countryChanged()方法。p:ajax不調用bean方法

<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()); 
} 
} 

我跟着它已經在計算器這裏討論的一些建議。但不知何故,它不想工作。任何人都可以看到一個錯誤?

回答

-1

您錯過了觸發ajax請求的客戶端事件。

試試這個:事件= 「變化」

<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> 
+1

錯誤。默認事件是'valueChange',它已經是正確的了。誰高舉這個答案必須重新考慮他的不正確的upvote。 – BalusC

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> 
    

    Locale之間轉換(在模型中)

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

  2. 創建定製轉換器和String(在HTML)。

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