问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何去除 JSP 生成的 HTML 中的空格和换行

发布网友 发布时间:2022-04-06 04:44

我来回答

1个回答

热心网友 时间:2022-04-06 06:14

在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脚本执行。
虽然这是一个很小的问题,但我们还是要注意细节。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
光线为什么不存在 炒菜时要等到油冒烟吗 高考数学选修没涂有分吗? 高考选修不涂有分数吗 《宫》中插曲是什么乐器演奏的? 电视剧《宫》的主题曲和片尾曲分别是什么? 爱我的人和我爱的人原唱是裘海正还是游鸿明 刑法对追诉时效的规定 刑事案件追诉期限的法律规定是什么? 爱奇艺海外版怎么下载 php 如何提取一遍文章中的前一百个字,提纯文字不要图片和其他的代码? linux服务器,更新PHP版本,phpinfo还显示以前的版本 阿里云linux服务器升级php求教 如何改变PHP的版本? linux下php版本怎么升级~? linux里怎么升级php版本 linux环境下怎么把php版本从PHP Version 5.2.10-2ubuntu6升级到PHP Version 5.2.17 linux编译安装php,怎么替换已有版本 Windows7的0Xc0000428 我进入f8 选择禁用驱动程序签名强制 可以跳过 但会蓝屏 怎 w7系统进不去提示0xc0000428 Win7 32位系统,开机无法进入系统桌面,错误代码0xc0000428 Windows无法验证 戴尔笔记本win7 0xc0000428 如图 怎么办?在线等 急急急急急 win7&#47;8 s双系统 bcdautofix修复后 win7 启动出现0xc0000428 怎么解决? win7系统未能启动,文件nEqFB2Vj,状态0xc0000428 电脑安装win7出现0xc0000428怎么回事? win7重启时遇到了0x0000428的问题&nbsp;开不了机,在F8里试过了禁用驱动程序签 电脑无法正常开机,显示状态是0xc0000428 win7开机提示0xc0000428无法验证此文件的数字签名怎么办? win7系统电脑开机出现0xc0000428错误提示是怎么回事? 新装win7开机出现0x0000428是什么意思? php为什么获取不到session的值 php在服务器中获取不到session的值 php 取不出session值,是空的 php session 获取不到值 关于session无法取值的问题!!PHP php中session有时候能获取,有时候无法获取。。。 php 方法里定义的session怎么获取不到 php session获取不到 关于php获取Session问题 怎么获取session中的值 下边的php中session用法不知道为什么获取不到值啊? (php)获取不到session的值 在其他页面 我在这边存储了一个session 跳转到其他页面就获取不到了 php在同一页面为什么获取不到session值? php重新访问页面后无法获取session的赋值 php获取session的值问题 php session跨页面取不到值的问题,高手指教。 PHP无法获得session的值 php把数据库查出来的放到session 为什么取不出来 关于PHP中SESSION取值的问题? PHP时间去掉中间空格 怎样隐藏yii路由中的index.php