隨筆-348  評論-598  文章-0  trackbacks-0
          JSF的一個核心就是事件與監聽。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);
          }
          當inputText的值改變的時候會觸發processValueChanged事件,此事情內部通過參數,獲取HtmlInputText的控件,然后設定readonly,同時設定panelGrid的模型changePanel的屬性,因為panelGrid綁定了changePanel這個模型。

          2、Action events(動作事件)
          <h:commandButton type="submit" value="Login" action="success"
          immediate
          ="true"/>
          上面這個是靜態outcome事件,在faces-config.xml中配置相應的屬性后,點擊該按鈕會轉向相應的方法。

          <h:commandButton value = "Test Action Listener" actionListener = "#{testActionListener.doSomeAction}" />
          如果添加了actionListener屬性的話,點擊之后,在轉向其他頁面之前,會觸發指定的事件,處理之后再轉向。
          這里的doSomeAction方法的聲明是void doSomeAction(ActionEvent actionEvent)。

          <h:commandButton type="submit" value="Login"
          action
          ="#{loginForm.login}"/>
          上面這個是動態outcome事件,當點擊該按鈕之后會直接觸發loginForm中的login事件,login事件返回的是一個字符串,在login處理完相應操作之后需要返回一個屬性中已經配置過的字符串,例如success,然后JSF根據faces-config.xml中的配置,跳轉到相應的頁面。login的聲明一般是String login();

          當然也可以通過程序來添加監聽器,不過監聽器類需要實現ActionListener接口:
          UIComponent myComponent = new UIComponent();
          myComponent.addActionListener(
          new TestActionListener());
          myComponent.addActionListener(
          new CustomActionListener());


          3、Data model events(數據模型事件)
          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);
          將上面的代碼放入初始化程序中,當行的選擇改變的時候就會觸發相應的日志打印。
          這是因為這段代碼給dataTable控件定義了一個數據模型,數據和相應的事件全部存在這個數據模型里面,然后將dataTable與這個模型進行綁定即可使用它所有的數據和事件。點擊dataTable上面的一行自然也就會出發相應的行選擇事件。

          4.Phase events(階段事件)

          這個事件是為了捕捉一些階段和過程而設定的,有以下幾個階段可以捕捉:

          ANY_PHASE 任一階段
          APPLY_REQUEST_VALUES  請求處理階段的應用請求值階段
          INVOKE_APPLICATION 請求處理階段的調用程序階段
          PROCESS_VALIDATIONS 請求處理階段的處理驗證階段
          RENDER_RESPONSE  請求處理階段的描述響應階段
          RESTORE_VIEW 請求處理階段的恢復視圖階段
          UPDATE_MODEL_VALUES 請求處理階段的更新模型值階段

          具體可以參考http://java.sun.com/javaee/javaserverfaces/1.1_01/docs/api/javax/faces/event/PhaseId.html

          通過設定在實現類中設定相應的PhaseId以及添加到faces-config.xml中就可以捕捉相應階段事件并添加響應的代碼

          實現類

          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;//選擇事件標識的常量,此為任一階段
              }
              
          }

          在faces-config.xml中添加
          <lifecycle>
              
          <phase-listener>
                  net.javabeat.articles.jsf.events.actions.TestActionListener
              
          </phase-listener>
          </lifecycle>

          當然可以添加無限個的監聽器
          <lifecycle>
              
          <phase-listener>PhaseListener1</phase-listener>
              
          <phase-listener>PhaseListener2</phase-listener>
          </lifecycle>

          下面是請求處理的生命周期,大家可以直觀的看一下各個階段執行順序:
           
          各個階段的說明以及所能觸發的事件


          ---------------------------------------------------------
          專注移動開發

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2008-10-14 10:49 TiGERTiAN 閱讀(2375) 評論(0)  編輯  收藏 所屬分類: JavaJSF
          主站蜘蛛池模板: 武威市| 临颍县| 城口县| 白城市| 民和| 十堰市| 平舆县| 台东县| 尉氏县| 盱眙县| 临朐县| 永丰县| 重庆市| 砀山县| 潍坊市| 平顶山市| 土默特左旗| 洛隆县| 龙口市| 慈溪市| 漳平市| 益阳市| 沂源县| 三门县| 涞源县| 汉源县| 驻马店市| 宣化县| 吴川市| 汉沽区| 昭觉县| 卓资县| 武胜县| 沙雅县| 浦城县| 昌乐县| 衡南县| 平凉市| 安西县| 渭源县| 霍城县|