如何调试 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 让<ui:debug>
工作(对于工作的一个相当可悲的定义)
嗨,BalusC,我想问一个类似的问题,但最好只是在这里发布......我在你的博客上关注了你的 Debug JSF lifecycle
文章。除了您在此处和那篇文章中建议的调试机制之外,是否可以深入研究 JSF 实现源代码?我对标签的看法有问题。渲染不如预期,我无法解释为什么会这样。我正在考虑深入研究 JSF 源代码。这是否有意义,如果可以,您能否指出我开始使用的资源?
@Murat:从所需 UIComponent
类的 encodeAll()
方法上的断点开始。
嗨 BalusC,我已经尝试了您在此处提供的步骤,但它不起作用。我把 如果您确实遇到问题,那么如果您可以获得 EL 实现的源代码(对于 RI 来说足够简单),那么您可以使用 Eclipse 在 EL 实现方法中设置断点。您需要了解 EL 代码的工作原理,但它并不那么复杂。但不适合胆小的人。
另一种可能性是以编程方式创建和评估 EL。有一些关于如何做到这一点的例子。然后,您可以使用调试器来摆弄表达式是什么以及结果是什么,直到找出问题所在。
【讨论】:
以上是关于如何调试 JSF/EL的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JSF EL 中显示 List#size() 的值?
org.springframework.web.jsf.el.SpringBeanFacesELResolver 类必须扩展 javax.el.ELResolver 类型