Кормят страницы JSP с помощью htmltidy


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

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

3 7

3 ответа:

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

<%@page trimDirectiveWhitespaces="true" %>

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

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

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

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

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

<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-генерация кода и рефакторинг, что. Даже в больших, сложных проектах, вы должны быть в состоянии сделать это в небольших частях, и вы получите постепенное улучшение. В противном случае, если ваши проблемы вырастут до такой степени, что вы не сможете помочь, вы будете вернитесь туда, откуда вы начали (и с еще более громоздким кодом).