Although JTidyFilter
is extremely cool (haven't heard of it before, I upvoted the actual answer as well), I would just add that this behaviour can also be eliminated to a certain degree by just using the JSP 2.1 property trimDirectiveWhitespaces
. This can be enabled in individual JSP files by:
<%@page trimDirectiveWhitespaces="true" %>
You can also apply this to all JSP files by the following entry in web.xml
(which needs to be declared 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>
This actually trims the whitespace left by taglibs and scriptlets. Also see this Sun article.
In pre JSP 2.1 servletcontainers or in JSP 2.1 servletcontainers which actually doesn't support this for some internal reasons, such as Tomcat, you just need to consult its JspServlet
documentation for any initialization parameters. In for example Tomcat, you can configure it as well by setting trimSpaces
init-param to true
in for JspServlet
in Tomcat's /conf/web.xml
:
<init-param>
<param-name>trimSpaces</param-name>
<param-value>true</param-value>
</init-param>
Both approaches however doesn't "reformat" the HTML code, thus for example the following
<ul>
<c:forEach items="${list}" var="item">
<li>${item}</li>
</c:forEach>
</ul>
would basically end up in
<ul>
<li>item1</li>
<li>item2</li>
<li>item3</li>
</ul>
Thus with double indentation. You can actually workaround this by reformatting the code as
<ul>
<c:forEach items="${list}" var="item">
<li>${item}</li>
</c:forEach>
</ul>
But I think the JTidyFilter is much better here :)