JSP輸出HTML時產(chǎn)生的大量空格和換行的去除方法
更新時間:2009年10月20日 21:46:51 作者:
在WEB應(yīng)用中,如果使用jsp作為view層的顯示模板,都會被空格/空換行問題所困擾.
這個問題當(dāng)年也困擾了我比較長的時間.因為在jsp內(nèi)使用的EL標(biāo)簽和其他標(biāo)簽時,會產(chǎn)生大量的空格和換行符.例如:
------- start ----------
<c:choose>
<c:when test="${fn:length(mainPageList)>1&}">
Something
</c:when>
<c:otherwise>
Others
</c:otherwise>
</c:choose>
------- end -----------
這段代碼在Tomcat上輸出如下,多了幾行換行。
------- start ----------
Something
------- end -----------
當(dāng)然,一般不去特別留意是不會發(fā)現(xiàn)有什么問題的,畢竟輸出再多的空格和換行符,對于瀏覽器生成的最終效果是一樣的。也就是大部分開發(fā)人員忽略這個問題的原因;但實際上這些空格和換行會占用了不少空間,我的經(jīng)驗是30%左右是空格/換行。也有人說,當(dāng)web服務(wù)器以zip的方式來輸出html時,空格引起的帶寬問題就可以解決了;是的,當(dāng)使用zip來輸出html時,空格/換行的空間會被節(jié)省回來,但這個增加zip的工作量,而且最大的問題是,瀏覽器生成頁面時,還是會還原所有的空格的換行符。對于前端開發(fā)人員來說這是個噩耗,面對大量的空格和冗長的html源碼,想要找到對應(yīng)出問題的樣式所在的位置可不是容易的事情。
下面說一下解決方案,以Tomcat為例:
方案一,利用web服務(wù)器的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 EL標(biāo)簽之間的空格的換行符,在部分情況下也來帶來不便。
如:Your name is ${firstName} ${lastName}. ==輸出為==> Your name is firstNamelastName.
兩個${}變量之間的空格也會消失。要解決這個問題是相當(dāng)麻煩,要引入一個只有一個空格的變量。
<c:set var="one_space"> </c:set>
Your name is ${firstName}${one_space}${lastName}.
這樣就正常了,麻煩。雖然可以在一些全局變量的地方來增加一個one_space的變量,但代碼看上去還是不爽。
方案二,我比較喜歡。
這個方案只有在支持jsp 2.1的web服務(wù)器上才可以使用,如Tomcat6。
Jsp2.1多了一個很有用的命令;
<%@ page trimDirectiveWhitespaces="true" %>
這個命令可以使jsp輸出的html時去除多余的空行(jsp上使用EL和tag會產(chǎn)生大量的空格和空行),沒有使用trimSpaces的問題,現(xiàn)在jsp輸出html也可以很好地排版,看上去也專業(yè);以前我一直都羨慕velocity的模板,輸出html十分干凈好看,現(xiàn)在jsp也可以了。
另外提一下,Tomcat6有一些兼容性問題,例如不能使用#{}這種代碼在jsp中,因為會被當(dāng)成JSF腳本執(zhí)行。
雖然這是一個很小的問題,但我們還是要注意細節(jié)。
復(fù)制代碼 代碼如下:
------- start ----------
<c:choose>
<c:when test="${fn:length(mainPageList)>1&}">
Something
</c:when>
<c:otherwise>
Others
</c:otherwise>
</c:choose>
------- end -----------
這段代碼在Tomcat上輸出如下,多了幾行換行。
復(fù)制代碼 代碼如下:
------- start ----------
Something
------- end -----------
當(dāng)然,一般不去特別留意是不會發(fā)現(xiàn)有什么問題的,畢竟輸出再多的空格和換行符,對于瀏覽器生成的最終效果是一樣的。也就是大部分開發(fā)人員忽略這個問題的原因;但實際上這些空格和換行會占用了不少空間,我的經(jīng)驗是30%左右是空格/換行。也有人說,當(dāng)web服務(wù)器以zip的方式來輸出html時,空格引起的帶寬問題就可以解決了;是的,當(dāng)使用zip來輸出html時,空格/換行的空間會被節(jié)省回來,但這個增加zip的工作量,而且最大的問題是,瀏覽器生成頁面時,還是會還原所有的空格的換行符。對于前端開發(fā)人員來說這是個噩耗,面對大量的空格和冗長的html源碼,想要找到對應(yīng)出問題的樣式所在的位置可不是容易的事情。
下面說一下解決方案,以Tomcat為例:
方案一,利用web服務(wù)器的trimSpaces功能。
Tomcat5 以上版本都可以使用,這是最簡單的方法。
復(fù)制代碼 代碼如下:
<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 EL標(biāo)簽之間的空格的換行符,在部分情況下也來帶來不便。
如:Your name is ${firstName} ${lastName}. ==輸出為==> Your name is firstNamelastName.
兩個${}變量之間的空格也會消失。要解決這個問題是相當(dāng)麻煩,要引入一個只有一個空格的變量。
<c:set var="one_space"> </c:set>
Your name is ${firstName}${one_space}${lastName}.
這樣就正常了,麻煩。雖然可以在一些全局變量的地方來增加一個one_space的變量,但代碼看上去還是不爽。
方案二,我比較喜歡。
這個方案只有在支持jsp 2.1的web服務(wù)器上才可以使用,如Tomcat6。
Jsp2.1多了一個很有用的命令;
<%@ page trimDirectiveWhitespaces="true" %>
這個命令可以使jsp輸出的html時去除多余的空行(jsp上使用EL和tag會產(chǎn)生大量的空格和空行),沒有使用trimSpaces的問題,現(xiàn)在jsp輸出html也可以很好地排版,看上去也專業(yè);以前我一直都羨慕velocity的模板,輸出html十分干凈好看,現(xiàn)在jsp也可以了。
另外提一下,Tomcat6有一些兼容性問題,例如不能使用#{}這種代碼在jsp中,因為會被當(dāng)成JSF腳本執(zhí)行。
雖然這是一個很小的問題,但我們還是要注意細節(jié)。
相關(guān)文章
搭建Eclipse+MyEclipse開發(fā)環(huán)境
搭建Eclipse+MyEclipse開發(fā)環(huán)境...2007-02-02JSP開發(fā)之Spring方法注入之替換方法實現(xiàn)
這篇文章主要介紹了JSP開發(fā)之Spring方法注入之替換方法實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07JSP動態(tài)網(wǎng)站開發(fā)環(huán)境配置詳細方法
Sun推出的JSP(Java Server Pages)是一種執(zhí)行于服務(wù)器端的動態(tài)網(wǎng)頁開發(fā)技術(shù),它基于Java技術(shù)。執(zhí)行JSP時需要在Web服務(wù)器上架設(shè)一個編譯JSP網(wǎng)頁的引擎。配置 JSP 環(huán)境可以有多種途徑,但主要工作就是安裝和配置Web服務(wù)器和JSP引擎。2008-09-09Spring 中 @Service 和 @Resource 注解的區(qū)別
這篇文章主要介紹了Spring @Service 和 @Resource 注解的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-03-03在 Linux 上安裝Apache+ApacheJServ+JSP
在 Linux 上安裝Apache+ApacheJServ+JSP...2006-10-10