Отладка с помощью 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, опубликуйте его как вопрос о переполнении стека. При правильном размещении вы, скорее всего, получите ответ менее чем за день. Не удивляйтесь, если это более чем часто сводится к простой опечатке или синтаксической/логической ошибке.