JSF的一個(gè)核心就是事件與監(jiān)聽(tīng)。JSF事件分為以下幾種: 1、Value-change events(值改變事件)
當(dāng)inputText的值改變的時(shí)候會(huì)觸發(fā)processValueChanged事件,此事情內(nèi)部通過(guò)參數(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)配置過(guò)的字符串,例如success,然后JSF根據(jù)faces-config.xml中的配置,跳轉(zhuǎn)到相應(yīng)的頁(yè)面。login的聲明一般是String login(); 當(dāng)然也可以通過(guò)程序來(lái)添加監(jiān)聽(tīng)器,不過(guò)監(jiān)聽(tīng)器類(lèi)需要實(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è)事件是為了捕捉一些階段和過(guò)程而設(shè)定的,有以下幾個(gè)階段可以捕捉:
具體可以參考http://java.sun.com/javaee/javaserverfaces/1.1_01/docs/api/javax/faces/event/PhaseId.html
通過(guò)設(shè)定在實(shí)現(xiàn)類(lèi)中設(shè)定相應(yīng)的PhaseId以及添加到faces-config.xml中就可以捕捉相應(yīng)階段事件并添加響應(yīng)的代碼
實(shí)現(xiàn)類(lèi)
在faces-config.xml中添加
當(dāng)然可以添加無(wú)限個(gè)的監(jiān)聽(tīng)器
下面是請(qǐng)求處理的生命周期,大家可以直觀的看一下各個(gè)階段執(zhí)行順序: 各個(gè)階段的說(shuō)明以及所能觸發(fā)的事件