JSF提供一個(gè)好處就是事件,例如可以對(duì)組件的值的改變提供一個(gè) Listener,和Swing有點(diǎn)相象.
下面以實(shí)例說(shuō)明:
為一個(gè)組件定義一個(gè)偵聽器有兩種方法:
第一種方法:偵聽方法所在類不用實(shí)現(xiàn)任何接口。
public void idChange(ValueChangeEvent event) {
System.out.println("ID的值改變了!");
FacesContext.getCurrentInstance().renderResponse();
}
這個(gè)方法只需要定義在BEAN中就可以了。接受一個(gè)Event參數(shù)。
頁(yè)面中這樣寫:
<h:inputText value="#{roseBean.rose.id}" valueChangeListener="#{roseBean.idChange}" onchange="this.form.submit()" immediate="true"/>
第二種方法:偵聽方法實(shí)現(xiàn)javax.faces.event.ValueChangeListener接口。
public class RoseIdChange implements ValueChangeListener {
public void processValueChange(ValueChangeEvent arg0)
throws AbortProcessingException {
System.out.println("change");
FacesContext.getCurrentInstance().renderResponse();
}
}
頁(yè)面的寫法是這樣的:
<h:inputText value="#{roseBean.rose.id}" onchange="this.form.submit()" immediate="true">
<f:valueChangeListener type="cn.xiangyunsoft.web.jsf.listener.RoseIdChange" />
</h:inputText>
在這兩種方法中的頁(yè)面代碼中都有 immediate="true" 這個(gè)屬性,它表示為是即時(shí)事件。
在處理方法中都有
FacesContext.getCurrentInstance().renderResponse();
表示這個(gè)方法處理完成之后直接跳到JSF生命周期的最后一個(gè)階段。
但是這樣還有一個(gè)問題就是:
如果在BEAN里面有一個(gè)list屬性,是從數(shù)據(jù)庫(kù)里取出來(lái)的數(shù)據(jù),在頁(yè)面上經(jīng)表格的形式體現(xiàn),每當(dāng)這個(gè)值變事件發(fā)生的時(shí)候都會(huì)從數(shù)據(jù)庫(kù)中重得取數(shù)據(jù),(當(dāng)然這個(gè)BEAN的scop 是request),這樣就多一次訪問數(shù)據(jù)庫(kù),如果不是在getList()中直接連接數(shù)據(jù),通過(guò)其他方法取數(shù)放到list中,這個(gè)值變事件就不會(huì)發(fā)生,或發(fā)生后表格的數(shù)據(jù)就沒有了。
看來(lái)只能用ajax了!
Technorati : jsf
posted on 2007-06-07 10:06
Libo 閱讀(819)
評(píng)論(0) 編輯 收藏