<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 5,  comments - 7,  trackbacks - 0

    JSF的一個(gè)核心就是事件與監(jiān)聽(tīng)。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)部通過(guò)參數(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)配置過(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接口:

    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è)事件是為了捕捉一些階段和過(guò)程而設(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

    通過(guò)設(shè)定在實(shí)現(xiàn)類(lèi)中設(shè)定相應(yīng)的PhaseId以及添加到faces-config.xml中就可以捕捉相應(yīng)階段事件并添加響應(yīng)的代碼

    實(shí)現(xiàn)類(lèi)

     

    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)然可以添加無(wú)限個(gè)的監(jiān)聽(tīng)器

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


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

    posted on 2008-11-23 00:37 Vincent-chen 閱讀(363) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): JSF
    主站蜘蛛池模板: 白白色免费在线视频| 久久久久亚洲av无码专区蜜芽 | 亚洲日本天堂在线| 亚洲制服在线观看| 亚洲av成人一区二区三区| 激情亚洲一区国产精品| 国产成人亚洲综合一区| 亚洲乱色伦图片区小说| 国产精品亚洲精品日韩动图| 日本系列1页亚洲系列| 二级毛片免费观看全程| 国产精品黄页免费高清在线观看| eeuss影院免费直达入口| 三年在线观看免费观看完整版中文| 99re6在线视频精品免费| 欧洲精品99毛片免费高清观看| 95老司机免费福利| 国内精品免费麻豆网站91麻豆| 91免费资源网站入口| 日本特黄特色免费大片| 国产亚洲福利一区二区免费看| 亚洲国产精品成人AV无码久久综合影院| 亚洲国产成人精品无码久久久久久综合 | 全黄性性激高免费视频| 亚洲国产成人精品91久久久| 婷婷亚洲天堂影院| 中文字幕精品亚洲无线码二区| 亚洲Av熟妇高潮30p| 亚洲国产av一区二区三区丶| 亚洲av无码专区亚洲av不卡| 一级做α爱过程免费视频| 色www永久免费网站| 最近免费视频中文字幕大全| 全免费a级毛片免费看不卡| 亚洲日本一区二区一本一道| 亚洲视频免费在线观看| 亚洲精品无码人妻无码| 国产精品青草视频免费播放| 国产免费丝袜调教视频| 免费在线观看黄网站| 久久国产亚洲观看|