`
windywindy
  • 浏览: 169423 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

从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实现。
<context-param>
  <param-name>javax.faces.LIFECYCLE_ID</param-name>
  <param-value>yourself.LifecyleImpl</param-value>
</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我们需要监视它的生命周期。
<lifecycle>
<phase-listener>yourself.YourPhaseListener</phase-listener>
</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中的事件处理方法),并对其返回值做出画面迁移处理和其他你自己的处理等。

一个典型的实现代码为:
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;

public 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();  
		
	}

}
分享到:
评论
1 楼 cqzs19871202 2010-08-17  
从Lifecycle切入
我按照你说的部署后,报错说Cant create Lifecycle for id: MyLifecycle.,是还有什么需要做的吗?

相关推荐

    JSF1.2 jar包和相关doc

    这个生命周期为开发者提供了多个切入点进行自定义操作。 3. **表达式语言(EL)**:JSF 1.2使用了JavaServer Pages Expression Language(EL),这是一种简洁的表达式语言,用于在JSP页面中访问JavaBeans属性和其他...

    Spring Framework 2.5

    - **支持 bean 名称切入点元素**:允许使用 bean 名称作为切入点的一部分,为编写更细粒度的切面提供了可能。 - **支持 AspectJ 加载时编织**:通过编译期或运行期的编织,可以实现对现有代码的无侵入增强,进一步...

    Spring.in.Action.2nd.pdf

    Spring AOP提供了强大的支持,允许开发者定义切入点和通知,从而在不修改原有代码的情况下,增加或修改功能。这种机制提高了代码的复用性和灵活性。 ### 数据访问与集成 Spring框架提供了一系列的数据访问抽象层,...

    java J2EE面试题集

    - **AOP(Aspect-Oriented Programming)**:了解切面、通知、切入点表达式,以及如何实现日志记录、事务管理等功能。 - **Spring MVC**:熟悉DispatcherServlet、ModelAndView、Controller等概念,能构建Spring ...

    spring reference2.5

    - **支持bean name切入点元素**:引入了新的切入点元素,方便指定特定Bean为目标对象。 - **支持AspectJ运行时织入**:通过使用AspectJ的运行时织入机制,可以在不修改源代码的情况下添加横切关注点。 **2.4 中间层...

    spring reference

    - **支持bean name切入点元素**:新增支持bean name作为切入点,提高了配置的灵活性。 - **支持AspectJ运行时织入**:引入了对AspectJ运行时织入的支持,使得切面能够在运行时动态加载。 ##### 3. 中间层技术 - **...

    Spring中文帮助文档

    6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入(Introduction) 6.2.6. 切面实例化模型 6.2.7. 例子 6.3. 基于Schema的AOP支持 6.3.1. 声明一个切面 6.3.2. 声明一个切入点 6.3.3. 声明...

    Spring API

    6.2.3. 声明一个切入点(pointcut) 6.2.4. 声明通知 6.2.5. 引入(Introduction) 6.2.6. 切面实例化模型 6.2.7. 例子 6.3. 基于Schema的AOP支持 6.3.1. 声明一个切面 6.3.2. 声明一个切入点 6.3.3. 声明...

    Pro Spring 3

    - **核心组件**:AOP的核心组件包括切面(Aspect)、连接点(Join Point)、通知(Advice)和切入点(Pointcut)等。 - **实践应用**:在Spring框架中,AOP可以用来实现日志记录、性能监控、事务管理等功能,这些...

    Spring2.0开发手册

    切面通过定义切入点和通知来实现。 4. **Bean管理**:Spring容器管理着应用程序中的对象,称为bean。开发者可以通过XML配置或Java配置来定义bean及其依赖关系。此外,还支持各种作用域,如单例、原型、请求和会话等...

    Spring2.5-中文参考手册

    Spring的AOP支持通过定义切面、通知(advisors)和切入点(pointcuts)来实现这些关注点的分离。 3. **容器管理**:Spring容器(如ApplicationContext)负责创建、配置和管理Bean。Bean可以通过XML配置、注解或者...

    跟我学spring

    6.1节介绍AOP基础,6.2节展示一个简单的AOP示例,6.3节和6.4节分别讨论基于Schema和基于@AspectJ的AOP实现,6.5节解释AspectJ切入点语法,6.6节和6.7节探讨通知参数和通知顺序,6.8节讨论切面实例化模型,最后6.9节...

    Oracle guide_Spring2.5_CN_reference_pdf

    开发者可以定义切面、通知类型(前置、后置、异常、环绕等)以及切入点表达式,实现代码的解耦。 3. **事务管理(Transaction Management)**:Spring提供了声明式和编程式两种事务管理方式。声明式事务管理通过在...

    spring 3前6 章

    本章将介绍AOP的基本概念,如切面、通知(advisors)、连接点(join points)、切入点(pointcuts)等,并演示如何创建和使用自定义的切面。此外,还会讨论Spring AOP与AspectJ的集成,后者提供了更强大的AOP支持。 ...

    跟我学spring3

    在AOP方面,Spring3提供了更丰富的通知类型和更强大的切入点表达式,增强了切面的灵活性。 在依赖注入方面,Spring3强化了注解配置,使得开发者可以避免XML配置的繁琐,通过在类和方法上添加注解就能完成组件的配置...

    Spring2.5-Reference_zh_CN.txt

    - **AOP实现**:Spring支持基于XML和注解的方式定义AOP切面,并提供了强大的切入点表达式语言。 - **@AspectJ支持**:Spring 2.5还支持使用@AspectJ注解编写切面类,这种方式更加灵活。 #### 六、数据访问支持 - **...

    spring2.5.6jar包

    在2.5.6版本中,SpEL主要用于XML配置中的属性绑定和AOP的切入点表达式。 8. **单元测试**:Spring提供了JUnit支持,可以方便地创建和运行基于Spring的应用的单元测试,例如使用Mockito进行模拟对象的创建。 9. **...

Global site tag (gtag.js) - Google Analytics