如果您使用符合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 上。如果正确放置,您可能会在不到一天的时间内得到答案。如果它经常归结为简单的错字或语法/逻辑错误,请不要感到惊讶。