Отладка с помощью jstl - как именно?
Я пытался понять ответ BalusC относительно отладки, и до сих пор не могу понять, как именно jstl-теги легче отлаживаются, чем скриптлеты.
Когда я думаю об отладке, я думаю о возможности пошагового выполнения кода и определения в любой момент времени, какие переменные загружаются в память, и просмотра их содержимого. С jstl я не могу устанавливать точки останова любого вида, и если какая-то часть этого ломается, части любой формы, над которой я работаю, пропадают. Я не уверен, что хуже: пустая страница или наполовину загруженная страница. Я видел ситуации, когда jstl не работает, пропадают другие части формы, а не только те части, на которые она влияет. В любом случае невозможно понять, в чем проблема.
С помощью скриптлетов я могу устанавливать точки останова и видеть любую точку, которую я хотел бы видеть в IDE. Даже если я не использую такую функцию, я могу распечатать на консоли любую часть процедуры, которую я хочу увидеть, и выяснить это позже. Если страница выходит из строя и показывает мне пустую страницу, как бы это ни раздражало, я могу, по крайней мере, пройтись и выяснить, на какой именно строке она терпит неудачу.
С JSTL я полностью в темноте. Итерация по коллекции действительно ощущается как черный ящик, в котором вы надеетесь, что все получится хорошо, а не просто сможете пройтись и посмотреть, как это происходит. Это заставляет вас чувствовать себя бессильным.
Я признаю, что jstl чище и выглядит более интуитивно понятным, но у меня есть одна вопиющая проблема - невозможность действительно отладить что-либо на странице. Я полностью ошибаюсь здесь? Я просто скучаю по хорошему счастливому способу отладки происходящего? Или мой подход к отладке неверен и нуждается в переосмыслении?
Я погуглил проблему, но я не могу придумать прямых ответов... Если у кого-то есть понимание, это было бы очень полезно. Я хочу использовать jstl вместо скриптлетов, и это единственная явная вещь, сдерживающая меня...
2 ответа
Вы можете добавить jsp скриптлеты и распечатать переменные, которые использует jstl. Это печатается в консоли или в файле контейнера
<c:set var="myVar" value='${param.myUrlParam}' />
<% System.out.println(pageContext.findAttribute("myVar") ); %>
Это единственный лучший способ отладки jstl-страницы.
Сами теги JSTL не нужно отлаживать, если вы используете их, чтобы соответствовать спецификации JSP/EL и документации JSTL. В ответе, который вы нашли, "отлаживаемость" просто подразумевается в контексте кода Java для бизнес-логики, который должен быть заменен классом Java, таким как сервлет, фильтр, сущность или 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>
При необходимости вы можете обернуть его в какую-нибудь всплывающую панель, которая открывается с помощью ключа доступа и отображается только в режиме разработки (в MVC-инфраструктуре Java EE JSF очень похожа на <ui:debug>
).
Если напрасно, заколачивайте проблему в наименьший возможный файл JSP, который воспроизводит всю проблему, просто копируя nnpaste'n'running (в таком примере вы можете поместить необходимую бизнес-логику и, например, request.setAttribute()
строки в скриптлете, расположенном в самом верху файла JSP; такое прототипирование является одним из законных вариантов использования скриплетов).
Если вы все еще не можете понять это на основе этого SSCCE, опубликуйте его как вопрос о переполнении стека. Если правильно поставить, вы, скорее всего, получите ответ менее чем за день. Не удивляйтесь, если это более чем часто сводится к простой опечатке или синтаксической / логической ошибке.