2013-03-27 397 views
2

我一直在试图了解关于可调试性的BalusC's answer,我仍然无法弄清楚jstl标签如何比scriptlet更容易调试。使用jstl进行调试 - 具体如何?

当我想到调试时,我想到了遍历代码并确定在任何给定点上哪些变量加载到内存中并查看其内容的能力。使用jstl,我不能设置任何类型的断点,并且如果它的任何部分断裂,我正在工作的任何表单都会丢失。我不确定哪个更糟:空白页面或半载页面。我已经看到了当jstl失败的情况下,表单的其他部分会丢失,而不仅仅是它影响的部分。无论哪种情况,都不可能真正看出问题所在。

使用scriptlets,我可以放置断点,并在IDE中查看我想要的任何点。即使我没有使用这样的功能,我也可以在控制台上打印任何我想查看的程序部分,并在以后找到它。如果页面失败,并显示一个空白页面,可能会很烦人,但我至少可以逐步浏览并找出错误的哪一行。

随着jstl,我完全处于黑暗中。通过集合迭代真的感觉就像一个黑盒子,你希望一切都好,而不是真的能够一步一步地看到它发生。它让你感到无力。我承认,jstl更干净,看起来更直观,但是我所遇到的一个明显问题是无法真正调试页面上的任何内容。我完全误解了吗?我只是错过了很好的方式来调试发生了什么?或者,我的调试方法不正确,需要重新考虑?

我已经搜索了这个问题,但我似乎无法得出任何直接的答案......如果有人对此有任何见解,这将是非常有帮助的。我想用jstl代替脚本,这是让我回不起来的一件事情...

+0

从BalusC的链接中回答:*可调试性:如果scriptlet中途抛出一个异常,您只能看到一个空白页*。这是他提到的唯一部分,从不谈论JSTL调试。 – 2013-03-27 22:17:39

+2

相关:http://stackoverflow.com/q/6945820/1065197 – 2013-03-27 22:20:38

+0

转储所有的域对象可能很有用,但是在开始时查看它们中的内容,并在遍历它们时看到它们中的内容并对它们执行操作不同的故事:)。所以除了转储之外,真的没有更好的办法吗? – Hylianux 2013-03-28 14:14:23

回答

1

如果使用JSTL标签,它们本身不需要调试,符合JSP/EL specificationJSTL documentation。在你发现的答案中,“可调试性”仅仅是指用于业务逻辑的Java代码的上下文,它需要被诸如servlet,过滤器,实体或EJB之类的Java类替代,而不是用于呈现逻辑的Java代码,这需要由JSTL标签,如if/else块,for循环,HTML转义,日期/数字格式,字符串处理函数等代替

但是,如果你面对的,你已经找到了病根显然是一个问题JSTL标签,然后重新阅读JSTL documentation如果您正确使用它们。你也可以使用下面的模板做的兴趣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文件,通过copy'n'paste'n'running复制整个问题(在此示例中,您可以将必要的业务逻辑和例如request.setAttribute()行一个scriptlet它被放置在JSP文件的最顶端;这样的原型就是scriptlet的合法用例之一。

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

2

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

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

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

这是我能找到调试JSTL页面的唯一最佳途径。