JSF的一個(gè)核心就是事件與監(jiān)聽。JSF事件分為以下幾種:
1、Value-change events(值改變事件)











當(dāng)inputText的值改變的時(shí)候會(huì)觸發(fā)processValueChanged事件,此事情內(nèi)部通過參數(shù),獲取HtmlInputText的控件,然后設(shè)定readonly,同時(shí)設(shè)定panelGrid的模型changePanel的屬性,因?yàn)閜anelGrid綁定了changePanel這個(gè)模型。
2、Action events(動(dòng)作事件)


上面這個(gè)是靜態(tài)outcome事件,在faces-config.xml中配置相應(yīng)的屬性后,點(diǎn)擊該按鈕會(huì)轉(zhuǎn)向相應(yīng)的方法。

如果添加了actionListener屬性的話,點(diǎn)擊之后,在轉(zhuǎn)向其他頁(yè)面之前,會(huì)觸發(fā)指定的事件,處理之后再轉(zhuǎn)向。
這里的doSomeAction方法的聲明是void doSomeAction(ActionEvent actionEvent)。


上面這個(gè)是動(dòng)態(tài)outcome事件,當(dāng)點(diǎn)擊該按鈕之后會(huì)直接觸發(fā)loginForm中的login事件,login事件返回的是一個(gè)字符串,在login處理完相應(yīng)操作之后需要返回一個(gè)屬性中已經(jīng)配置過的字符串,例如success,然后JSF根據(jù)faces-config.xml中的配置,跳轉(zhuǎn)到相應(yīng)的頁(yè)面。login的聲明一般是String login();
當(dāng)然也可以通過程序來添加監(jiān)聽器,不過監(jiān)聽器類需要實(shí)現(xiàn)ActionListener接口:





3、Data model events(數(shù)據(jù)模型事件)













將上面的代碼放入初始化程序中,當(dāng)行的選擇改變的時(shí)候就會(huì)觸發(fā)相應(yīng)的日志打印。
這是因?yàn)檫@段代碼給dataTable控件定義了一個(gè)數(shù)據(jù)模型,數(shù)據(jù)和相應(yīng)的事件全部存在這個(gè)數(shù)據(jù)模型里面,然后將dataTable與這個(gè)模型進(jìn)行綁定即可使用它所有的數(shù)據(jù)和事件。點(diǎn)擊dataTable上面的一行自然也就會(huì)出發(fā)相應(yīng)的行選擇事件。
4.Phase events(階段事件)
這個(gè)事件是為了捕捉一些階段和過程而設(shè)定的,有以下幾個(gè)階段可以捕捉:







具體可以參考http://java.sun.com/javaee/javaserverfaces/1.1_01/docs/api/javax/faces/event/PhaseId.html
通過設(shè)定在實(shí)現(xiàn)類中設(shè)定相應(yīng)的PhaseId以及添加到faces-config.xml中就可以捕捉相應(yīng)階段事件并添加響應(yīng)的代碼
實(shí)現(xiàn)類

























在faces-config.xml中添加





當(dāng)然可以添加無限個(gè)的監(jiān)聽器





下面是請(qǐng)求處理的生命周期,大家可以直觀的看一下各個(gè)階段執(zhí)行順序:
各個(gè)階段的說明以及所能觸發(fā)的事件