在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脚本执行。 
虽然这是一个很小的问题,但我们还是要注意细节。

JSP输出HTML时产生的大量空格和换行的去除方法的更多相关文章

  1. 导入礼包时,遇到file_get_contents读取的文本,去除空格、换行等的方法

    解决方法:正则替换: 代码:$gift_code_str = preg_replace('/((\s)*(\n)+(\s)*) /i ',',',file_get_contents($gift_cod ...

  2. python去除空格和换行符的方法

    一.去除空格 strip() " xyz ".strip() # returns "xyz" " xyz ".lstrip() # retu ...

  3. SpringMVC——使用RequestDispatcher.include()和HttpServletResponseWrapper动态获取jsp输出内容

    介绍本篇内容前,先抛出我遇到的问题或者说是需求!(精读阅读本篇可能花费您15分钟,略读需5分钟左右) 一:需求说明 有一个Controller有两个方法 第一个方法通过指定的路径和参数去渲染jsp内容 ...

  4. VUE-003-前端表格数据展示时,设置单元格(el-table-column)保留空格和换行

    在使用 el-table 展示数据时,单元格中的数据有可能存在空格和换行符,若不进行设置,浏览器默认会取消空格和换行符,如下所示: 解决方法: 将单元格的样式 “white-space” 属性设置为“ ...

  5. php提交表单时如何保留多个空格及换行的文本样式

    需求是:用户提交表单时屏蔽敏感词的功能.其中敏感词来自服务器端同一路径下的ciku.txt,敏感词通过"|"连接,例如"g|c|a",提交表单时替换敏感词,更重 ...

  6. archive成功了,但是在输出ipa时要求有账号密码

    archive成功了,但是在输出ipa时要求有账号密码 可以通过命令行方式输出,绕开账号检查1.进入Windows-Organizer-Archives,找到要输出的scarchive列表项:2.右键 ...

  7. EditText中输入手机号码时,自动添加空格

    输入手机号码时,自动添加空格,更容易辨别 public class PhoneWatcher implements TextWatcher { private EditText _text; publ ...

  8. jsp编写页面时常见错误提示

    jsp编写页面时常见错误提示 404-->未部署web应用 500-->代码有问题 无法显示网页-->未启动tomcat webRoot-->URL输入有误 web-inf-- ...

  9. Object之魔术函数__toString() 直接输出对象引用时自动调用

    __toString()是快速获取对象的字符串信息的便捷方式 在直接输出对象引用时自动调用的方法. __toString()的作用 当我们调试程序时,需要知道是否得出正确的数据.比如打印一个对象时,看 ...

随机推荐

  1. 8.20 前端 js

    2018-8-20 17:40:12 js参考: https://www.cnblogs.com/liwenzhou/p/8004649.html 2018-8-20 20:33:31 css学完了 ...

  2. C++和Java中枚举enum的用法

    在C++和java中都有枚举enum这个关键字,但是它们之间又不太一样.对于C++来说,枚举是一系列命名了的整型常量,而且从枚举值转化为对应的整型值是在内部进行的.而对于Java来说,枚举更像一个类的 ...

  3. httpclient 请求 json 数据

    基于\httpcomponents-client-4.5.5需要引入相关jar包如下: 必须导入commons-logging-1.2.jar,否则会提示 json api接口地址: https:// ...

  4. GCD之各种派发

    dispatch_apply的用法 并行模拟for循环,将指定的代码循环10次,一般会把这些代码附加到一个queue上,然后在 dispatch_apply里并行 dispatch_queue_t q ...

  5. Redis is loading the dataset in memory

    Redis is loading the dataset in memory During handling of the above exception, another exception occ ...

  6. Taking a peek inside with the Actuator

    Taking a peek inside with the Actuator <dependency> <groupId>org.springframework.boot< ...

  7. js之操作cookie

    js通过document.cookie获取所有的cookie信息, cookie在存储的格式是键值对,key=value每个键值对之间用; (分号和空格隔开). 添加cookie和修改cookie的值 ...

  8. centos source install

    CentOS Kernel Source Install Mar 12th, 2012 | Comments CentOS kernel source install, first off if yo ...

  9. CDN工作过程(第二种版本)

    作者:代希刚链接:https://www.zhihu.com/question/36514327/answer/121026637来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  10. Shell初学(三)传参

    一. 脚本代码:test.sh echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1&quo ...