`
withyou
  • 浏览: 454942 次
社区版块
存档分类
最新评论

使用PhaseListener 来打印JSF组件树 (示例)

阅读更多

使用PhaseListener 来打印JSF组件树 (示例)

作者: cschalk http://jroller.com/page/cschalk?entry=a_jsf_phaselistener_to_print

翻译: icess http://blog.matrix.org.cn/page/icess

 你是否想知道在你的页面中到底有什么标签在组件树中.

我也想知道,所以我写了一个简单的 PhaseListener,用她把组件树输出到控制台.

使用的算法是递归打印组件树.

下面是代码:

package componentstuff;

import java.util.ArrayList;
import java.util.List;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

public class PrintComponentTree implements PhaseListener {
  public PrintComponentTree() {
  }

  public int indent = 0;
  public static final int INDENTSIZE = 2;

  public void beforePhase(PhaseEvent PhaseEvent) {
  }

  public void afterPhase(PhaseEvent PhaseEvent) {
    System.out.println("");
    System.out.println("(Rendering Component Tree)");
    printComponentTree(FacesContext.getCurrentInstance().getViewRoot());
  }

  public PhaseId getPhaseId() {
    return PhaseId.RENDER_RESPONSE;    
  }
  
  public void printComponentTree(UIComponent comp){
    printComponentInfo(comp);
    
    List complist = (ArrayList)comp.getChildren();
    if (complist.size()>0)
      indent++;
    for   (int i = 0; i < complist.size(); i++) {
      UIComponent uicom = (UIComponent) complist.get(i);
      printComponentTree(uicom);
      if (i+1 == complist.size())
        indent--;
    }
    
  }

  public void printComponentInfo(UIComponent comp){
  
   if (comp.getId() == null){
     System.out.println("UIViewRoot" + " " + "(" + comp.getClass().getName() + ")");
   } else {
       printIndent();
       System.out.println("|");
       printIndent();
       System.out.println(comp.getId() + " " + "(" + comp.getClass().getName() + ")");
     }  
  }
 
  public void printIndent(){
    for (int i=0; i<indent; i++ )  
      for (int j=0;j<INDENTSIZE; j++)  
        System.out.print(" ");          
  }  
}

还有,不要忘了在 faces-config中注册listener..

  <lifecycle>
    <phase-listener>componentstuff.PrintComponentTree</phase-listener>
  </lifecycle>

下面是一个示例输出:

06/03/03 17:26:39 (Rendering Component Tree)
06/03/03 17:26:39 UIViewRoot (javax.faces.component.UIViewRoot)
06/03/03 17:26:39   |
06/03/03 17:26:39   form1 (javax.faces.component.html.HtmlForm)
06/03/03 17:26:39     |
06/03/03 17:26:39     panelGrid1 (javax.faces.component.html.HtmlPanelGrid)
06/03/03 17:26:39       |
06/03/03 17:26:39       outputLabel1 (javax.faces.component.html.HtmlOutputLabel)
06/03/03 17:26:39       |
06/03/03 17:26:39       inputText1 (javax.faces.component.html.HtmlInputText)
06/03/03 17:26:39       |
06/03/03 17:26:39       outputLabel2 (javax.faces.component.html.HtmlOutputLabel)
06/03/03 17:26:39       |
06/03/03 17:26:39       inputSecret1 (javax.faces.component.html.HtmlInputSecret)
06/03/03 17:26:39       |
06/03/03 17:26:39       commandButton1 (javax.faces.component.html.HtmlCommandButton)
讨论

Feel free to tweak the code however you like!

分享到:
评论

相关推荐

    JSF框架使用示例.rar_JSF

    JSF提供了一套完整的验证框架,包括在客户端和服务器端执行的验证,开发者可以通过实现Validator接口或者使用@Validator注解来创建自定义验证器。 **四、导航** 导航是JSF中控制应用程序流程的重要部分。它决定了...

    JSF2.0实战 - 4、自定义组件

    JSF提供了`javax.faces.event.FacesEvent`和`javax.faces.event.PhaseListener`接口来处理事件。 4. **渲染器实现**: 渲染器负责将组件转换为浏览器可以理解的标记。在JSF中,渲染器类需要实现`javax.faces....

    jsf 2.0(jar+源码+api+新特性示例)

    - `UIViewRoot`类是如何管理组件树的。 - `FaceletViewHandlingStrategy`如何处理Facelets视图的创建和更新。 - `PhaseListener`如何在特定生命周期阶段执行操作。 **四、新特性示例** 1. **使用Facelets创建视图*...

    jsf1.2 source code

    - **数据绑定**:JSF使用EL(Expression Language)将组件属性与模型数据绑定,简化了数据的获取和设置。 - **事件处理**:JSF支持事件模型,允许组件触发和监听自定义事件。 - **国际化与本地化**:JSF内置了支持...

    jsf 中文帮助文档

    总的来说,JSF中文帮助文档涵盖了JSF框架的所有关键概念和技术,包括API详解、生命周期、组件使用、数据绑定、验证、导航等,对于希望在Java Web开发中使用JSF的开发者来说,是极具价值的学习资源。通过阅读和实践,...

    第8章 JSF事件处理(熊)课件及示例程序

    3. **事件监听器**:在JSF中,事件监听器通过实现特定接口(如`javax.faces.event.ActionListener`或`javax.faces.event.PhaseListener`)来定义。监听器可以注册到组件、页面或者整个应用程序,以便在事件触发时...

    jsf2.1.9源码

    9. **ExpressionLanguage (EL)**: JSF使用EL来访问bean的属性和方法,简化了视图和模型之间的交互。 10. **Ajax支持**: JSF 2.x增加了 partial page rendering和AJAX功能,允许部分刷新页面,提高用户体验。 通过...

    JSF api,很详细,很全

    开发者可以创建自己的TLD来扩展JSF的功能,或者封装复杂的业务逻辑为易于使用的标签。 **总结** JSF API是一个强大的工具集,它简化了Web应用的开发,提供了从视图到模型的直接数据绑定,以及丰富的组件库和自定义...

    JSF框架中使用的设计模式介绍

    在JSF框架中,此模式用于动态创建对象,比如在生命周期管理中,LifeCycle接口的实现可能会根据配置使用不同的工厂方法来创建PhaseListener对象,这提供了更大的灵活性和可扩展性。 4. **State模式**: State模式...

    jsf生命周期和一部分标签介绍

    这可以通过实现PhaseListener接口或使用`&lt;f:actionListener&gt;`、`&lt;f:ajax&gt;`来触发。 6. **渲染响应阶段(Render Response)**: 最后,JSF框架负责将模型数据转化为HTML响应,返回给客户端。组件的`rendered`属性在...

    JSF帮助文档

    3. 控制器:JSF的控制器主要是通过Action事件和PhaseListener来实现的。当用户与界面交互时,JSF会触发相应的动作事件,执行相关的业务逻辑。 4. 组件树:JSF应用中的所有UI组件构成了一个组件树。每个组件都有自己...

    JSF教程

    JSF使用Expression Language (EL)来访问和操作后台bean中的数据。EL表达式在页面上引用bean的属性,如`${myBean.property}`。这使得数据绑定变得简单,也使得视图和模型之间的交互更加直观。 ## 五、JSF生命周期 ...

    jsf-validation.zip_JSF_jsf validation_zip

    4. **JSF页面(.xhtml)**:源码可能包含了示例的JSF页面,展示了如何在表单中使用验证器,以及如何在提交时触发验证。 5. **事件处理**:JSF中的`PhaseListener`或`FacesContext`的生命周期方法可能被用来在特定...

    jsf-demo练兵

    通过`jsf-demo`项目,你可以学习如何组织JSF应用的结构,如何配置和使用JSF组件,以及如何处理用户输入和展示响应。同时,也可以深入了解JSF的事件处理、验证和转换机制,以及与后端数据库的交互方式。这个练习项目...

    Apress.Pro.JSF.and.Ajax.pdf

    6. **EL(Expression Language)**:JSF使用EL来访问后台bean的属性和方法,简化了数据绑定。EL表达式可以在JSP或Facelets页面中嵌入,允许直接访问和操作应用程序的模型层。 7. **JSF和Ajax的性能优化**:尽管JSF...

    jsf api

    JSF使用统一的表达式语言(EL,Expression Language),允许在JSP或Facelets中直接引用bean的属性和方法。EL简化了数据访问和方法调用,例如`${myBean.property}`可以获取`myBean`对象的`property`属性值。 8. ** ...

    JSF技术总结文档.doc

    同时,JSF提供了事件处理机制,使得组件间的交互更加灵活,比如通过`ActionEvent`和`PhaseListener`实现业务逻辑的触发和页面流程的控制。 总之,JSF提供了一套完整的框架来构建MVC架构的Web应用,它简化了开发流程...

    jsf完全参考手册源代码

    4. **视图和模型分离**:JSF使用JSP或Facelets作为视图技术,允许开发者使用EL(Expression Language)表达式与后端模型数据进行交互,实现视图和模型的解耦。 5. **可扩展性**:JSF允许开发者创建自定义组件、渲染...

    JSF日记

    此外,了解JSF的核心概念,如组件树、生命周期、EL表达式以及 Managed Beans,是成为一名熟练的JSF开发者的基础。对于那些喜欢探索源码和工具的IT专业人士来说,研究`web.xml`的配置以及JSF框架的工作原理是提升技能...

Global site tag (gtag.js) - Google Analytics