说明一下,我在项目中用的就是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简洁呢?
文章取这个标题,只是用来吸引大家眼球的噱头 :)
下面是让我感到困惑的几个问题,欢迎大家踊跃提出解决方案!谢谢!
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 要快哦.
分页也写成了宏.. 页面元素也封装. 比如 <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 要快哦.