从JSP输出中去除空格

119

我该如何从JSP页面的输出中去除额外的空格?我可以在web.xml中切换开关吗?是否有Tomcat特定的设置?

10个回答

183

有一个 trimWhiteSpaces 指令可以实现这个功能,

在你的 JSP 中:

<%@ page trimDirectiveWhitespaces="true" %>

或者在你的 web.xml 文件的 jsp-config 部分中(请注意,这适用于 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>

不幸的是,如果您有一个必须的空格,它可能也需要剥离,因此在某些位置可能需要使用不间断空格。


2
这两个选项在性能方面有区别吗? - jlb
trimDirectiveWhitespaces 只被支持 JSP 2.1 及以上版本的 Servlet 容器所支持,或者在 Tomcat 的情况下,Tomcat 6(某些版本如 Tomcat 6.0.10 没有正确实现它 - 不知道其他版本),这里有更多关于 trimDirectiveWhitespaces 的信息:http://java.sun.com/developer/technicalArticles/J2EE/jsp_21/和这里http://raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1 - wavetree
3
在 JSP 自定义 .tag 文件中,使用 <%@ tag body-content="scriptless" trimDirectiveWhitespaces="true" %>。意思是设置标签体内容为“无脚本”且修剪指令中的空格。 - Thomas W
Tomcat 7 web.xml: <init-param> <param-name>trimSpaces</param-name> <param-value>true</param-value> </init-param> - Ujjwal Singh
我正在运行Tomcat 8,但似乎这个功能不起作用。有人使用它有效吗? - glez
在使用tiles显示Java Bean值时,我使用JSP c:out标签遇到了相同的问题,即出现前导和尾随空格。这个解决方案可以正确地工作,使用以下页面指令修复了该问题! - rinilnath

28

如果你的servlet容器不支持JSP 2.1的trimDirectiveWhitespaces属性,那么你需要查阅它的JspServlet文档以获取任何初始化参数。例如,在Tomcat中,你可以通过在Tomcat的/conf/web.xml中为JspServlet设置trimSpaces init-param为true来配置它:

<init-param>
    <param-name>trimSpaces</param-name>
    <param-value>true</param-value>
</init-param>

另一个完全不同的替代品是JTidyFilter。它不仅可以修整空格,还可以以正确的缩进格式化HTML。


我已经在/conf/web.xml中将trimSpaces init-param设置为true,但生成的HTML中的空格未被修剪。我正在使用Tomcat 6.0。有什么想法吗? - ria
7
请注意,您需要理解这仅修剪JSTL和scriptlet等标签库留下的空白。如果您想从HTML中修整所有空白,则需要采用不同的解决方案。您可以在此处找到一个过滤器示例:http://balusc.blogspot.com/2007/12/whitespacefilter.html - BalusC
我刚刚注意到了一些代码问题,因为我的网站上的东西开始显示错误。我复制了HTML源代码并将其粘贴到W3验证器中,发现空格过滤器有时会连接属性。例如,这个... <div onclick="correct()" class="correct"> 会变成这个 <div onclick="wrong"class="wrong">。或者这个 <a class="correct"> 会变成这个 <aclass="wrong">。因此,由于丢失了空格,元素的闭合标签变得无效。对此有什么建议吗? - gmustudent

5

4

虽然不是你要求的直接答案,但我使用的方法是巧妙地在jsp标签周围加上HTML注释标签,并在servlet标签中添加空格(<% %>):

${"<!--"}
<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>

4
如果您正在使用标签,您也可以在此应用:
<%@ tag description="My Tag" trimDirectiveWhitespaces="true" %>

在你的JSP页面上:

<%@ page trimDirectiveWhitespaces="true" %>

1
请使用 trim 函数,例如:
fn:trim(string1)

1
你可以更进一步,在构建时删除HTML标记之间的换行符(回车符)。

例如,将其更改为:

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

转换为:

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

为了实现这个目标,使用 maven-replacer-plugin 并在 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>

这只会修改构建目录中的JSP文件,而不会影响源代码中的JSP文件。
您可能需要调整路径(<filesToInclude>),以确定JSP文件的位置。

0

0

稍微偏离实际问题,如果您想要消除输出前由之前操作引起的空行,您可以使用以下方法:

out.clearBuffer();

0
在web.xml文件中添加该servlet,并添加该trim参数。
<servlet>
                <servlet-name>jsp</servlet-name>
                <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
                <init-param>
                    <param-name>fork</param-name>
                    <param-value>false</param-value>
                </init-param>
                <init-param>
                    <param-name>xpoweredBy</param-name>
                    <param-value>false</param-value>
                </init-param>
                <init-param>
                    <param-name>trimSpaces</param-name>
                    <param-value>true</param-value>
                </init-param>
                <load-on-startup>3</load-on-startup>
            </servlet>
            <servlet-mapping>
                <servlet-name>default</servlet-name>
                <url-pattern>/</url-pattern>
            </servlet-mapping>

            <!-- The mappings for the JSP servlet -->
            <servlet-mapping>
                <servlet-name>jsp</servlet-name>
                <url-pattern>*.jsp</url-pattern>
                <url-pattern>*.jspx</url-pattern>
            </servlet-mapping>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接