如何使用值变化监听器(how to use value change listener)

2019-09-18 09:40发布

我不知道如何处理使用f:valueChangeListener,我想选择的国家和资本出现,所以这是我的代码,但它doen't工作是什么小姐或者有什么错?

 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}  

我的托管bean

public class EventsBean{

private String capital;
private String country;
String countryCapital;


private String [] countries = {"Select","Egypt","United States","Kuwait"};

public String[] getCountries() {
    return countries;
  }

// getters and setters
}

实现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(资本);对吗?

Answer 1:

这是新EventsBean()setCapital(资本);对吗?

不,这是不对的。 要手动创建一个全新的实例,而不是使用由JSF管理的一个。 您的实例将完全消失,一旦该方法完成并返回。 而应该被设定capital在由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}
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());
}

或者,因为你已经在使用JSF 2.0,更好的是使用<f:ajax> 它在恰当的时机合适的工作。 使用(AB) valueChangeListener的方式与你原来的代码实际上是JSF的1.x时代的后遗症。

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

也可以看看:

  • 当使用valueChangeListener或f:ajax的听众?


文章来源: how to use value change listener