JSF 2 valueChangeListener示例

当用户更改输入组件(例如h:inputTexth: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>

演示版

默认情况下,选择国家“英国”。

jsf2-ValueChangeListener-example-1

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

jsf2-ValueChangeListener-example-2

下载源代码

下载它– JSF-2-ValueChangeListener-Example.zip (10KB)

参考

  1. JSF 2下拉框示例

翻译自: https://mkyong.com/jsf2/jsf-2-valuechangelistener-example/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值