2011-02-17 18 views
2

我有這個bean:JSF 2 - 阿賈克斯 - 區域設置不更新

@ManagedBean(name="langListing") 
@ViewScoped 
public class LangListing implements Serializable 
{ 
    private List<SelectItem> languages = new ArrayList<SelectItem>(); 
    private String language; 

    public LangListing() { 
     createLangs(); // lazy loading 
    } 

    public void createLangs() 
    { 
     languages.add(new SelectItem("en", FacesUtil.getResourceBundle().getString("LANG_LABEL_01"))); // English 
     languages.add(new SelectItem("fr", FacesUtil.getResourceBundle().getString("LANG_LABEL_02"))); // French 
    } 

    public List<SelectItem> getLanguages() { 
     return languages; 
    } 

    public String getLanguage() 
    { 
     if (FacesContext.getCurrentInstance().getViewRoot().getLocale() != null) { 
      language = FacesContext.getCurrentInstance().getViewRoot().getLocale().toString(); 
     } else { 
      language = "en"; 
     } 

     return language; 
    } 

    public void setLanguages(List<SelectItem> languages) { 
     this.languages = languages; 
    }  

    public void setLanguage(String language) { 
     this.language = language; 
    } 

    public void changeLocale(AjaxBehaviorEvent event) { 
     FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(getLanguage())); 
    } 
} 

我打電話從bean的方法:

<h:selectOneMenu id="selectLang" immediate="true" value="#{langListing.language}"> 
    <f:ajax listener="#{langListing.changeLocale}" render="@form" /> 
    <f:selectItems value="#{langListing.languages}" /> 
</h:selectOneMenu> 

問題是我不能得到的代碼將語言環境從英語更改爲法語。任何人都可以看到問題嗎?請幫忙。

回答

1

您正在使用值getLanguage()進行設置,該值返回當前的UIViewRoot區域設置,否則返回en。它不返回選定的語言值。

您需要修改bean中的邏輯。這是一個重寫:

@ManagedBean(name="langListing") 
@ViewScoped 
public class LangListing implements Serializable { 
    private List<SelectItem> languages = new ArrayList<SelectItem>(); 
    private String language; 

    public LangListing() { 
     languages.add(new SelectItem("en", FacesUtil.getResourceBundle().getString("LANG_LABEL_01"))); // English 
     languages.add(new SelectItem("fr", FacesUtil.getResourceBundle().getString("LANG_LABEL_02"))); // French 
     language = FacesContext.getCurrentInstance().getViewRoot().getLocale().toString(); 
    } 

    public List<SelectItem> getLanguages() { 
     return languages; 
    } 

    public String getLanguage() { 
     return language; 
    } 

    public void setLanguages(List<SelectItem> languages) { 
     this.languages = languages; 
    }  

    public void setLanguage(String language) { 
     this.language = language; 
    } 

    public void changeLocale(AjaxBehaviorEvent event) { 
     FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(language)); 
    } 
} 

請注意,這種方法存在更多的潛在缺陷/漏洞。該bean是視圖範圍而不是會話範圍,並且您似乎沒有使用<f:view>(因爲它預計的是Locale,而不是String)。我會熱烈推薦讓你通過this answer排列。

+0

@BalusC啊,我明白了。你是個天才,男人!我還有一個與Ajax有關的問題,並且與上述問題有關 - 我可以在這裏問一下,還是必須開始一個新問題? – ChuongPham 2011-02-17 17:24:15