JSF中的事件

本文介绍了JSF中值变更监听器的两种实现方式:一种是直接在Bean中定义监听方法,另一种是实现`ValueChangeListener`接口。文章还讨论了在使用这些监听器时可能遇到的问题,特别是当Bean包含从数据库获取的数据时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值