2

f:valueChangeListener の処理方法がわかりません。国と首都を選択したいので、これが私のコードですが、機能しません何が欠けているのか、何が間違っているのですか?

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

うまくいきません!これは new EventsBean().setCapital(capital); ですか?

4

1 に答える 1

5

これは new EventsBean().setCapital(capital); ですか?

いいえ、そうではありません。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);
}

以下も参照してください。

于 2012-06-23T04:40:24.003 に答える