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 閱讀(817)
評論(0) 編輯 收藏