posts - 5,  comments - 7,  trackbacks - 0

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

          <h:inputText valueChangeListener="#{myForm.processValueChanged}"/>
          <h:panelGrid binding="#{myForm.changePanel}" rendered="false">

          </h:panelGrid>


           

          public void processValueChanged(ValueChangeEvent event)
          {
          HtmlInputText sender 
          =
           (HtmlInputText)event.getComponent();
          sender.setReadonly(
          true
          );
          changePanel.setRendered(
          true
          );
          }

          當(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)作事件)

          <h:commandButton type="submit" value="Login" action="success"
          immediate
          ="true"/>

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

          <h:commandButton value = "Test Action Listener" actionListener = "#{testActionListener.doSomeAction}" />

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

          <h:commandButton type="submit" value="Login"
          action
          ="#{loginForm.login}"/>

          上面這個(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接口:

          UIComponent myComponent = new UIComponent();
          myComponent.addActionListener(
          new
           TestActionListener());
          myComponent.addActionListener(
          new
           CustomActionListener());


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

          FacesContext facesContext = FacesContext.getCurrentInstance();
          dataTable 
          =
           (HtmlDataTable)facesContext.getApplication().createComponent(
          HtmlDataTable.COMPONENT_TYPE);
          DataModel myDataModel 
          = new
           ResultSetDataModel(myResultSet);
          myDataModel.addDataModelListener(
          new
           DataModelListener()
          {
          public void
           rowSelected(DataModelEvent e)
          {
          FacesContext.getCurrentInstance().getExternalContext().
          log(
          "row selected:" +
           e.getRowIndex());
          }

          }
          );
          dataTable.setValue(myDataModel);

          將上面的代碼放入初始化程序中,當(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è)階段可以捕捉:

           

          ANY_PHASE 任一階段
          APPLY_REQUEST_VALUES  請(qǐng)求處理階段的應(yīng)用請(qǐng)求值階段
          INVOKE_APPLICATION 請(qǐng)求處理階段的調(diào)用程序階段
          PROCESS_VALIDATIONS 請(qǐng)求處理階段的處理驗(yàn)證階段
          RENDER_RESPONSE  請(qǐng)求處理階段的描述響應(yīng)階段
          RESTORE_VIEW 請(qǐng)求處理階段的恢復(fù)視圖階段
          UPDATE_MODEL_VALUES 請(qǐng)求處理階段的更新模型值階段

           

          具體可以參考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)類

           

          import javax.faces.event.PhaseEvent;
          import
           javax.faces.event.PhaseId;
          import
           javax.faces.event.PhaseListener;

          public class CustomPhaseListener implements
           PhaseListener
          {    
              
          public
           CustomPhaseListener()
              
          {
              }


              
          public void afterPhase(PhaseEvent event)
              
          {
                  System.out.println(
          "After Phase->" +
           event.getPhaseId());    
              }


              
          public void beforePhase(PhaseEvent event)
              
          {
                  System.out.println(
          "Before Phase->" +
           event.getPhaseId());
              }


              
          public PhaseId getPhaseId()
              
          {
                  
          return PhaseId.ANY_PHASE;//選擇事件標(biāo)識(shí)的常量,此為任一階段

              }
              
          }


          在faces-config.xml中添加

          <lifecycle>
              
          <phase-listener>
                  net.javabeat.articles.jsf.events.actions.TestActionListener
              
          </phase-listener>
          </lifecycle>


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

          <lifecycle>
              
          <phase-listener>PhaseListener1</phase-listener>
              
          <phase-listener>PhaseListener2</phase-listener>
          </lifecycle>


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

          posted on 2008-11-23 00:37 Vincent-chen 閱讀(367) 評(píng)論(0)  編輯  收藏 所屬分類: JSF
          主站蜘蛛池模板: 余姚市| 嘉善县| 泰宁县| 察哈| 辽阳县| 盈江县| 广安市| 金平| 呼图壁县| 渝北区| 长白| 大渡口区| 雷山县| 迭部县| 理塘县| 石泉县| 常宁市| 崇义县| 旅游| 汨罗市| 定远县| 裕民县| 建宁县| 孟村| 霍山县| 科技| 潼南县| 和硕县| 襄垣县| 旬阳县| 霍城县| 育儿| 高唐县| 克拉玛依市| 资兴市| 措勤县| 微博| 墨竹工卡县| 商洛市| 罗平县| 忻城县|