不用Velocity的十个理由与辩解

说明一下,我在项目中用的就是Velocity,可以说非常熟悉了。
文章取这个标题,只是用来吸引大家眼球的噱头 :) 

下面是让我感到困惑的几个问题,欢迎大家踊跃提出解决方案!谢谢!

1. 可用的组件太少。 分页都要自己写。 更别说类似于JSP中的 extreme component了。绝对的硬伤。

2. 用起来不方便,跟JSP一样,#if, #else 漫天飞

3. 当JVM的资源降低时,会发生无法生成正常的页面情况。最常见的是图片显示不完全。很难看。

4. 不支持常量访问。 比如某个类的常量 SomeClass.CONST1,不能直接访问,需要增加个丑陋的 getCONST1()方法,
然后在velocity-toolbox.xml(或类似名称文件)中增加一个类声明才行。
直接导致的情况是vm中几乎都是魔法数MagicNumber

5. 与JSP不同,无法支持 import,只能在toolbox 中进行引用。引用的类必须是 static 类型。 用起来就怀念JSP中随意的 new 了。

6. 需要页面自动跳转时,JSP的 response.sendRedirect...很方便。而VM则需要…… 本问题最常见于访问某个 index.xxx 时,上头提出一个自动跳转的功能。使用js来跳转速度又非常慢,所以只能求__助于JSP。(或者写个 *.do 或者 *.view,用servlet中的response 进行跳转)

7. Velocity1.4 与1.5 所支持的东西不同。前者不支持SET,MAP,如果参考官方的文档,会让人死都不知道怎么死的。
另外1.4也不支持定义在单独某个VM中的Macro. 如果遇到个复杂的页面想用Macro来表示,而这个系统又属于集成阶段,
不让修改对应的macro配置文件,会非常麻烦。

8. 注释会出现BUG。在 1.4 版本中验证存在。 官方宣称的 ## 单行注释, #* *# 多行注释,都有BUG。
单行的BUG:  比如     XXXX(正常代码)  ##(注释代码)  会出问题。
比如   #*    ...  *#  多行注释时,会有出现注释无效的情况,页面会把 #* ... 一起渲染出来。
我一般都是  <!-- #* .. *# --> 这样来注释。无奈啊。

9. velocity 中页面的变量只能是 String 型。 所以当你想比较两个数字的话,还需要 a.toString().equals(b.toString())。而在JSP中仅仅  == 就可以了。也就是说,当你在VM中遇到两个变量的相等比较时出现诡异错误时,把它们toString()然后在equals()比较是肯定可以的。

10.  $var 与 <%= var %> 有区别吗? 为什么就觉得JSP不如Velocity简洁呢?


当JVM资源降低,或者JVM得不到足够的资源时, VM会渲染不正常,而JSP就不会。 你能说不关vm鸟事吗?

另,vm 渲染不正常的情况包括:  css 显示不对, div 不对, 图片无法显示。



---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

辩解

1. 可用的组件太少。 分页都要自己写。 更别说类似于JSP中的 extreme component了。绝对的硬伤。

这个确实是这样的,这也是我选择freemaker的原因。
sg552 写道

2. 用起来不方便,跟JSP一样,#if, #else 漫天飞

难道还有什么东西不需要if else的吗,不过你是jsp,velocity还是freemaker,都需要,这不管velocity的事
sg552 写道

3. 当JVM的资源降低时,会发生无法生成正常的页面情况。最常见的是图片显示不完全。很难看。

很难想象这管velocity什么事,图片不能显示,即使你用jsp,jvm资源不够的话图片还是不能显示啊,两码事


5. 与JSP不同,无法支持 import,只能在toolbox 中进行引用。引用的类必须是 static 类型。 用起来就怀念JSP中随意的 new 了。

这个我记得我们讨论过,随意在jsp中new并不是一个好习惯,会给重构,维护等等带来很大的麻烦。


6. 需要页面自动跳转时,JSP的 response.sendRedirect...很方便。而VM则需要…… 本问题最常见于访问某个 index.xxx 时,上头提出一个自动跳转的功能。使用js来跳转速度又非常慢,所以只能求__助于JSP。(或者写个 *.do 或者 *.view,用servlet中的response 进行跳转)

这个就更说不通了,你一会说redirect,一会又说js,根本两回事,jsp里写response.sendRedirect和servlet里写response.sendRedirect是一样的,和js不搭界。

9. velocity 中页面的变量只能是 String 型。 所以当你想比较两个数字的话,还需要 a.toString().equals(b.toString())。而在JSP中仅仅 == 就可以了。也就是说,当你在VM中遇到两个变量的相等比较时出现诡异错误时,把它们toString()然后在equals()比较是肯定可以的。
你可以用 #if ("$!{number}" == "1") 这种方式
我们现在用的就是velocity. 那叫一个方便.所有的页面公共元素都抽取成template
分页也写成了宏.. 页面元素也封装. 比如 <input type="text" ...../> 直接 #inputText(name. value) .页面代码很简洁.
公用组件都在一个velocityContext. 任何页面都可以引用. 所有对字符串和 数据基本类型的操作全都放context当中.
甚至能将dao 对象也put到环境中.直接在页面上引用.  可以有效果的避免hibernate session closed 的问题.
其实jsp 有jsp 的好. velocity有velocity的好.  看情况拉. 如果有很多页面都是一样的公用的为什么不用velocity呢?
而且貌似曾经有人测试过. velocity 的渲染速度好像比jsp 要快哦.


10.  $var 与 <%= var %> 有区别吗? 为什么就觉得JSP不如Velocity简洁呢?

看看两者字符的多少就知道了



我们现在用的就是velocity. 那叫一个方便.所有的页面公共元素都抽取成template
分页也写成了宏.. 页面元素也封装. 比如 <input type="text" ...../> 直接 #inputText(name. value) .页面代码很简洁.
公用组件都在一个velocityContext. 任何页面都可以引用. 所有对字符串和 数据基本类型的操作全都放context当中.
甚至能将dao 对象也put到环境中.直接在页面上引用.  可以有效果的避免hibernate session closed 的问题.
其实jsp 有jsp 的好. velocity有velocity的好.  看情况拉. 如果有很多页面都是一样的公用的为什么不用velocity呢?
而且貌似曾经有人测试过. velocity 的渲染速度好像比jsp 要快哦.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧米优

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值