JSP输出HTML时产生的大量空格和换行的去除方法

这个问题当年也困扰了我比较长的时间.因为在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脚本执行。
虽然这是一个很小的问题,但我们还是要注意细节。

(0)

相关推荐

  • jsp输出九九乘法表的简单实例

    <% String st = ""; for(int i = 1; i <= 9; i++){ for(int j = 1; j <= i; j++){ st += j+"x"+i+"="+i*j; st += "  "; } st += "<br>"; } %> <table width="400" height="200"

  • 动态jsp页面转PDF输出到页面的实现方法

    最近工作中遇到不少问题.总结一下.这段代码主要功能是将一个生成JSP页面转发成PDF输出到页面 需要利用ITEXT String html = ServletUtils.forward(request,response,"/WEB-INF/jsp/depot/print/jhd.jsp"); //转发请求到jsp,返回解析之后的内容而不是输出到浏览器 //System.out.println(html); byte[] pdf = PDFUtils.html2pdf(html); re

  • jsp 页面上图片分行输出小技巧

    <table border="0" cellpadding="2"> <c:forEach items="${pics}" var="pic" varStatus="status"> <c:if test="${((status.index)%3)==0}"><tr></c:if> <td> <input cl

  • JSP动态输出Excel及中文乱码的解决

    最近在网上看到一个用java来操纵excel的open source,在weblogic上试用了一下,觉得很不错,特此向大家推荐一下. 首先去http://www.andykhan.com/jexcelapi/index.html下载最新的JExcelApi,把jxl.jar置于你的classpath中. 写一个javaBean,利用JExcelApi来动态生成excel文档,我这里写一个最简单的,示意性的.复杂的你可能还要查询数据库什么的. //////////////////////////

  • jsp输出当前时间的实现代码

    在jsp页面中输出完整的时间,格式为"年 月 日  时:分:秒" <% Date date = new Date(); SimpleDateFormat t = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = t.format(date); %> 当前时间:<%= time %> 以上就是小编为大家带来的jsp输出当前时间的实现代码全部内容了,希望大家多多支持我们~

  • jsp输出金字塔的简单实例

    jsp输出金字塔的简单实例 <% String str = ""; for(int i = 1; i <= 5; i++){ for(int j = 1; j <= 5-i; j++){ str +="    "; } for(int k = 1; k <= 2*i-1; k++){ str +="☆"; } str +="<br>"; } %> <%= str %> 以上

  • JSP输出HTML时产生的大量空格和换行的去除方法

    这个问题当年也困扰了我比较长的时间.因为在jsp内使用的EL标签和其他标签时,会产生大量的空格和换行符.例如: 复制代码 代码如下: ------- start ---------- <c:choose> <c:when test="${fn:length(mainPageList)>1&}"> Something </c:when> <c:otherwise> Others </c:otherwise> <

  • php提交表单时保留多个空格及换行的文本样式的方法

    需求是:用户提交表单时屏蔽敏感词的功能.其中敏感词来自服务器端同一路径下的ciku.txt,敏感词通过"|"连接,例如"g|c|a",提交表单时替换敏感词,更重要的是,需要保持表单文本域中用户输入的多个空格及换行的样式,并原样输出.php代码如下: <?php header("Content-type:text/html;charset=utf-8"); if($_POST){ $pattern = array( '/ /', //半角下空

  • 关于读取popen输出结果时未截断字符串导致的命令行注入详解

    0x00 前言 这种命令行注入在pwn中出现的比较少,所以记录分享一下. 0x01 命令行注入介绍 熟悉web安全的话就知道,如果对特殊字符过滤不当,会引发sql注入或者xss等安全漏洞.其中,命令行注入较为严重,因为可以直接拿到漏洞程序当前权限的OSshell. 然而,命令行注入不仅在web中会出现,在C语言程序中,也会出现命令行注入的漏洞.比方说这道pwn题,就是调用system时,没有对输入数据进行\0截断以及对特殊字符处理不当而导致的. 命令行注入相对于其他二进制漏洞相比利用比较简单,比

  • 解决asp.net core在输出中文时乱码的问题

    前言 作为一个.NET Web开发者,我最伤心的时候就是项目开发部署时面对Windows Server上贫瘠的解决方案,同样是神器Nginx,Win上的Nginx便始终不如Linux上的,你或许会说"干嘛不用windows自带的NLB呢",那这就是我这个小鸟的从众心理了,君不见Stack Overflow 2016最新架构中,用的负载和缓存技术也都是采用在Linux上已经成熟的解决方案吗.没办法的时候找个适合的解决办法是好事,有办法的时候当然要选择最好的解决办法. 所幸,.ASP.NE

  • jsp输出所有请求头的名称方法

    如下所示: Enumeration headernames=request.getHeaderNames(); while(headernames.hasMoreElements()){ String headername=headernames.nextElement();out.println(headername+"-->"+request.getHeader(headername)+"");} out.println(""); 以上

  • Python遍历zip文件输出名称时出现乱码问题的解决方法

    本文实例讲述了Python遍历zip文件输出名称时出现乱码问题的解决方法.分享给大家供大家参考.具体如下: windows中使用python2.7遍历zip文件之后输出文件名等信息,console打印的中文及一些标点出现乱码.查了一下网上说的windows的编码为cp936,print()函数交给系统处理打印,所以要提前编码成windows能够识别的编码. 这种print的乱码也会出现在形如print(mylist)中(mylist是python的list类型变量,print(mylist[2]

  • PHP写API输出的时用echo的原因详解

    写php API写的很少,最近才开始接口的写法,在框架里面一直用return,但是在api中retrun就失效了,为什么呢? 网友给出的答案: 1.return 一般用于函数或方法的返回. echo 才是输出(也就是显示) 如果你不输出,api有何作用. 2.return只能在php内部使用 对外,你要给别人解析,你就理解成输出,用echo 3.当然是echo了,如果是json最好加上header标识 <?php $ret = array( 'name' => 'fdipzone' ); he

随机推荐