使用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提供了一套完整的验证框架,包括在客户端和服务器端执行的验证,开发者可以通过实现Validator接口或者使用@Validator注解来创建自定义验证器。 **四、导航** 导航是JSF中控制应用程序流程的重要部分。它决定了...
JSF提供了`javax.faces.event.FacesEvent`和`javax.faces.event.PhaseListener`接口来处理事件。 4. **渲染器实现**: 渲染器负责将组件转换为浏览器可以理解的标记。在JSF中,渲染器类需要实现`javax.faces....
- `UIViewRoot`类是如何管理组件树的。 - `FaceletViewHandlingStrategy`如何处理Facelets视图的创建和更新。 - `PhaseListener`如何在特定生命周期阶段执行操作。 **四、新特性示例** 1. **使用Facelets创建视图*...
- **数据绑定**:JSF使用EL(Expression Language)将组件属性与模型数据绑定,简化了数据的获取和设置。 - **事件处理**:JSF支持事件模型,允许组件触发和监听自定义事件。 - **国际化与本地化**:JSF内置了支持...
总的来说,JSF中文帮助文档涵盖了JSF框架的所有关键概念和技术,包括API详解、生命周期、组件使用、数据绑定、验证、导航等,对于希望在Java Web开发中使用JSF的开发者来说,是极具价值的学习资源。通过阅读和实践,...
3. **事件监听器**:在JSF中,事件监听器通过实现特定接口(如`javax.faces.event.ActionListener`或`javax.faces.event.PhaseListener`)来定义。监听器可以注册到组件、页面或者整个应用程序,以便在事件触发时...
9. **ExpressionLanguage (EL)**: JSF使用EL来访问bean的属性和方法,简化了视图和模型之间的交互。 10. **Ajax支持**: JSF 2.x增加了 partial page rendering和AJAX功能,允许部分刷新页面,提高用户体验。 通过...
开发者可以创建自己的TLD来扩展JSF的功能,或者封装复杂的业务逻辑为易于使用的标签。 **总结** JSF API是一个强大的工具集,它简化了Web应用的开发,提供了从视图到模型的直接数据绑定,以及丰富的组件库和自定义...
在JSF框架中,此模式用于动态创建对象,比如在生命周期管理中,LifeCycle接口的实现可能会根据配置使用不同的工厂方法来创建PhaseListener对象,这提供了更大的灵活性和可扩展性。 4. **State模式**: State模式...
这可以通过实现PhaseListener接口或使用`<f:actionListener>`、`<f:ajax>`来触发。 6. **渲染响应阶段(Render Response)**: 最后,JSF框架负责将模型数据转化为HTML响应,返回给客户端。组件的`rendered`属性在...
3. 控制器:JSF的控制器主要是通过Action事件和PhaseListener来实现的。当用户与界面交互时,JSF会触发相应的动作事件,执行相关的业务逻辑。 4. 组件树:JSF应用中的所有UI组件构成了一个组件树。每个组件都有自己...
JSF使用Expression Language (EL)来访问和操作后台bean中的数据。EL表达式在页面上引用bean的属性,如`${myBean.property}`。这使得数据绑定变得简单,也使得视图和模型之间的交互更加直观。 ## 五、JSF生命周期 ...
4. **JSF页面(.xhtml)**:源码可能包含了示例的JSF页面,展示了如何在表单中使用验证器,以及如何在提交时触发验证。 5. **事件处理**:JSF中的`PhaseListener`或`FacesContext`的生命周期方法可能被用来在特定...
通过`jsf-demo`项目,你可以学习如何组织JSF应用的结构,如何配置和使用JSF组件,以及如何处理用户输入和展示响应。同时,也可以深入了解JSF的事件处理、验证和转换机制,以及与后端数据库的交互方式。这个练习项目...
6. **EL(Expression Language)**:JSF使用EL来访问后台bean的属性和方法,简化了数据绑定。EL表达式可以在JSP或Facelets页面中嵌入,允许直接访问和操作应用程序的模型层。 7. **JSF和Ajax的性能优化**:尽管JSF...
JSF使用统一的表达式语言(EL,Expression Language),允许在JSP或Facelets中直接引用bean的属性和方法。EL简化了数据访问和方法调用,例如`${myBean.property}`可以获取`myBean`对象的`property`属性值。 8. ** ...
同时,JSF提供了事件处理机制,使得组件间的交互更加灵活,比如通过`ActionEvent`和`PhaseListener`实现业务逻辑的触发和页面流程的控制。 总之,JSF提供了一套完整的框架来构建MVC架构的Web应用,它简化了开发流程...
4. **视图和模型分离**:JSF使用JSP或Facelets作为视图技术,允许开发者使用EL(Expression Language)表达式与后端模型数据进行交互,实现视图和模型的解耦。 5. **可扩展性**:JSF允许开发者创建自定义组件、渲染...
此外,了解JSF的核心概念,如组件树、生命周期、EL表达式以及 Managed Beans,是成为一名熟练的JSF开发者的基础。对于那些喜欢探索源码和工具的IT专业人士来说,研究`web.xml`的配置以及JSF框架的工作原理是提升技能...