当用户更改输入组件(例如h:inputText或h:selectOneMenu)时 ,将触发JSF“ 值更改事件 ”。
实现它的两种方法:
1.方法绑定 –在输入组件中,直接在“ valueChangeListener ”属性中指定bean的方法。
JSF…
<h:selectOneMenu value="#{bean.value}" onchange="submit()"
valueChangeListener="#{bean.valueChangeMethod}">
<f:selectItems value="#{bean.values}" />
</h:selectOneMenu>
Java…
与值更改事件交互的方法应接受ValueChangeEvent参数。
@ManagedBean(name="bean")
@SessionScoped
public class BeanBean{
public void valueChangeMethod(ValueChangeEvent e){
//...
}
}
2. ValueChangeListener接口 –在输入组件中,在其中添加“ f:valueChangeListener ”标签,并指定ValueChangeListener接口的实现类。
JSF…
<h:selectOneMenu value="#{bean.value}" onchange="submit()">
<f:valueChangeListener type="ValueListenerXXX" />
<f:selectItems value="#{bean.values}" />
</h:selectOneMenu>
Java…
实现ValueChangeListener接口,并重写processValueChange()方法。
public class ValueListenerXXX implements ValueChangeListener{
@Override
public void processValueChange(ValueChangeEvent event)
throws AbortProcessingException {
//...
}
}
注意
为了使其工作,您必须将onchange =“ submit()” JavaScript附加到输入组件; 否则,将不会触发任何事件。
完整的valueChangeListener示例
这是一个JSF 2.0应用程序,带有一个下拉框( h:selectOneMenu )和一个文本框( h:inputText ),当用户在下拉框中进行更改时,它将触发“值更改事件”并使用新选择的下拉框更新文本框值。
本示例以“ 方法绑定 ”和“ ValueChangeListener ”的方式进行演示。
1.方法绑定
一个国家/地区bean,提供要进行演示的国家/地区和地区代码列表。 您可以通过输入组件中的“ valueChangeListener ”属性来绑定bean的方法。 见下文 :
CountryBean.java
package com.mkyong;
import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ValueChangeEvent;
@ManagedBean(name="country")
@SessionScoped
public class CountryBean implements Serializable{
private static final long serialVersionUID = 1L;
private static Map<String,String> countries;
private String localeCode = "en"; //default value
static{
countries = new LinkedHashMap<String,String>();
countries.put("United Kingdom", "en"); //label, value
countries.put("French", "fr");
countries.put("German", "de");
countries.put("China", "zh_CN");
}
public void countryLocaleCodeChanged(ValueChangeEvent e){
//assign new value to localeCode
localeCode = e.getNewValue().toString();
}
public Map<String,String> getCountryInMap() {
return this.countries;
}
public String getLocaleCode() {
return localeCode;
}
public void setLocaleCode(String localeCode) {
this.localeCode = localeCode;
}
}
JSF页面
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:body>
<h1>JSF 2 valueChangeListener example</h1>
<h:form>
<h:panelGrid columns="2">
Selected country :
<h:inputText id="country" value="#{country.localeCode}" size="20" />
Select a country {method binding}:
<h:selectOneMenu value="#{country.localeCode}" onchange="submit()"
valueChangeListener="#{country.countryLocaleCodeChanged}">
<f:selectItems value="#{country.countryInMap}" />
</h:selectOneMenu>
</h:panelGrid>
</h:form>
</h:body>
</html>
2. ValueChangeListener接口
重用以上country bean以提供国家和地区代码列表。 实现ValueChangeListener接口,并通过“ f:valueChangeListener ”标签将其绑定。 见下文 :
CountryValueListener.java
package com.mkyong;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ValueChangeEvent;
import javax.faces.event.ValueChangeListener;
public class CountryValueListener implements ValueChangeListener{
@Override
public void processValueChange(ValueChangeEvent event)
throws AbortProcessingException {
//access country bean directly
CountryBean country = (CountryBean) FacesContext.getCurrentInstance().
getExternalContext().getSessionMap().get("country");
country.setLocaleCode(event.getNewValue().toString());
}
}
JSF页面
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:body>
<h1>JSF 2 valueChangeListener example</h1>
<h:form>
<h:panelGrid columns="2">
Selected country :
<h:inputText id="country" value="#{country.localeCode}" size="20" />
Select a country {ValueChangeListener class}:
<h:selectOneMenu value="#{country.localeCode}" onchange="submit()">
<f:valueChangeListener type="com.mkyong.CountryValueListener" />
<f:selectItems value="#{country.countryInMap}" />
</h:selectOneMenu>
</h:panelGrid>
</h:form>
</h:body>
</html>
演示版
默认情况下,选择国家“英国”。

如果更改了国家/地区下拉框的值,则触发valueChangeListener ,并使用新选择的下拉框更新文本框值。

下载源代码
下载它– JSF-2-ValueChangeListener-Example.zip (10KB)
参考
翻译自: https://mkyong.com/jsf2/jsf-2-valuechangelistener-example/