Поток рендеринга страниц JSP через htmltidy
У меня есть проект Java, работающий на Glassfish, который отображает некрасивый HTML. Это побочный эффект от использования различных внутренних и внешних библиотек JSP. Я хотел бы установить какой-то фильтр пост-рендеринга, который бы передавал окончательный HTML-код через HTMLTidy, чтобы исходный код был красивым и аккуратным, чтобы облегчить отладку. Это возможно?
Есть ли встроенный механизм для выполнения некоторых действий после того, как сервер отображает JSP в HTML? Может ли это действие получить сгенерированный HTML в виде строки и манипулировать им? Есть ли какая-то простая встроенная опция, чтобы сделать это без дополнительного кодирования?
3 ответа
Это поведение также может быть в определенной степени устранено путем установки свойства 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, генерирующий код и рефакторинг. Даже в больших и сложных проектах вы сможете делать это небольшими частями, и вы получите постепенное улучшение. В противном случае, если ваши проблемы вырастут до такой степени, что приборка не сможет помочь, вы вернетесь к тому, с чего начали (и с еще более громоздким кодом для работы).