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