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
posted on 2007-06-07 10:06
Libo 阅读(815)
评论(0) 编辑 收藏