3

我一直在尝试了解BalusC关于可调试性的答案,但我仍然无法准确弄清楚 jstl 标记如何比 scriptlet 更容易调试。

当我想到调试时,我想到的是单步执行代码并确定在任何给定点将哪些变量加载到内存中并查看其内容的能力。使用 jstl,我无法设置任何类型的断点,如果它的任何部分中断,我正在处理的任何形式的碎片都会丢失。我不确定哪个更糟:空白页面或半加载页面。我见过这样的情况:当 jstl 失败时,表单的其他部分会丢失,而不仅仅是它影响的部分。无论哪种情况,都无法真正看出问题所在。

使用 scriptlet,我可以放置断点,并在 IDE 中查看我想要的任何点。即使我没有使用这样的功能,我也可以将我想查看的任何部分程序打印到控制台,并在以后弄清楚。如果页面失败并显示一个空白页面,尽管这可能很烦人,我至少可以逐步找出它失败的确切行。

使用jstl,我完全处于黑暗之中。遍历一个集合真的感觉就像一个黑盒子,你希望一切都正常,而不是真正能够一步一步地观察它的发生。它让你感到无能为力。

我承认,jstl 更简洁,看起来更直观,但我遇到的一个明显问题是无法真正调试页面上的任何内容。我在这里完全错了吗?我只是错过了调试正在发生的事情的好方法吗?还是我的调试方法不正确,需要重新考虑?

我已经用谷歌搜索了这个问题,但我似乎无法找到任何直接的答案......如果有人对此有任何见解,那将非常有帮助。我想使用 jstl 代替 scriptlet,这是让我退缩的一个明显的事情......

4

2 回答 2

4

您可以添加 jsp scriptlet 并打印 jstl 使用的变量。这会打印在控制台或容器的输出文件中

    <c:set var="myVar" value='${param.myUrlParam}' />

    <% System.out.println(pageContext.findAttribute("myVar") ); %>

这是我能找到的调试 jstl 页面的唯一最佳方法。

于 2017-04-11T17:02:50.627 回答
1

如果您使用符合JSP/EL 规范JSTL 文档的 JSTL 标记,则它们本身不需要调试。在您找到的答案中,“可调试性”仅指用于业务逻辑的 Java 代码的上下文,需要用 Java 类(如 servlet、过滤器、实体或 EJB)替换,而不是用于表示逻辑的 Java 代码,需要被 JSTL 标记替换,例如if/else块、for循环、HTML 转义、日期/数字格式、字符串操作函数等。

但是,如果您遇到的问题已经找到了明显是 JSTL 标记的根本原因,那么如果您正确使用它们,请重新阅读JSTL 文档。您也可以使用以下模板转储感兴趣的 EL 变量:

<h2>Request headers</h2>
<dl>
    <c:forEach items="${headerValues}" var="entry">
        <dt><c:out value="${entry.key}" /></dt>
        <dd>
            <c:forEach items="${entry.value}" var="headerValue" varStatus="loop">
                <c:out value="${headerValue}" />${not loop.last ? ', ' : ''}
            </c:forEach>
        </dd>
    </c:forEach>
</dl>

<h2>Request params</h2>
<dl>
    <c:forEach items="${paramValues}" var="entry">
        <dt><c:out value="${entry.key}" /></dt>
        <dd>
            <c:forEach items="${entry.value}" var="paramValue" varStatus="loop">
                <c:out value="${paramValue}" />${not loop.last ? ', ' : ''}
            </c:forEach>
        </dd>
    </c:forEach>
</dl>

<h2>Request scope</h2>
<dl>
    <c:forEach items="${requestScope}" var="entry">
        <dt><c:out value="${entry.key}" /></dt>
        <dd><c:out value="${entry.value}" /></dd>
    </c:forEach>
</dl>

<h2>Session scope</h2>
<dl>
    <c:forEach items="${sessionScope}" var="entry">
        <dt><c:out value="${entry.key}" /></dt>
        <dd><c:out value="${entry.value}" /></dd>
    </c:forEach>
</dl>

<h2>Application scope</h2>
<dl>
    <c:forEach items="${applicationScope}" var="entry">
        <dt><c:out value="${entry.key}" /></dt>
        <dd><c:out value="${entry.value}" /></dd>
    </c:forEach>
</dl>

如有必要,您可以将其包装在某个弹出面板中,该面板通过访问密钥打开并且仅在开发模式期间呈现(Java EE 的 MVC 框架 JSF 的风格非常相似<ui:debug>)。

如果徒劳无功,请将问题确定为最小的 JSP 文件,该文件通过复制'n'paste'n'running 来重现整个问题(在这样的示例中,您可以将必要的业务逻辑和例如request.setAttribute()行放在一个脚本中放置在 JSP 文件的最顶部;这样的原型设计是scriptlet的合法用例之一)。

如果您仍然无法根据该 SSCCE 找出答案,请将其作为问题发布在 Stack Overflow 上。如果正确放置,您可能会在不到一天的时间内得到答案。如果它经常归结为简单的错字或语法/逻辑错误,请不要感到惊讶。

于 2013-03-28T16:57:30.207 回答