在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(); // 清除當前代碼之前的空格。