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