溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么從JSF的切入點(diǎn)控制JSF

發(fā)布時(shí)間:2021-12-14 10:45:03 來(lái)源:億速云 閱讀:145 作者:柒染 欄目:編程語(yǔ)言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)怎么從JSF的切入點(diǎn)控制JSF,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

JSF框架是一個(gè)非常靈活功能非常強(qiáng)大的框架。它的每一個(gè)組成部分幾乎都是可替換的—可以使用用戶自定義的功能實(shí)現(xiàn)替換其默認(rèn)實(shí)現(xiàn)。同時(shí)提供了很多切入點(diǎn)(可插入機(jī)制,類似插件概念),以供用戶控制JSF的生命周期各種不同階段來(lái)達(dá)到自己的目的。下面介紹幾種常見的控制JSF生命周期的切入點(diǎn)。

我們知道JSF把整個(gè)生命周期劃分成了6個(gè)階段,具體為:restore view(重載視圖)階段,apply request value(應(yīng)用請(qǐng)求值)階段,process validation(合法性檢查)階段,update model value(更新模型值)階段,invork application(事件處理)階段,render(畫面重畫)階段。

怎么切入JSF的生命周期呢?JSF提供了很多方法:

1、從Lifecycle切入。
Lifecycle就是JSF生命周期的控制中心,相當(dāng)于人的心臟,它的重要性和位置可想而知。在Lifecycle里,主要負(fù)責(zé)調(diào)用上面提到的生命周期的6個(gè)階段的處理。就是這么重要的控制中心,JSF也提供了切入方法以讓我們完全替代它。

1)首先,需要在web.xml里定義以下內(nèi)容,讓JSF知道你要使用你自己的Lifecyle實(shí)現(xiàn),而不是默認(rèn)的Lifecycle實(shí)現(xiàn)。

<context-param> 

  <param-name>javax.faces.LIFECYCLE_ID</param-name> 

  <param-value>yourself.LifecyleImpl</param-value> 

</context-param> 

2)上面提到的yourself.LifecyleImpl便是你自己的Lifecyle實(shí)現(xiàn),它必須從javax.faces.lifecycle.Lifecycle虛擬類繼承并實(shí)現(xiàn)其中的虛擬方法。

因?yàn)镴SF提供了很多其他方法來(lái)讓你控制JSF,所以除非特別需要,不建議從Lifecyle的實(shí)現(xiàn)直接控制JSF。

2、 從PhaseListener切入。
PhaseListener,簡(jiǎn)單說(shuō)來(lái)就是對(duì)上述6個(gè)階段進(jìn)行監(jiān)聽的切入點(diǎn)。我們可以通過以下步驟實(shí)現(xiàn):
1)在JSF的配置文件如faces-config.xml里對(duì)phase-listener加以配置,告訴JSF我們需要監(jiān)視它的生命周期。

<lifecycle> 

<phase-listener>yourself.YourPhaseListener</phase-listener> 

</lifecycle>  

2)yourself.YourPhaseListener就是你自己的phase-listener實(shí)現(xiàn)。它必須實(shí)現(xiàn)javax.faces.event.PhaseListener接口。它提供了3個(gè)方法,讓你完成你想要做的事情:

public void beforePhase(PhaseEvent phaseEvent):在每個(gè)階段處理之前被調(diào)用
public void afterPhase(PhaseEvent phaseEvent):在每個(gè)階段處理之后被調(diào)用
public PhaseId getPhaseId():告訴JSF你要監(jiān)視哪個(gè)phase。可以指定一個(gè),或全部階段。


3、 從ActionListener切入。
當(dāng)一個(gè)按鈕被按下,或者命令聯(lián)結(jié)被點(diǎn)擊時(shí),JSF會(huì)在invork application階段的broadcast event時(shí)通過ActionListener調(diào)用事先綁定的事件處理方法。如果有用戶自定義的ActionListener時(shí),JSF將使用用戶自定義ActionListener來(lái)代替默認(rèn)的ActionListener。

用戶自定義ActionListener必須實(shí)現(xiàn)javax.faces.event.ActionListener接口,并實(shí)現(xiàn)其接口方法:public void processAction(ActionEvent actionEvent)。注意,在這個(gè)實(shí)現(xiàn)方法里,必須調(diào)用控件的事件處理方法(JSF Backing Bean中的事件處理方法),并對(duì)其返回值做出畫面遷移處理和其他你自己的處理等。

import javax.el.ELContext;    
import javax.el.ELException;    
import javax.el.ExpressionFactory;    
import javax.el.MethodExpression;    
import javax.faces.application.Application;    
import javax.faces.application.NavigationHandler;    
import javax.faces.context.FacesContext;    
import javax.faces.event.AbortProcessingException;    
import javax.faces.event.ActionEvent;    
   
ublic class MyActionListener implements javax.faces.event.ActionListener {    
    
   public void processAction(ActionEvent actionEvent) throws AbortProcessingException {    
       FacesContext context = FacesContext.getCurrentInstance();      
        Application application = context.getApplication();      
    
        ELContext elContext = context.getELContext();    
        ExpressionFactory ef = context.getApplication().getExpressionFactory();    
              
        MethodExpression me = ef.createMethodExpression(elContext, "托管bean的方法", Void.TYPE, null);    
            
        String outcome = null;  //<from-outcome>outcome</from-outcome>      
            
       try{    
            me.invoke(elContext, null);    
          }catch(ELException elexp){    
           Throwable wrapped = elexp.getCause();    
            wrapped.printStackTrace();    
          }    
             
       NavigationHandler navigationHandler = application.getNavigationHandler();      
        navigationHandler.handleNavigation(context, null, outcome);      
              
        //Render Response if needed      
        context.renderResponse();      
            
   }    
    
 }

上述就是小編為大家分享的怎么從JSF的切入點(diǎn)控制JSF了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jsf
AI