Events 如何使用值更改侦听器
我不知道如何处理f:valueChangeListener,我想选择国家和首都,因此这是我的代码,但它不起作用。有什么遗漏或错误Events 如何使用值更改侦听器,events,jsf-2,valuechangelistener,Events,Jsf 2,Valuechangelistener,我不知道如何处理f:valueChangeListener,我想选择国家和首都,因此这是我的代码,但它不起作用。有什么遗漏或错误 Country: <h:selectOneMenu value="#{event.country}" onchange="submit()"> <f:valueChangeListener type="org.jsf.model.ValueListener"/> <f:selectItems valu
Country:
<h:selectOneMenu value="#{event.country}" onchange="submit()">
<f:valueChangeListener type="org.jsf.model.ValueListener"/>
<f:selectItems value="#{event.countries}"/>
</h:selectOneMenu>
Capital: #{event.capital}
实现ValueChangeListener的类
package org.jsf.model;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;
public class ValueChangeClass implements ValueChangeListener {
String capital;
@Override
public void processValueChange(ValueChangeEvent event)throws AbortProcessingException {
if ("Egypt".equals(event.getNewValue()) capital = "Cairo";
else if ("Kuwait".equals(event.getNewValue())) capital = "Kuwait";
else if ("United States".equals(event.getNewValue())) capital = "Washington";
else capital = "";
new EventsBean().setCapital(capital);
}
}
它不起作用!
这是新的EventsBean().setCapital(资本);对吧?
这是新的EventsBean().setCapital(资本);对吧?
不,这是不对的。您正在手动创建一个全新的实例,而不是使用JSF管理的实例。一旦方法完成并返回,您的实例将完全消失。相反,您应该在JSF管理的实例中设置大写字母
。有几种方法可以实现这一点。如果您真的打算以这种方式使用ValueChangeListener
(顺便说一句,对于这种特殊用途来说,这是很奇怪的),那么您需要按如下方式修复它:
FacesContext context = FacesContext.getCurrentInstance();
EventsBean eventsBean = context.getApplication().evaluateExpressionGet(context, "#{event}", EventsBean.class);
eventsBean.setCapital(capital);
只在EventsBean
本身中完成这项工作更容易
<h:selectOneMenu value="#{event.country}" valueChangeListener="#{event.changeCountry}" onchange="submit()">
<f:selectItems value="#{event.countries}"/>
</h:selectOneMenu>
Capital: #{event.capital}
另见:
valuechangeListener
方法。@BalusC非常感谢您,我对FacesContext感到困惑,我不清楚!为什么以及何时使用它
<h:selectOneMenu value="#{event.country}" valueChangeListener="#{event.changeCountry}" onchange="submit()">
<f:selectItems value="#{event.countries}"/>
</h:selectOneMenu>
Capital: #{event.capital}
private String country;
private String capital;
private Map<String, String> capitals;
@PostConstruct
public void init() {
capitals = new HashMap<>();
capitals.put("Egypt", "Cairo");
capitals.put("Kuwait", "Kuwait");
capitals.put("United States", "Washington D.C.");
}
public void changeCountry(ValueChangeEvent event) {
capital = capitals.get(event.getNewValue());
}
<h:selectOneMenu value="#{event.country}">
<f:selectItems value="#{event.countries}"/>
<f:ajax listener="#{event.changeCountry}" render="capital" />
</h:selectOneMenu>
Capital: <h:outputText id="capital" value="#{event.capital}" />
// ...
public void changeCountry() {
capital = capitals.get(country);
}