文档章节

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

laichendong
 laichendong
发布于 2014/06/25 09:27
字数 908
阅读 931
收藏 8
点赞 0
评论 5

一、发现

在写一个基于模板的代码生成器(我叫她——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
粉丝 8
博文 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模板引擎进行项目页面输出时发现代码中为了可读性进行的缩进等都反应到了实际输出的页面中,导致页面的结构不整齐,出现了很多的空白,就像下面的这样: #set($colors = [...

山哥 ⋅ 2013/08/31 ⋅ 4

Velocity处理多余空白和多余空白行问题

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

山哥 ⋅ 2013/08/30 ⋅ 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 ⋅ 17

进一步提升 Struts 2 对 Velocity 的支持力度

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

红薯 ⋅ 2008/10/05 ⋅ 0

Java模板引擎 HTTL

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

kevin728971010 ⋅ 2016/11/07 ⋅ 0

Java模板引擎--HTTL

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

梁飞 ⋅ 2011/09/14 ⋅ 5

Velocity使用手册

一、基本语法 1、“#”号用来标识Velocity脚本语言,包括#set、#if....#else....#end、#foreach......#end、#include、#parse、#macro等。 常用标签有#if() #else #end、#if# end、#foreach(...

Nemo ⋅ 2015/11/24 ⋅ 0

模板引擎 Velocity Engine 发布 2.0 版本

模板引擎 Velocity Engine 2.0 已发布,更新如下: 主要的新功能和增强: 改用 SLF4J 日志库 可配置的对空白内容进行去除 方法参数和数组下标可以使用算数表达式 可配置方法参数的数据类型转...

局长 ⋅ 2017/08/09 ⋅ 54

velocity语法教程

Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可...

lao5net ⋅ 2014/03/25 ⋅ 0

改造Velocity模板引擎让$[!]{}输出默认进行html转义,并增加$#{}语法支持不转义输出

一直以来在项目中使用Apache Velocity模板引擎作为视图层输出,为了解决XSS漏洞,需要对输出到页面的内容进行HTML转义,我一般采用2种方式实现: 使用过滤器 Filter,在其中进行 HttpServle...

山哥 ⋅ 2014/11/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

前言 我是上学期学的汇编,因为有vs又不想用课上教的麻烦的dosbox以及masm32,但是一直没找到高亮插件和能调试的(难在运行不了而找不到答案上,出现的错误在最后放出,还请先达们不吝指点)...

simpower ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 昨天 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 昨天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 昨天 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 昨天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 昨天 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部