Velocity工作原理解析

Velocity相比较于JSP和Freemark的优点是语法类似于Java,对于Java使用者学习成本很低,还有就是可以面对复杂的设计开发

Velocity总体结构

选择Velocity就是看中它的简单,易扩展。

  • Velocity由app、context、runtime和一些辅助util构成
    在这里插入图片描述
    app主要封装一些接口给使用者使用,主要是Velocity和VelocityEngine。
    • Velocity主要封装了一些静态接口,可直接调用,帮助渲染模板,只要传给Velocity一个模板和模板中的变量值就可以直接渲染。
    • VelocityEngine类主要供一些框架开发者调用,提供更加复杂的接口调用者使用,如在MVC调用Velocity可初始化一个VelocityEngine实例

Context木块主要封装了木板需要的变量:
- 便于与其他框架集成,起到一个适配器的作用,如MVC框架内保存的变量往往在一个Map中,这样MVC框架就需要将这个Map适配到Velocity的context中
- Velocity在内部做数据隔离,数据进入Velocity内部的不同模块需要对数据做不同的处理,封装不同的数据接口有利于模块之间的解耦。
在这里插入图片描述

整个Velocity的核心模块在runtime package下,这里将加载的模板解析成JavaCC语法树,Velocity调用mergeTemplate方法会渲染整棵树,并输出最终的渲染效果。

RuntimeInstance类为整个Velocity渲染提供了一个单列模式,也是Velocity的一个门面,封装了渲染模板需要的所有借口,拿到这个实例就可以完成渲染过程了。

JJTree渲染过程解析

Velocity渲染是从ASTproces开始,按照深度优先便利算法开始遍历整棵树。
Velocity的语法相对简单,总共有50多个。有以下几个类型:块节点类型、扩展节点类型、中间节点类型和叶子节点

#set语法

#set可以创建一个Velocity的变量,有效范围和context一致

Velocity的方法调用

Velocity通过ASTReference类表示一个变量和变量的方法调用,有ASTIdentifier和ASTMethod两种类型的方法调用,ASTIdentifier主要是表示隐式的“get”和“set”类型的方法调用,ASTMethod表示所有其他类型的方法调用

parse语法

#parse语法也是Velocity中十分常用的语法,作用是可以让我们对Velocity模板进行模块化,可将重复的模板抽取出来单独放在一个模板中,然后在其他模板中引入这个重用的模板,可增加模板的可维护性。

事件处理机制

Velocity的事件处理机制所涉及的类在org.apache.velocity.app.event下面,EventHandler是所有的类的父接口,有五个子类:

  1. ReferenceInsertionEventHandler
  2. NullSetEventHandler
  3. MethodExceptionEventHandler
  4. InvalidReferenceEventHandler
  5. IncludeEventHandler
    在这里插入图片描述

常用优化技巧

Velocity渲染模板时先把模板解析成一棵语法树,然后再去遍历树,分别渲染每个节点。

  1. 减少树的总节点数量
  2. 减少渲染耗时的节点数量

与JSP比较

JSP文件渲染机制与Velocity渲染机制不太一样,JSP文件实际上执行的是JSP对应的Java类,而Velocity是按照语法规则解析成一棵语法树,然后执行这课语法树来渲染结果。

  1. 执行方式不一样:JSP是编译执行,而Velocity是解释执行。
  2. 执行效率不同:编译效果要好于解释效果。JSP中方法是直接调用执行的,而Velocity中的方法调用是反射执行,所以JSP的效果会明显好于Velocity
  3. 环境支持不一样:JSP执行需要Servlet的运行环境,而Velocity不需要,直接给定Velocity模板就可以渲染出结果。所以Velocity不止应用在Servlet环境中

合成模式

合成模式又叫部分整合模式,把对象的关系映射到一棵树中,利用树的枝干和叶子节点描述单个对象和组合对象,从而构建统一的操作这些对象的接口,使得访问的方式更加简单。
在这里插入图片描述

  • Component:抽象角色,规定了树中的所有对象的共同接口和默认方法
  • Leaf:树中的叶子对象,这个对象没有关联的下级对象,实现了抽象角色的公共接口
  • CompositeL树中的树干对象,持有下级对象的引用关系,实现了抽象角色的接口方法

Velocity的合成模式的实现

Velocity中合成模式的使用在AST的抽象语法树中
在这里插入图片描述

解释器模式

将带有一定语法的语句解析成特定的数据结构,并提供一种解释功能,使得能够解释这个语句。完成两个功能:

  • 将带有一定规则的语句解析成带有等级关系的对象集合
  • 按照语法规则解释这个等级关系的集合
    在这里插入图片描述
  1. Component:抽象角色,规定了树中的所有对象的共同接口,一定包含一个能够解析的方法
  2. Terminal:终结符表达式,表示这个语法已经不能再被解释的表达式,要么是常量,要么是字符串
  3. Nontermina:非终结符表达式,通过递归的方式调用它所包含的非终结符或者终结符表达式
  4. Client:能够构造出抽象语法树,并且调用render接口解释语法树代表的语句

Velocity中解释器模式的实现

Velocity将所有的vm模板中的语句解析成一棵AST抽象语法树
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值