JSF中的事件

JSF中的事件

JSF提供一个好处就是事件,例如可以对组件的值的改变提供一个 Listener,和Swing有点相象.

下面以实例说明:

为一个组件定义一个侦听器有两种方法:

第一种方法:侦听方法所在类不用实现任何接口。

public void idChange(ValueChangeEvent event) {
System.out.println("ID的值改变了!");
FacesContext.getCurrentInstance().renderResponse();

}

这个方法只需要定义在BEAN中就可以了。接受一个Event参数。

页面中这样写:

<h:inputText value="#{roseBean.rose.id}" valueChangeListener="#{roseBean.idChange}" onchange="this.form.submit()" immediate="true"/>

第二种方法:侦听方法实现javax.faces.event.ValueChangeListener接口。

public class RoseIdChange implements ValueChangeListener {

public void processValueChange(ValueChangeEvent arg0)
throws AbortProcessingException {
System.out.println("change");

FacesContext.getCurrentInstance().renderResponse();
}
}


页面的写法是这样的:

<h:inputText value="#{roseBean.rose.id}" onchange="this.form.submit()" immediate="true">
<f:valueChangeListener type="cn.xiangyunsoft.web.jsf.listener.RoseIdChange" />
</h:inputText>

在这两种方法中的页面代码中都有 immediate="true" 这个属性,它表示为是即时事件。

在处理方法中都有

FacesContext.getCurrentInstance().renderResponse();
表示这个方法处理完成之后直接跳到JSF生命周期的最后一个阶段。

但是这样还有一个问题就是:

如果在BEAN里面有一个list属性,是从数据库里取出来的数据,在页面上经表格的形式体现,每当这个值变事件发生的时候都会从数据库中重得取数据,(当然这个BEAN的scop 是request),这样就多一次访问数据库,如果不是在getList()中直接连接数据,通过其他方法取数放到list中,这个值变事件就不会发生,或发生后表格的数据就没有了。

看来只能用ajax了!


Technorati : jsf

你可能感兴趣的:(JSF中的事件)