JSP输出HTML时产生的大量空格和换行的去除方法
生活随笔
收集整理的這篇文章主要介紹了
JSP输出HTML时产生的大量空格和换行的去除方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在WEB應用中,如果使用jsp作為view層的顯示模板,都會被空格/空換行問題所困擾. 這個問題當年也困擾了我比較長的時間.因為在jsp內使用的EL標簽和其他標簽時,會產生大量的空格和換行符.例如:?
復制代碼代碼如下:
------- 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 -----------?
當然,一般不去特別留意是不會發現有什么問題的,畢竟輸出再多的空格和換行符,對于瀏覽器生成的最終效果是一樣的。也就是大部分開發人員忽略這個問題的原因;但實際上這些空格和換行會占用了不少空間,我的經驗是30%左右是空格/換行。也有人說,當web服務器以zip的方式來輸出html時,空格引起的帶寬問題就可以解決了;是的,當使用zip來輸出html時,空格/換行的空間會被節省回來,但這個增加zip的工作量,而且最大的問題是,瀏覽器生成頁面時,還是會還原所有的空格的換行符。對于前端開發人員來說這是個噩耗,面對大量的空格和冗長的html源碼,想要找到對應出問題的樣式所在的位置可不是容易的事情。?
下面說一下解決方案,以Tomcat為例:?
方案一,利用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 EL標簽之間的空格的換行符,在部分情況下也來帶來不便。?
如:Your name is ${firstName} ${lastName}. ==輸出為==> Your name is firstNamelastName.?
兩個${}變量之間的空格也會消失。要解決這個問題是相當麻煩,要引入一個只有一個空格的變量。?
<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腳本執行。?
雖然這是一個很小的問題,但我們還是要注意細節。
復制代碼代碼如下:
------- 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 -----------?
當然,一般不去特別留意是不會發現有什么問題的,畢竟輸出再多的空格和換行符,對于瀏覽器生成的最終效果是一樣的。也就是大部分開發人員忽略這個問題的原因;但實際上這些空格和換行會占用了不少空間,我的經驗是30%左右是空格/換行。也有人說,當web服務器以zip的方式來輸出html時,空格引起的帶寬問題就可以解決了;是的,當使用zip來輸出html時,空格/換行的空間會被節省回來,但這個增加zip的工作量,而且最大的問題是,瀏覽器生成頁面時,還是會還原所有的空格的換行符。對于前端開發人員來說這是個噩耗,面對大量的空格和冗長的html源碼,想要找到對應出問題的樣式所在的位置可不是容易的事情。?
下面說一下解決方案,以Tomcat為例:?
方案一,利用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 EL標簽之間的空格的換行符,在部分情況下也來帶來不便。?
如:Your name is ${firstName} ${lastName}. ==輸出為==> Your name is firstNamelastName.?
兩個${}變量之間的空格也會消失。要解決這個問題是相當麻煩,要引入一個只有一個空格的變量。?
<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腳本執行。?
雖然這是一個很小的問題,但我們還是要注意細節。
轉載于:https://www.cnblogs.com/wenqiangwu/p/3208969.html
總結
以上是生活随笔為你收集整理的JSP输出HTML时产生的大量空格和换行的去除方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: memcached 相关
- 下一篇: 关于浏览器对静态HTML页面的缓存问题