程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> 從JSF的切入點控制JSF

從JSF的切入點控制JSF

編輯:J2EE

JSF框架是一個非常靈活功能非常強大的框架。它的每一個組成部分幾乎都是可替換的—可以使用用戶自定義的功能實現替換其默認實現。同時提供了很多切入點(可插入機制,類似插件概念),以供用戶控制JSF的生命周期各種不同階段來達到自己的目的。
本文介紹幾種常見的控制JSF生命周期的切入點,希望能對大家理解JSF有點幫助。

我們知道JSF把整個生命周期劃分成了6個階段,具體為:restore vIEw(重載視圖)階段,apply request value(應用請求值)階段,process validation(合法性檢查)階段,update model value(更新模型值)階段,invork application(事件處理)階段,render(畫面重畫)階段。並在不同的階段完成不同的任務,這裡不對具體的任務作詳細描述了,以後,我們會在其他文章中加以介紹。

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

1、從Lifecycle切入。
Lifecycle就是JSF生命周期的控制中心,相當於人的心髒,它的重要性和位置可想而知。在Lifecycle裡,主要負責調用上面提到的生命周期的6個階段的處理。就是這麼重要的控制中心,JSF也提供了切入方法以讓我們完全替代它。

1)首先,需要在web.XML裡定義以下內容,讓JSF知道你要使用你自己的Lifecyle實現,而不是默認的Lifecycle實現。

  1. <context-param>
  2. <param-name>Javax.faces.LIFECYCLE_ID</param-name>
  3. <param-value>yourself.LifecyleImpl</param-value>
  4. </context-param>

2)上面提到的yourself.LifecyleImpl便是你自己的Lifecyle實現,它必須從Javax.faces.lifecycle.Lifecycle虛擬類繼承並實現其中的虛擬方法。

因為JSF提供了很多其他方法來讓你控制JSF,所以除非特別需要,不建議從Lifecyle的實現直接控制JSF。

2、 從PhaseListener切入。
PhaseListener,簡單說來就是對上述6個階段進行監聽的切入點。我們可以通過以下步驟實現:
1)在JSF的配置文件如faces-config.XML裡對phase-listener加以配置,告訴JSF我們需要監視它的生命周期。

  1. <lifecycle>
  2. <phase-listener>yourself.YourPhaseListener</phase-listener>
  3. </lifecycle>

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

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


3、 從ActionListener切入。
當一個按鈕被按下,或者命令聯結被點擊時,JSF會在invork application階段的broadcast event時通過ActionListener調用事先綁定的事件處理方法。如果有用戶自定義的ActionListener時,JSF將使用用戶自定義ActionListener來代替默認的ActionListener。

用戶自定義ActionListener必須實現Javax.faces.event.ActionListener接口,並實現其接口方法:public void processAction(ActionEvent actionEvent)。注意,在這個實現方法裡,必須調用控件的事件處理方法(JSF Backing Bean中的事件處理方法),並對其返回值做出畫面遷移處理和其他你自己的處理等。

  1. import Javax.el.ELContext;
  2. import Javax.el.ELException;
  3. import Javax.el.ExpressionFactory;
  4. import Javax.el.MethodExpression;
  5. import Javax.faces.application.Application;
  6. import Javax.faces.application.NavigationHandler;
  7. import Javax.faces.context.FacesContext;
  8. import Javax.faces.event.AbortProcessingException;
  9. import Javax.faces.event.ActionEvent;
  10. ublic class MyActionListener implements Javax.faces.event.ActionListener {
  11. public void processAction(ActionEvent actionEvent) throws AbortProcessingException {
  12. FacesContext context = FacesContext.getCurrentInstance();
  13. Application application = context.getApplication();
  14. ELContext elContext = context.getELContext();
  15. ExpressionFactory ef = context.getApplication().getExpressionFactory();
  16. MethodExpression me = ef.createMethodExpression(elContext, "托管bean的方法", Void.TYPE, null);
  17. String outcome = null; //<from-outcome>outcome</from-outcome>
  18. try{
  19. me.invoke(elContext, null);
  20. }catch(ELException elexp){
  21. Throwable wrapped = elexp.getCause();
  22. wrapped.printStackTrace();
  23. }
  24. NavigationHandler navigationHandler = application.getNavigationHandler();
  25. navigationHandler.handleNavigation(context, null, outcome);
  26. //Render Response if needed
  27. context.renderResponse();
  28. }
  29. }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved