从JSF的切入点控制JSF

开发 后端
本文介绍从JSF的切入点控制JSF,以及介绍怎么切入JSF的生命周期呢?JSF提供了很多方法。

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.    
  11. ublic class MyActionListener implements javax.faces.event.ActionListener {    
  12.     
  13.    public void processAction(ActionEvent actionEvent) throws AbortProcessingException {    
  14.        FacesContext context = FacesContext.getCurrentInstance();      
  15.         Application application = context.getApplication();      
  16.     
  17.         ELContext elContext = context.getELContext();    
  18.         ExpressionFactory ef = context.getApplication().getExpressionFactory();    
  19.               
  20.         MethodExpression me = ef.createMethodExpression(elContext, "托管bean的方法", Void.TYPE, null);    
  21.             
  22.         String outcome = null;  //<from-outcome>outcome</from-outcome>      
  23.             
  24.        try{    
  25.             me.invoke(elContext, null);    
  26.           }catch(ELException elexp){    
  27.            Throwable wrapped = elexp.getCause();    
  28.             wrapped.printStackTrace();    
  29.           }    
  30.              
  31.        NavigationHandler navigationHandler = application.getNavigationHandler();      
  32.         navigationHandler.handleNavigation(context, null, outcome);      
  33.               
  34.         //Render Response if needed      
  35.         context.renderResponse();      
  36.             
  37.    }    
  38.     
  39.  }   

【编辑推荐】

  1. JSF和Tapestry全面比较
  2. 开发自定义JSF组件
  3. 简述学习JSF小记
  4. JSF图形组件管理图形bean组件
  5. Seam与JSF的加减法
责任编辑:佚名 来源: 电子工业出版社
相关推荐

2009-09-23 17:56:45

JSF入门

2022-02-09 09:08:20

XDR安全运营网络安全

2015-08-13 09:55:22

大数据

2009-06-26 11:15:08

JSF入手JSP

2009-06-11 11:22:40

JSFJSPJSF的UI组件

2009-06-26 13:48:57

G4JSFGWTJSF

2009-06-26 14:06:08

JSF基础框架

2009-06-22 15:39:45

JSFGlassFish管理

2009-06-17 15:18:38

JSF与Spring

2009-06-23 13:21:26

JSF和Spring

2009-06-25 13:03:48

JSF的UI组件

2009-06-29 13:22:19

JSF技术JSF组件

2009-06-22 16:42:26

JSF的工作方式

2009-06-24 13:06:41

JSF组件Facelets

2009-06-23 17:38:57

ExternalConJSF

2009-06-24 11:39:45

学习JSF

2009-06-22 13:27:01

JSF组件模型

2009-06-29 09:00:14

JSFJava

2009-06-23 09:53:10

JSF程序配置

2009-06-22 14:22:41

JSF和Tapestr
点赞
收藏

51CTO技术栈公众号