Velocity增加自定义标签的方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Velocity的自定义标签
Velocity是当前我们用得最多的模板,其好处和使用方法非常丰富,网上一大堆,这里就不介绍了,需要的去网上搜索即可。这里重点介绍一下velocity的自定义标签及使用方法。自定义标签有两种方式:宏和java自定义工具
Macro
宏其实就是velocity已支持的所有标签的组合,好处是方便快捷,可以递归,可以写复杂的方法,如下便是一个递归遍历树的宏,不足之外是只有利用现有的数据进行组合,方法也仅限于velocity提供的几个标签。实现方式有两种,1,直接写在使用的页面上,这样只有当前页可用。2,写在macro.vm里面,这样所有的页面都可以使用。
调用调用方法:#categoryTree($node)和velocity提供的原生的方法一样,括号里面是参数
自定义标签
流程
代码
写java代码,代码需要继承Directive,示例代码如下。
getName接口用来告诉velocity这个函数名是什么,也就是页面上调用这个函数的名称,比如#hellofun();
getType接口用来告诉velocity这个函数类型,可以是行也可以是块函数;
reder接口用来输出html代码,当然也可以不输出,如果需要输出,则使用入参的
writer.write("some html");context是当前velocity的容器,可以取调用vm中的变量,比如在
页面上使用#set($name="bwong"),可以通过context.get("name")取出"bwong",node里面可以取出调用这个函数时的入参,比如#hellofun("a"),通过node.jjtGetChild(0).value(context)
取出"a",所以: writer.write("hello " + node.jjtGetChild(0).value(context)); 就可以输出"hello xxx",xxx是调用这个函数时的入参。
render就可以通过使用java的所有工具和类了,实现起来会丰富得多。
配置
配置起来非常简单。在velocity.properties配置文件中加入
userdirective=youpackage.HelloFun,youpackage.OtherUtil
多个工具用”,”隔开。
调用
#hellofun("a")
使用场景及示例
作为velocity原生标签的补充,自定义标签可以轻松的自种自定义的功能。宏更多的用户对现有的数据进行丰富的组装。如基础的分页功能,文字展示特殊化等。Java自定义标签更多的是做一些宏无法实现的功能,也可以做一些公共的展示及取数的功能。
一次公共类目的展示
需求:左边的知识目录是所有页面都要显示的,但是其内容是动态的,也有可能会因人页异,中间才是各个正在进行的业务。不可能给每个正在进行的业务都要把这些东西都操作一遍,如果能够使用velocity的一个标签调用,就最好不过了。
操作流程
1,自定义一个处理类,并配置以实现联通
配置文件:
userdirective=com.jd.jr.contentManager.util.VelocityControllUtil
2,调用spring的bean,获取左边信息
因为VelocityControlUtil不是Spring管理的类,所以不能直接使用注解的方式来载类,但是可以直接用静态方法来获取Spring的bean。方法如下
1,定义一个SpringUtil,实现ApplicationConextAware,并在配置文件中流入此对象
调用方式如下:
((CategoryBiz)SpringUtil.getBean("categoryBiz")).buildCategoryTree()
3,使用velocityEngine引擎组装数据并返回
因为VelocityControlUtil的Writer只处理String,所以如果纯拼接String 还是有点复杂,这个时候可以用VelocityEngine暄染的方式,方法如下:
其中volocityEngine定义为:private static final
VelocityEngine velocityEngine= new VelocityEngine();params为需要渲染的参数,vimStr为需要渲染的模板。模板里支持所有的Velocity语法,可以放心使用。