Removing useless newlines from JSP output
Posted on: April 27th, 2010What has always bothered me the most about JSP was the hundreds of useless newlines that the output produced. Take the following example code:
<html>
<body>
<ul>
<%
for(int i=0; i<3; i++) {
%>
<li><%=i%></li>
<%
}
%>
</ul>
</body>
</html>
Now look at the output:
<html>
<body>
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
</ul>
</body>
</html>
The additional newlines are inserted because the line-breaks after the %> are preserved. Not only does this look stupid, it can also create invalid XML if the newlines occur before the <?xml declaration.
One solution would be to omit the newlines after the %>, but obviously this would make correct indentation of the HTML code inside your JSP file impossible as some lines would be preceded by two additional characters.
JSP 2.1 has introduced a trimDirectiveWhitespace parameter [source], which is included in the @page directive: <%@page trimDirectiveWhitespaces="true"%>. Look what the HTML output looks like now:
<html>
<body>
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
</ul>
</body>
</html>
The trimDirectiveWhitespaces parameter not only trims the newlines after the %>, but it trims all white spaces, including the indentation of the next line! I cannot imagine how anyone could have such a stupid idea.
My solution is to replace the newlines automatically in the JSP files before deploying them to the web container. This way, both the JSP file I write and the HTML code that is created look proper. To perform this task, there exists a Maven plugin called maven-replacer-plugin. This is the configuration I use in my pom.xml file:
<pluginRepositories>
<pluginRepository>
<id>maven-replacer-plugin reposoitory</id>
<url>http://maven-replacer-plugin.googlecode.com/svn/release-repo</url>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>maven-replacer-plugin</artifactId>
<version>1.3.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>replace</goal>
</goals>
</execution>
</executions>
<configuration>
<includes>
<include>target/${project.build.finalName}/**/*.jsp</include>
</includes>
<basedir>${basedir}</basedir>
<replacements>
<replacement>
<token>(--%>)(\n)</token>
<value>$2$1</value>
</replacement>
<replacement>
<token>(%>)(\n)</token>
<value>$2$1</value>
</replacement>
</replacements>
<regexFlags>
<regexFlag>MULTILINE</regexFlag>
</regexFlags>
</configuration>
</plugin>
</plugins>
</build>
This moves the newline behind the %> before it. JSP comments (ending with --%>) are handled separately to not break them. By only moving the newline and not removing it, the line numbers in error messages are still correct. Look at the output now:
<html>
<body>
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
</ul>
</body>
</html>
Unfortunately, I have not yet found a way to use this together with maven-jspc-plugin, which accesses the JSP files from the source folder directly, so the replacement does not have any effect when you pre-compile your JSP files.
Update: Feel free to copy from my adventurous way of compiling the whitespace-fixed JSP files.