gpt4 book ai didi

events - 如何使用值变化监听器

转载 作者:行者123 更新时间:2023-12-02 05:39:50 26 4
gpt4 key购买 nike

我不知道如何处理 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);
}
}

没用!这是新的 EventsBean().setCapital(capital); 对吗?

最佳答案

Is this new EventsBean().setCapital(capital);right ?

不,这是不对的。您正在手动创建一个全新的实例,而不是使用由 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);
}

另见:

关于events - 如何使用值变化监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11166840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com