如何防止Tomcat 7 / Spring / Tiles修剪HTML输出的空格

时间:2013-09-20 17:09:29

标签: html spring tomcat spring-mvc tiles

我使用Spring Roo创建了一个非常基本的Spring MVC应用程序。因此整个项目被设置为标准的Spring / Tiles应用程序(由Roo创建的脚手架)。当我查看生成的HTML源代码时,我看到所有的空格/换行符都已被修剪。出于调试目的,这对我来说很难/有问题。

我正在使用Spring 3.x和Tomcat 7。

我搜索了SO和网络,发现有一个trimWhiteSpace jsp指令(example at this SO post),但是当我搜索整个Roo生成的代码库时,我在任何地方都看不到这个指令。

我甚至将<init-param><jsp-config>行添加到指定false的web.xml中,但这也没有任何区别。

此时,我不确定是否正在剥离间距的Tomcat,或者是否是Spring / Tiles中正在做的事情。

如何禁用此功能并在我的HTML中输出的所有间距/换行符都存在于我的标记定义和我的jsp文件中?

生成的HTML示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE HTML SYSTEM "about:legacy-compat">
<html><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/><meta content="IE=8" http-equiv="X-UA-Compatible"/><link href="/V2/resources/dijit/themes/tundra/tundra.css" type="text/css" rel="stylesheet"/><link href="/V2/resources/styles/standard.css" media="screen" type="text/css" rel="stylesheet"/><link href="/V2/resources/images/favicon.ico" rel="SHORTCUT ICON"/><script type="text/javascript">var djConfig = {parseOnLoad: false, isDebug: false, locale: 'en-us'};</script><script type="text/javascript" src="/V2/resources/dojo/dojo.js"></script><script type="text/javascript" src="/V2/resources/spring/Spring.js"></script><script type="text/javascript" src="/V2/resources/spring/Spring-Dojo.js"></script><script type="text/javascript" language="JavaScript">dojo.require("dojo.parser");</script><script type="text/javascript" src="/V2/resources/jQuery/jquery-2.0.3.min.js"></script><link href="/V2/resources/jQWidgets-3.0.2/styles/jqx.darkblue.css" type="text/css" rel="stylesheet"/><script type="text/javascript" src="/V2/resources/jQWidgets-3.0.2/jqxcore.js"></script><title>Welcome to V2</title></head><body class="tundra spring"><div id="wrapper"><div version="2.0" id="header"><a title="Home" name="Home" href="/V2/"><img src="/V2/resources/images/banner-graphic.png"/></a></div><div id="main"><div version="2.0"><script type="text/javascript">dojo.require('dijit.TitlePane');</script><div id="_title_title_id"><script type="text/javascript">Spring.addDecoration(new Spring.ElementDecoration({elementId : '_title_title_id', widgetType : 'dijit.TitlePane', widgetAttrs : {title: 'Internal Error', open: true}})); </script><h2>Internal Error</h2><p>Sorry, we encountered an internal error.</p></div></div><div version="2.0" id="footer"><span><a href="/V2/">Home</a></span><span id="language"> | Language: <a title="Switch language to English" href="?lang=en"><img alt="Switch language to English" src="/V2/resources/images/en.png" class="flag"/></a> </span><span> | Theme: <a title="standard" href="?theme=standard">standard</a> | <a title="alt" href="?theme=alt">alt</a></span><span><a title="Sponsored by SpringSource" href="http://springsource.com"><img src="/V2/resources/images/springsource-logo.png" alt="Sponsored by SpringSource" align="right"/></a></span></div></div></div></body></html>

default.jspx示例(基本图块布局):

<html xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tiles="http://tiles.apache.org/tags-tiles" xmlns:spring="http://www.springframework.org/tags" xmlns:util="urn:jsptagdir:/WEB-INF/tags/util" >  

    <jsp:output doctype-root-element="HTML" doctype-system="about:legacy-compat" />

    <jsp:directive.page contentType="text/html;charset=UTF-8" />  
    <jsp:directive.page pageEncoding="UTF-8" /> 

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=8" />    

        <util:load-scripts />

        <spring:message code="application_name" var="app_name" htmlEscape="false"/>
        <title><spring:message code="welcome_h3" arguments="${app_name}" /></title>
    </head>

    <body class="tundra spring">
        <div id="wrapper">
            <tiles:insertAttribute name="header" ignore="true" />
            <tiles:insertAttribute name="menu" ignore="true" />   
            <div id="main">
                <tiles:insertAttribute name="body"/> 
                <tiles:insertAttribute name="footer" ignore="true"/>
            </div>
        </div>
    </body>
</html>

如您所见,瓷砖布局定义中的所有空格/换行符都已被删除。

1 个答案:

答案 0 :(得分:1)

因此,经过大量痛苦的头发拉动(以及一些将我推向正确方向的链接),事实证明,空白修剪不是来自容器,而是来自JSPX解析器。鉴于它们是XML文件,解析器正在加载整个DOM结构,然后将其转储出去。在构建DOM时,它显然会丢失和间隔标签之间的信息。 Apparnetly(我还没有测试过)保留标签之间间距的唯一方法是将所有内容都包含在<jsp:text>块(see here)中。

另一方面,我只是放弃并将所有内容转换为JSP文件,一切正常。我现在更容易处理。