隨筆-348  評(píng)論-598  文章-0  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ā)的事件


          ---------------------------------------------------------
          專注移動(dòng)開發(fā)

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2008-10-14 10:49 TiGERTiAN 閱讀(2376) 評(píng)論(0)  編輯  收藏 所屬分類: JavaJSF
          主站蜘蛛池模板: 吉木乃县| 安阳市| 府谷县| 大理市| 米易县| 东方市| 务川| 榆树市| 襄樊市| 安福县| 彰武县| 介休市| 岫岩| 蓝田县| 井冈山市| 镇江市| 长兴县| 墨玉县| 永福县| 拜泉县| 台湾省| 城口县| 长兴县| 泾川县| 巫溪县| 青川县| 新闻| 随州市| 德令哈市| 霍山县| 错那县| 浑源县| 龙海市| 新宁县| 合江县| 峨眉山市| 民勤县| 安国市| 沙湾县| 福贡县| 楚雄市|