在WEB应用中,若是使用jsp做为view层的显示模板,都会被空格/空换行问题所困扰. html
这个问题当年也困扰了我比较长的时间.由于在jsp内使用的EL标签和其余标签时,会产生大量的空格和换行符.例如: 前端
------- start ----------固然,通常不去特别留意是不会发现有什么问题的,毕竟输出再多的空格和换行符,对于浏览器生成的最终效果是同样的。也就是大部分开发人员忽略这个问题的缘由;但实际上这些空格和换行会占用了很多空间,个人经验是30%左右是空格/换行。也有人说,当web服务器以zip的方式来输出html时,空格引发的带宽问题就能够解决了;是的,当使用zip来输出html时,空格/换行的空间会被节省回来,但这个增长zip的工做量,并且最大的问题是,浏览器生成页面时,仍是会还原全部的空格的换行符。对于前端开发人员来讲这是个噩耗,面对大量的空格和冗长的html源码,想要找到对应出问题的样式所在的位置可不是容易的事情。 web
下面说一下解决方案,以Tomcat为例: apache
方案一,利用web服务器的trimSpaces功能。 浏览器
Tomcat5 以上版本均可以使用,这是最简单的方法。 服务器
<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>trimSpaces </param-name>
<param-value>true </param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet> jsp
这个方案有个缺点,它会去掉全部jsp EL标签之间的空格的换行符,在部分状况下也来带来不便。 spa
如:Your name is ${firstName} ${lastName}. ==输出为==> Your name is firstNamelastName. htm
两个${}变量之间的空格也会消失。要解决这个问题是至关麻烦,要引入一个只有一个空格的变量。 ip
<c:set var="one_space"> </c:set>
Your name is ${firstName}${one_space}${lastName}.
这样就正常了,麻烦。虽然能够在一些全局变量的地方来增长一个one_space的变量,但代码看上去仍是不爽。
方案二,我比较喜欢。
这个方案只有在支持jsp 2.1的web服务器上才可使用,如Tomcat6。
Jsp2.1多了一个颇有用的命令;
<%@ page trimDirectiveWhitespaces="true" %>
这个命令可使jsp输出的html时去除多余的空行(jsp上使用EL和tag会产生大量的空格和空行),没有使用trimSpaces的问题,如今 jsp输出html也能够很好地排版,看上去也专业;之前我一直都羡慕velocity的模板,输出html十分干净好看,如今jsp也能够了。
另外提一下,Tomcat6有一些兼容性问题,例如不能使用#{}这种代码在jsp中,由于会被当成JSF脚本执行。
虽然这是一个很小的问题,但咱们仍是要注意细节。
补充:
在resin里面,代码结束符号的“%>"会产生一个换行,若是开头部分有不少行的引入包,或者包含之类的,就会出来大量的换行,可经过
out.clearBuffer(); // 清除当前代码之前的空格。