如何从cfWindow中获取调试信息

时间:2014-06-12 15:03:38

标签: java coldfusion coldfusion-9

我们决定使用cfWindows作为模态对话框。这是无法改变的,因此“使用其他框架”的答案和评论无法解决问题。

虽然我们已经为我们的IP地址启用了调试,并且调试信息在普通页面上显示正常,但cfWindows中没有显示任何内容。今天我开始尝试重新创建调试信息并手动将其写入窗口HTML。我首先在onRequestEnd中使用以下代码,它在正常调用的页面上运行良好:

<cfset tempFactory = createObject("java", "coldfusion.server.ServiceFactory")>
<cfset tempCfdebugger = tempFactory.getDebuggingService()>
<cfset qEvents = tempCfdebugger.getDebugger().getData()>

在花时间根据需要格式化输出后,我终于在cfWindow上尝试了这个。但是,我在第三行代码中收到以下错误:

Detail  Its possible that a method called on a Java object created by CreateObject returned null.
ErrNumber   0
Message     Value must be initialized before use.

这意味着不仅CF设置为不在cfWindows中显示调试信息,而且在cfWindows的情况下,提供调试信息的Java元素的工作方式不同。我对底层Java了解甚少,我发布的代码是前一段时间从CF博客中提取的,所以我不确定如何解决这个问题。

是否可以获取cfWindow中调用的页面的调试信息?如果是这样,怎么样?

修改

为了跟进评论中的建议,我尝试在自己的浏览器窗口中打开CFWindow模板。调试信息正常显示。然后我尝试CFDumping上面列出的三行中的每一行的结果。前两个工作。 “tempCfdebugger”变量确实包含一个名为“getDebugger()”的函数。问题似乎是在CFWindow中调用该函数时。服务器必须以某种方式以不同的方式解释CFWindow请求。

除了连接到ServiceFactory之外,是否有其他方法来获取此调试信息?

1 个答案:

答案 0 :(得分:1)

我将奖励给Scott,因为他正确地提出了解决原始问题的_cf_nodebug url变量。但是,我想在这里发布一个更完整的答案。

通过在调用时将_cf_nodebug = true附加到url,我们可以在cfWindow中获取完整的调试信息,这是正确的(虽然我不清楚给定变量名称的逻辑)。这解决了原始问题中所述的问题,并且很容易添加到我们的cf_window自定义标记中;非常感谢斯科特。但是,由于我们实际上试图从所有cfWindow交互中获取调试信息,包括AJAX请求,因此我的措辞很差。这最终是一个两阶段的修复,_cf_nodebug负责第一阶段。

虽然我们现在能够从cfWindow的初始加载中获取调试信息,但我们还需要修改cfc以报告查询的详细信息。我找不到允许我们从cfc访问serviceFactory的url变量,但鉴于它是一个cfc,并且基本上只是一个密集的查询集合,我能够将以下函数添加到组件中以重现一些所需的功能:

    <cffunction name="debugFunc" access="private" output="yes">
        <cfparam name="session.debugEnabled" default="false">
        <cfif session.debugEnabled>
            <cfoutput>
                <cfsavecontent variable="debugDetails">
                    Recordcount: #Request.getDataQueryResult.recordcount#<br>
                    Execution Time: #Request.getDataQueryResult.ExecutionTime#ms<br>
                    <cfif isDefined('Request.getDataQueryResult.sqlparameters')>
                        Params: #Request.getDataQueryResult.sqlparameters#<br>
                    </cfif>
                    <br>
                    #Request.getDataQueryResult.sql#
                </cfsavecontent>

                <script>
                    parent.cfWindowDebugDivAdd("cfWindow: #url.method#", "#ReplaceList(debugDetails, "#Chr(10)#,#Chr(13)#,""", " ")#");
                </script>
            </cfoutput>
        </cfif>
    </cffunction>

然后我在cfc中进行了搜索和替换,以修改100个左右的cfQuery标记的开头和结尾:

        <cfquery result="Request.getDataQueryResult" ...>
            ...
        </cfquery>
        <cfset debugFunc()>

这将查询信息存储在Request范围内的结构中,然后调用上面的调试函数来编写一些JS以将其传递回父页面。您所需要的只是父页面上的一个函数,用于获取调试信息并将其转储到div,span或浏览器控制台中。万一它可以帮助其他人,这是我用于测试的代码:

    <div id="cfWindowDebugDiv" style="width:1000px; height:300px; overflow:auto; text-align:left;"></div>

    <script>
        function cfWindowDebugDivAdd(heading, details) {
            $("#cfWindowDebugDiv").append("<b><u>" + heading + "</u></b><br>");
            $("#cfWindowDebugDiv").append(details + "<br><br><br><br>");
        }
    </script>