文档章节

velocity模板对空白的处理的问题

laichendong
 laichendong
发布于 2014/06/25 09:27
字数 908
阅读 976
收藏 8

一、发现

在写一个基于模板的代码生成器(我叫她——bud)的时候。因为相对熟悉velocity,而velocity也完全能够胜任,于是就用了他。在生成一个xml文件的时候发现一个有趣的现象——某些情况下velocity会吧模板中的“换行”给吃掉。就是在模板代码里是有换行的。但是处理后就没有了。写了个类似这样的代码:

#foreach($i in [0..10])
	$i #if($velocityCount <= 10), #end
#end

看代码写结果。你觉得这段代码会输出什么呢?

        0 , 	
	1 , 	
	2 , 	
	3 , 	
	4 , 	
	5 , 	
	6 , 	
	7 , 	
	8 , 	
	9 , 	
	10

这样? 不对!是这样:

0 , 	1 , 	2 , 	3 , 	4 , 	5 , 	6 , 	7 , 	8 , 	9 , 	10

模板上的换行符没了! 这直接影响了生成的代码的美观(质量)。如果是用来生成html,某些情况下会影响界面上的显示。

二、尝试

发现了这个现象以后,我随手做了几个尝试: 

1、去掉#if 指令(有效)

#foreach($i in [0..10])
	$i 
#end

这时候好了,每个数字乖乖的在每一行呆着了。初步怀疑是#if指令引起的 但是也不能去掉#if啊。功能还是要实现的嘛。 

2、在#if 指令结束后加上其他代码(有效)

#foreach($i in [0..10])
	$i #if($velocityCount <= 10), #end someCode
#end

这也是ok的,换行符还在。 代码总不能随便加吧。

 3、在#if 指令结束后加上其他注释(无效) 既然代码不能乱加,注释总是勉强可以加的吧。

#foreach($i in [0..10])
	$i #if($velocityCount <= 10), #end ##someComment
#end

很遗憾~,这种方法无效…… 

 4、加入额外的空行(有效,可行) 不能加代码,加注释又不行,那加一个空行总行了吧。

#foreach($i in [0..10])
	$i #if($velocityCount <= 10), #end

#end

ok,算是采用指标不治本的方式算是解决了这个问题。 

 5、…… 

除了这些,还进行了若干个尝试。

三、结论

经过测试发现,除了#if指令会造成“吃掉行尾回车”以外,其他指令如#set等也会有这个情况。如果需要对生成的代码格式有精确的控制,那对模板代码的美观性和可读性上就要做一定的牺牲了。反之,则可以优先保证模板代码的美观。

四、延伸

又做了一些测试,发现除了某些指令会“吃掉行尾回车”以外,velocity在空白的处理上还有一些不尽如人意的地方: 1、#[[  和 ]]#  指令后的回车,反而会留着,造成空行。

#[[
#foreach($i in [0..10])
	$i 
#end
]]#

这样的代码,渲染结果是:

(我是空行)
#foreach($i in [0..10])
	$i 
#end
(我是空行)

(第一行和第五行都是空行,由于代码高亮插件会自动把空行去掉,我就这么表示了) 

 2、指令前的空白不会被删除。

#foreach($i in [0..3])
	#if(0 == 0)
		$i
	#end
#end

保证模板代码美观,这里采用了缩进。渲染结果是:

0
				1
				2
				3
	(我前面还有一个tab)

可以看到,用于保持模板代码美观的tab(或者空格)被渲染了出来。 

 3、…… 

可能(应该)还有其他的,等你来补充。 

可能有人说,这算不上什么问题,但对我这种 有洁癖的码农来说。这也算是个不大不小的问题吧,另外在某些情况下,如果你不知道有这么回事,可能真的会影响生成出来的html代码空白结构,进而影响页面显示。

© 著作权归作者所有

共有 人打赏支持
laichendong
粉丝 10
博文 85
码字总数 71483
作品 0
朝阳
程序员
私信 提问
加载中

评论(5)

z
zcy19890821
一群傻x span啊
黄金龙
黄金龙
2、指令前的空白不会被删除。
这句很有用,#指令顶格写就行了,虽然难看点,但总比所有代码放在一行好多了
悠悠然然
悠悠然然

引用来自“webit”的评论

13 这就是我为啥自己做模版引擎
米兔 TinyTemplate号称VelocityPlus,90%兼容Velocity语法,可以进行输出格式的精确控制,另外功能特性及性能较Velocity也有长足进步,建议你看看。 Webit不是非常强,而是相当强。如果你喜欢javascript语法,可以考虑webit。
zqq90
zqq90
13 这就是我为啥自己做模版引擎
黄勇
黄勇
在 foreach 与 if 后面加上“##”试试看行不行?

#foreach($i in [0..10]) ##
$i
#if($velocityCount <= 10) ##
,
#end
#end
Velocity解析模板出现多余的空白和制表符的解决方法

最近在使用Velocity模板引擎进行项目页面输出时发现代码中为了可读性进行的缩进等都反应到了实际输出的页面中,导致页面的结构不整齐,出现了很多的空白,就像下面的这样: 结果页面是这样的...

山哥
2013/08/31
3.5K
4
Velocity处理多余空白和多余空白行问题

Velocity在生成模板时,会出现多余的空白和空白行,下面给出2种处理方式: 1. velocity指令之间不要缩进,但是可以换行,在每行后面增加 ## 单行注释指令让velocity引擎放弃解析后面的内容:...

山哥
2013/08/30
0
0
进一步提升 Struts 2 对 Velocity 的支持力度

本文主要介绍如何解决 Struts 2 和最新版本的 Velocity 结合的问题以及进一步提升 Struts 2 对 Velocity 的支持力度。 Struts 2 是 Struts 框架的一个全新版本,它废弃了原有 Struts 1.x 的框...

红薯
2008/10/05
1K
0
HTTL 1.0.11 版本发布,Java 模版引擎

HTTL-1.0.11版本主要修复BUG,为稳定版本,欢迎使用。 下载:http://httl.github.io/zh/download.html HTTL (Hyper-Text Template Language) 是一个高性能的开源JAVA模板引擎, 适用于动态H...

梁飞
2013/08/16
3.3K
17
Java模板引擎 HTTL

HTTL(Hyper-Text Template Language)是一个高性能的开源JAVA模板引擎,适用于动态HTML页面输出,可替代JSP页面,指令和Velocity相似。 简洁友好的模板语法 语法尽可能符合HTML和JAVA开发者...

kevin728971010
2016/11/07
59
0

没有更多内容

加载失败,请刷新页面

加载更多

No transaction aspect-managed TransactionStatus in scope

No transaction aspect-managed TransactionStatus in scope 如果当前事务操作的实现所在方法没有开启事务,就会报出这样的异常。 例如你在A方法调用B方法,B方法开启了事务,A方法没有开启事...

嘴角轻扬30
13分钟前
1
0
SpringBoot整合Redis Lettuce

最近在准备集成的基础框架使用Spring Boot2搭建,其中Redis的支持不仅仅是丰富了它的API,更是替换掉底层Jedis的依赖,取而代之换成了Lettuce(生菜) jedis跟lettuce的区别 Lettuce 和 Jedis ...

lemonLove
20分钟前
1
0
mysqldumpslow 慢查询日志分析工具

首先得配置my.cnf: #====================================================================================================================##=====================================......

吴伟祥
20分钟前
2
0
如何基于阿里云搭建适合初创企业的轻量级架构?

----基于阿里云搭建的适合初创企业的轻量级架构 前言 在项目的初期往往存在很多变数,业务逻辑时刻在变,而且还要保证快速及时,所以,一个灵活多变、快速部署、持续集成并可以适应多种情况的...

阿里云云栖社区
21分钟前
1
0
SpringBoot基础教程4-1-1 使用JdbcTemplate操作数据库及事务管理

1 概述 SpringBoot封装的JdbcTemplate,使用模板模式,去除JDBC繁琐的重复代码,并提供了基于注解的事务管理;下面详细介绍如何使用JdbcTemplate操作数据和事务管理。 2 添加依赖 <dependenc...

Mkeeper
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部