我有一个简单的表单,应该在我的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中已经讨论过的几个建议。但不知何故,它不想工作。任何人都可以看到错误吗?
答案 0 :(得分:0)
您遇到转换错误。如果您已经注意到服务器日志,那么您已经注意到有关已排队但未显示的面部消息的警告。您应该在提交期间使用<p:messages autoUpdate="true"/>
来自动更新它,以便在UI中正确显示任何转换/验证错误消息。
您的具体问题是由于您尝试将非标准Java对象类型java.util.Locale
设置为项值而引起的。 JSF / EL没有内置转换器/强制,就像它对String
,Number
和Boolean
一样。
您有两种方法可以解决此问题:
使用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);
// ...
}
创建自定义转换器,可在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>