Strip whitespace from jsp output

JspTomcatWhitespace

Jsp Problem Overview


How can I strip out extra whitespace from jsp pages' output? Is there a switch I can flip on my web.xml? Is there a Tomcat specific setting?

Jsp Solutions


Solution 1 - Jsp

There is a trimWhiteSpaces directive that should accomplish this,

In your JSP:

<%@ page trimDirectiveWhitespaces="true" %>

Or in the jsp-config section your web.xml (Note that this works starting from servlet specification 2.5.):

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

Unfortunately if you have a required space it might also need strip that, so you may need a non-breaking space in some locations.

Solution 2 - Jsp

If your servletcontainer doesn't support the JSP 2.1 trimDirectiveWhitespaces property, then you 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>

A completely different alternative is the JTidyFilter. It not only trims whitespace, but it also formats HTML in a correct indentation.

Solution 3 - Jsp

The trimDirectiveWhitespaces is only supported by servlet containers that support JSP 2.1 and after, or in the case or Tomcat, Tomcat 6 (and some versions e.g. Tomcat 6.0.10 don't implement it properly - don't know about the others). There's more information about trimDirectiveWhitespaces here:

http://www.oracle.com/technetwork/articles/javaee/jsp-21-136414.html

and here

http://raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1

Solution 4 - Jsp

Not directly what you're asking for, but what helps me is putting HTML comment tags in a clever way around my jsp tags, and also putting whitespace inside a servlet tag (<% %>):

${"<!--"}
<c:if test="${first}">
	<c:set var="extraClass" value="${extraClass} firstRadio"/>
</c:if>
<c:set var="first" value="${false}"/>
${"-->"}<%

%><input type="radio" id="input1" name="dayChooser" value="Tuesday"/><%
%><label for="input1" class="${extraClass}">Tuesday</label>

Solution 5 - Jsp

If you're using tags, you can apply there too:

<%@ tag description="My Tag" trimDirectiveWhitespaces="true" %>

And on your jsp:

<%@ page trimDirectiveWhitespaces="true" %>

Solution 6 - Jsp

You can go one step further and also remove newlines (carriage returns) between the html tags at build time.

E.g. change:

<p>Hello</p>
<p>How are you?</p>

into:

<p>Hello</p><p>How are you?</p>

Do do that, use the maven-replacer-plugin and set it up in pom.xml:

<plugin>
	<groupId>com.google.code.maven-replacer-plugin</groupId>
	<artifactId>replacer</artifactId>
	<version>1.5.3</version>
	<executions>
		<execution>
			<id>stripNewlines</id>
			<phase>prepare-package</phase>
			<goals>
				<goal>replace</goal>
			</goals>
			<configuration>
				<basedir>${project.build.directory}</basedir>
				<filesToInclude>projectname/WEB-INF/jsp/**/*.jsp</filesToInclude>
				<token>&gt;\s*&lt;</token>
				<value>&gt;&lt;</value>
				<regexFlags>
					<regexFlag>MULTILINE</regexFlag>
				</regexFlags>
			</configuration>
		</execution>
	</executions>
</plugin>

This will only modify the JSPs in the build-directory, and not touch the JSPs in your sources.

You might need to adapt the path (<filesToInclude>) where your JSPs are located in.

Solution 7 - Jsp

Please, use the trim funcion, example

fn:trim(string1)

Solution 8 - Jsp

Add/edit your tomcat catalina.properties file with

org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false

See also: https://confluence.sakaiproject.org/display/BOOT/Install+Tomcat+7

Solution 9 - Jsp

Just a bit off the actual question, If you want to get rid of the empty lines cause by whatever you did before outputting, you can use

out.clearBuffer();

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSeth WeinerView Question on Stackoverflow
Solution 1 - JspRontologistView Answer on Stackoverflow
Solution 2 - JspBalusCView Answer on Stackoverflow
Solution 3 - JspSimon BView Answer on Stackoverflow
Solution 4 - JspredolentView Answer on Stackoverflow
Solution 5 - JspAndresView Answer on Stackoverflow
Solution 6 - JspyglodtView Answer on Stackoverflow
Solution 7 - JspJorge Santos NeillView Answer on Stackoverflow
Solution 8 - JspRajkumar RajaduraiView Answer on Stackoverflow
Solution 9 - JspGhostffView Answer on Stackoverflow