jFinal如何支持velocity的toolbox?

Alex.yang 发布于 2012/06/05 16:18
阅读 725
收藏 2

    我现在需要用到toolbox中的DateTool,但在配置velocity的toolbox的时候有一些问题,我的jFinal默认用的 velocity的render,我看过VelocityRender类中的代码,是直接通过Template去merge的,我猜 VelocityViewServlet中也肯定会有这样的逻辑,所以我是不是可以在VelocityRender中集成toolbox呢?

    我本想定义一个CustomVelocityRender继承VelocityRender,然后覆盖render方法,通过 ToolboxManager 的方式引入toolbox,但是发现VelocityRender这个类不是public的。。。头疼。然后我又去继承Render这个类,发现 RenderFactory.getServletContext()方法也不是public的,,真是一点扩展的机会都不给啊。这样的设计是为什么呢

    通过web.xml配置VelocityViewServlet的话,只能是浏览器请求*.vm的时候请求才会被VelocityViewServlet 处理,但通过jFinal后我的请求都是/user/add这样的,然后在Render中会render('user.html'),这样的话请求就不会 通过VelocityViewServlet,所以通过这个servlet集成的toolbox也就不会生效。。请问应该怎么处理呢

以下是问题补充:

@Alex.yang:我的想法是像这样去实现: http://charr-trying.googlecode.com/svn-history/r293/hxcms/trunk/src/java/charr/util/VelocityUtils.java (2012/06/05 16:24)
加载中
2
a
alvinte

VelocityRender不是public,但是也不是final的啊,default可以在同一个包内继承啊。

自己做一个com.jfinal.render.CustomVelocityRender不就行了

Alex.yang
Alex.yang
对,我现在是这么处理的,但是还是要改一下RenderFactory这个类,才可以不去修改现在的业务代码
2
a
alvinte

其实源码都有的,你完全可以不用继承,自己写一个render也完全可以,反正是用的时候也是render(new Myrender())。

为什么说不给扩展的机会呢。只是扩展点不在于此而已。你继承了VelocityRender也对框架内部的调用没有任何影响,所以此处没有扩展的意义。

1
JFinal
JFinal
创建YourVelocityRender 并继承自 Render抽象类可以集成velocity的Toolbox,而不是去继承自VelocityRender。可以使用JFinal.me().getServletContext()来获取 servletContext。 render包下的render现在都是非public的,主要是因为我有一个设计习惯,尽量让所有东东保持最小可见性,当然,有时开发者可能需要扩展,如果扩展的理由非常充分,肯定会开放的。最保险的开放是接口与抽象类的开放,如果我开放XxxRender的话,假如将来我改或删这些Render会对你的代码造成影响,而你完全基于接口与抽象类来做是安全的
m
moke44@sohu.com
回复 @Alex.yang : 请问你是怎么扩展VelocityRender呢?
JFinal
JFinal
回复 @Alex.yang : 这样吧,一直以来我也想过开放 DefaultRenderFactory这个接口,正好你有这个需求,我今晚改下设计,让你可以这样 render(...) 而不用 render(new YourRender(...))
Alex.yang
Alex.yang
需要修改一下RenderFactory这个类,然后自定义一个YourVelocityRender,这样的话还是要改动源代码
返回顶部
顶部