如何调试 JSF/EL

Posted

技术标签:

【中文标题】如何调试 JSF/EL【英文标题】:how to debug JSF/EL 【发布时间】:2012-01-06 04:57:48 【问题描述】:

如何在JSF页面调试EL?我想看变量值,函数调用等等。最好的解决方案是 Eclipse 插件,但任何其他可能性都比猜测“为什么这个表达式无法正确呈现?”更好。

【问题讨论】:

【参考方案1】:

在 JSF/Facelets 中最接近的是将<ui:debug /> 放置在视图中的某处:

<ui:debug />

按下 CtrlShiftD 应该会显示一个弹出窗口,其中包含有关组件树和所有可用请求参数和请求/视图的调试信息/flash/session/application 范围的变量。它基本上代表了所有这些地图的内容。

热键可以通过hotkey 属性进行配置,因此当它与浏览器默认热键冲突时,您可以选择另一个,就像在 Firefox 中一样; CtrlShiftD 默认会显示添加书签对话框。以下是如何让它在 CtrlShiftX 上收听:

<ui:debug hotkey="x" />

你通常也想在非开发阶段隐藏它,所以添加这样的渲染条件:

<ui:debug hotkey="x" rendered="#facesContext.application.projectStage == 'Development'" />

在显示的调试信息中,提供的有关作用域变量的信息并不像您期望的那么好。它只显示默认为com.example.Bean@hashcode 的所有作用域变量的Object#toString() 结果。您不能像在 Eclipse 调试器的调试视图中那样直接探索它们的属性和它们的属性值。您需要相应地在类上实现toString(),以便返回尽可能多的相关信息(如果需要,您甚至可以让 Eclipse 通过右键单击源代码 > Source > Generate toString() 自动生成它 em>):

@Override
public String toString() 
    return String.format("Bean[prop1=%s,prop2=%s,prop3=%s]", prop1, prop2, prop3);

对于方法调用,只需按照通常的方式在 Java 源代码上放置一个断点即可。当 EL 调用该方法时,Eclipse 也会在那里启动。如果它是一个托管 bean,您也只会在 Eclipse 调试器中看到它的属性。

【讨论】:

最后我使用普通的eclipse调试器结束ui:debug. +1 让&lt;ui:debug&gt; 工作(对于工作的一个相当可悲的定义) 嗨,BalusC,我想问一个类似的问题,但最好只是在这里发布......我在你的博客上关注了你的 Debug JSF lifecycle 文章。除了您在此处和那篇文章中建议的调试机制之外,是否可以深入研究 JSF 实现源代码?我对标签的看法有问题。渲染不如预期,我无法解释为什么会这样。我正在考虑深入研究 JSF 源代码。这是否有意义,如果可以,您能否指出我开始使用的资源? @Murat:从所需 UIComponent 类的 encodeAll() 方法上的断点开始。 嗨 BalusC,我已经尝试了您在此处提供的步骤,但它不起作用。我把 代码。我做错什么了吗?【参考方案2】:

如果您确实遇到问题,那么如果您可以获得 EL 实现的源代码(对于 RI 来说足够简单),那么您可以使用 Eclipse 在 EL 实现方法中设置断点。您需要了解 EL 代码的工作原理,但它并不那么复杂。但不适合胆小的人。

另一种可能性是以编程方式创建和评估 EL。有一些关于如何做到这一点的例子。然后,您可以使用调试器来摆弄表达式是什么以及结果是什么,直到找出问题所在。

【讨论】:

以上是关于如何调试 JSF/EL的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSF EL 中显示 List#size() 的值?

如何在 JSF EL 中创建一个数组?

org.springframework.web.jsf.el.SpringBeanFacesELResolver 类必须扩展 javax.el.E​​LResolver 类型

JSF2 - javax.el.PropertyNotFoundException。不使用方法

在 JavaScript 文件中混合 JSF EL

在 Eclipse 中显示 JSF EL 调用层次结构