Поток рендеринга страниц JSP через htmltidy

У меня есть проект Java, работающий на Glassfish, который отображает некрасивый HTML. Это побочный эффект от использования различных внутренних и внешних библиотек JSP. Я хотел бы установить какой-то фильтр пост-рендеринга, который бы передавал окончательный HTML-код через HTMLTidy, чтобы исходный код был красивым и аккуратным, чтобы облегчить отладку. Это возможно?

Есть ли встроенный механизм для выполнения некоторых действий после того, как сервер отображает JSP в HTML? Может ли это действие получить сгенерированный HTML в виде строки и манипулировать им? Есть ли какая-то простая встроенная опция, чтобы сделать это без дополнительного кодирования?

3 ответа

Решение

JTidyFilter

Это поведение также может быть в определенной степени устранено путем установки свойства JSP 2.1 trimDirectiveWhitespaces в true, Это может быть включено в отдельных файлах JSP:

<%@page trimDirectiveWhitespaces="true" %>

Или для всех файлов JSP с помощью следующей записи в web.xml (который должен быть объявлен Servlet 2.5!):

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <trim-directive-whitespaces>true</trim-directive-whitespaces>
    </jsp-property-group>
</jsp-config>

В контейнерах, предшествующих JSP 2.1, или в контейнерах JSP 2.1, которые фактически не поддерживают это по некоторым внутренним причинам, например Tomcat, вам необходимо обратиться к JspServlet документация для любых параметров инициализации. Например, в Tomcat вы можете настроить его, установив trimSpaces init-парам JspServlet в true в Tomcat's /conf/web.xml:

<init-param>
    <param-name>trimSpaces</param-name>
    <param-value>true</param-value>
</init-param>

Следует отметить, что оба подхода на самом деле не "переформатируют" HTML-код. На самом деле он только урезает пробел, оставленный тегами и скриптлетами. Также см. Эту статью Sun Так, например, следующее..

<ul>
    <c:forEach items="${list}" var="item">
        <li>${item}</li>
    </c:forEach>
</ul>

..в основном в конечном итоге

<ul>
        <li>item1</li>
        <li>item2</li>
        <li>item3</li>
</ul>

Таким образом, с двойным отступом. На самом деле вы можете обойти это, переформатировав код так, что теги JSP наполовину с отступом:

<ul>
  <c:forEach items="${list}" var="item">
    <li>${item}</li>
  </c:forEach>
</ul>

Но я думаю, что JTidyFilter здесь легче:)

Если вы можете изменить поток управления, чтобы получить вывод html до того, как он вернется в браузер, тогда jtidy может вам помочь.

Я бы расценил это как исправление в худшем случае. В долгосрочной перспективе, что должно помочь больше, это отделить ваш HTML, генерирующий код и рефакторинг. Даже в больших и сложных проектах вы сможете делать это небольшими частями, и вы получите постепенное улучшение. В противном случае, если ваши проблемы вырастут до такой степени, что приборка не сможет помочь, вы вернетесь к тому, с чего начали (и с еще более громоздким кодом для работы).

Другие вопросы по тегам