`

Velocity初始化过程解析

阅读更多

Velocity初始化过程解析

 

Velocity是一个表示层的模板框架,作为jsp的替代者,有着很多优势。小巧方便,不必使用el或者其他表示层技术来展示页面,感觉是一个很新颖的技术。

Velocity作为MVC框架中的V存在,和普通jsp页面有着不同,它是一种template引擎,利用先编辑完的格式来作为大纲,把一些需要变化的地方作为参数传入,显示时将模板和参数合并,达到最终输出的样子。本文使用目前最新的velocity1.6.2.jar包进行解析。

 

最根本的velocity就是由templateenginecontext组成。

1、首先创建一个template(如果是用在web上就是一个html文件),将需要参数化或实例化的地方用跟context有关的符号标记出来,标记时使用velocity template language。而template应该可以是任意的文本。

2、给context设定一些值,这些值用来替换在template中被标记的地方。

3、利用enginetemplate中需要替换的地方用context中的值替换掉,也就是所谓的merge,从而得到该模板的实例。

 

简单的用java代码来输出就是:

 

VelocityEngine velocity = new VelocityEngine();

VelocityContext context = new VelocityContext();

context.put("name""czy");

Template template = velocity.getTemplate("/src/main/resources/test.vm");

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

template.merge(context, writer);

writer.flush();

writer.close();

 

至于我们为什么使用VelocityEngine 而不是使用Velocity类,或者说两者有什么区别,请看VelocityEngine Velocity类解析

 

    我们假设使用普通的velocityEngine来作为引擎,来进入初始化的过程。

Velocity的初始化有多种方式:

1init()

2init(Properties p)

3init(String propertiesName)

 

第一种init()方式是最简单的方式,当我们的程序没有配置类似velocity.properties这样的文件的时候,就会使用默认的配置文件来初始化,默认的配置文件的位置在

org/apache/velocity/runtime/defaults/velocity.properties

而将Velocity应用在WEB的时候,默认的配置文件使用的是

org/apache/velocity/tools/view/velocity.properties

 

在初始化前,velocity会把配置文件的属性和值读取后保存在内存中,初始化时,velocity将会初始化以下几个方面:

 

1Logging System 日志系统

2ResourceManager 资源加载器

3EventHandler 事件句柄

4Parser Pool 解析池

5Global Cache 全局缓存

6Static Content Include System

7Velocimacro System 宏

 

1、Logging System

顾名思义,是进行日志的初始化工作,Veloicty会使用LogManager来默认创建一个LogChute的实例。Velocity早些时候是使用LogSystem来作为日志的接口,而现在则使用LogChute。第一个最初最初的默认实例叫做HoldingLogChute,其实里面就是一个Vector来保存信息,用来作为初始化日志系统的日志实例,呵呵,很拗口。

在创建了第一个系统内置的日志实例后,才会开始真正的创建日志系统,velocity会根据配置文件里的信息,查找一个名叫runtime.log.logsystem的属性,一旦配置文件中有配置这个属性,则会开始去创建日志系统。当velocity没有配置runtime.log.logsystem这个属性的时候,则会继续寻找runtime.log.logsystem.class这个属性,默认的velocity.properties配置文件中,这个属性的值按顺序依次为

1、AvalonLogChute 

2、Log4JLogChute

3、CommonsLogLogChute

4、ServletLogChute

5、JdkLogChute

当然,velocity不会使用那么多个日志系统,只会使用第一个能实例化的日志系统。

如果之前的创建工作都失败的话,那么意味着用户没有设置值或者是没有找到类,velocity将会使用系统统默认的SystemLogChute来输出日志,这个日志系统使用System.err方式输出日志。

一旦使用runtime.log.logsystem或者runtime.log.logsystem.class属性创建日志系统成功后,velocity就会把HoldingLogChute替换成新的日志系统。这样,日志的初始化才真正的结束。

 

2、ResourceManager

资源加载器是velocity加载资源使用的一个工具。

Velocity的配置文件里有个属性叫Resource.manager.class默认的class

org.apache.velocity.runtime.resource.ResourceManagerImpl

Velocity会尝试初始化ResourceManagerImpl,其中会查找resource.loader这个属性,resource.loader这个属性是可以有多个的,每个Loader都会生效。

ResourceLoader一共有7种:

 

1ClasspathResourceLoader

2、DataSourceResourceLoader

3、FileResourceLoader

4、JarResourceLoader

5、StringResourceLoader

6、URLResourceLoader

7、WebappLoader

 

默认的是第3FileResourceLoader。除了第7webappLoadervelocity-tools包作为velocity的附属工具后来添加的,其余6个都velocity包自带的,已经足够满足大多数的需求,当然,如果觉得这些都不适用,你也可以自己实现一个。实现一个资源加载器,实际上很简单,只要继承ResourceLoader,实现它的几个方法就可以了。

所谓的资源加载器指的就是velocity读取文件的方法,有直接从文件读取的,有从jar包中读取的,也有从类路径中读取的,基本上只要自己重写getResourceStream方法就可以。

在初始化的过程中,会读取resource.manager.logwhenfoundresource.manager.cache.class这两个属性,同时,也会进行资源缓存的初始化操作。

 

3EventHandler

Velocity在渲染页面的时候,提供了不同的EventHanlder,供开发者callback。说白了就是Velocity渲染页面的不同工具,用户可以自定义响应的事件。Velocity提供了对模板解析过程事件的处理,用户可以响应模板产生的事件。 

 

org.apache.velocity.app.event.EventHandler,是一个最简单的接口。我们可以通过实现这个接口来处理页面上不同的信息。

以下是这个接口的一些扩展接口。

1)IncludeEventHandler

在使用#include(),#parse()语法的时候,允许开发修改include或者parse文件的路径(一般用于资源找不到的情况)

IncludeEventHandler有两个实现类,分别是IncludeNotFoundIncludeRelativePath

当找不到#include指令的文件时,IncludeNotFound类会去做一些处理,例如去增加一个eventhandler.include.notfound=notfound.vm的配置,当然,如果不存在notfound.vm,也会给出"Can't find include not found page"的提示。

2)InvalidReferenceEventHandler

当渲染页面的时候,一旦遇到非法的reference,就会触发此事件。开发者可以侦听此事件,用于错误的报告,或者修改返回的内容。

ReportInvalidReferences是它的一个实现类,用于报告无效的refenrences。如果在velocity的配置文件中使用了eventhandler.invalidreference.exception = true配置,在运行过程中碰到第一个无效的refenrences就会抛出ParseErrorRuntimeException异常,执行暂停。如果配置为false的话,则会将错误先收在InvalidReferenceInfo列表对象中,运行照旧。

3)MethodExceptionEventHandler

渲染模板,一旦发现调用的方法抛出异常的时候,就会触发此事件。允许开发者处理这个异常,输出友好信息或者抛出异常。必须返回一个值用于模板的渲染。 

4)NullSetEventHandler

当使用#set()语法,设置一个null值的时候,会触发此事件。目前Velocity官方没有提供默认实现

5)ReferenceInsertionEventHandler

当渲染变量(reference)的时候,就会触发此事件。允许开发者返回更加友好的值--一般用于内容的escape,比如HtmlEscape等。

 

4、Parser Pool

Velocity会使用类似线程池的机制来解析页面。配置的keyparser.pool.classparser.pool.size

默认的实现类为org.apache.velocity.util.SimplePoolVelocity

velocity启动需要创建模板解析器的个数默认20对一般用户来说足够了即使这个值小了,Velocity也会运行时根据系统需要动态增加(但增加的不会装入解析池中). 新增时会在日志中输出信息

 

5Directives

所谓的指令指的就是在页面上能用一些类似标签的东西。Velocity默认的指令文件位置在org/apache/velocity/runtime/defaults/directive.properties

在这个文件中定义了一些默认的指令,例如:

directive.1=org.apache.velocity.runtime.directive.Foreach

directive.2=org.apache.velocity.runtime.directive.Include

directive.3=org.apache.velocity.runtime.directive.Parse

directive.4=org.apache.velocity.runtime.directive.Macro

directive.5=org.apache.velocity.runtime.directive.Literal

directive.6=org.apache.velocity.runtime.directive.Evaluate

directive.7=org.apache.velocity.runtime.directive.Break

directive.8=org.apache.velocity.runtime.directive.Define

我们在vm文件中可以直接使用foreach等指令来让我们的页面更加的灵活。

 

5、Velocimacro(宏配置)

Velocity engine运行时,会载入一个全局的宏文件。所有模板都可访问文件(Velocimacros ). 这个文件位置在相对于资源文件的根目录下velocity默认的配置项为velocimacro.library = VM_global_library.vm

此外,还有一些其他配置来处理宏的不同使用情况,例如:

velocimacro.permissions.allow.inline = true定义在模板中是否可用#macro()指令定义一个新的宏默认为true,表示所有的vm都可以新建宏,但是要 注意可能会把全局的宏配置给替换掉。

velocimacro.permissions.allow.inline.to.replace.global = false控制用户定义的宏是否可以可以替换Velocity全局宏。

velocimacro.library.autoreload = false控制宏是否自动载入。当值true将根据是否修改而决定是否需要重新加载,这个特性可在调试时很方便,不需重启你的服务器

 

 

此之外,还有些组件:

Anakia:一个示例应用,该应用允许不使用xsl处理xml

Application servers:对所有主流的serversservlet提供了支持,比如有一个VelocityServlet类。

 

 

 

 

<!--EndFragment-->

分享到:
评论

相关推荐

    Velocity模板解析

    - `Velocity.init()`初始化引擎,`Velocity.evaluate()`或`Velocity.mergeTemplate()`用于处理模板并生成输出。 4. **模板继承与导入** - 使用`#include`或`#parse`指令引入其他模板文件,实现模板复用。 - `#...

    SpringBoot Velocity 代码生成模板

    Spring Boot作为一款轻量级的框架,简化了初始化和配置过程,而Velocity则是一个强大的模板引擎,允许开发者自定义生成代码的样式和结构。 在Spring Boot项目中,利用Velocity模板引擎,我们可以创建一系列模板文件...

    velocity生成静态页面实例

    我们可以创建一个Java类,初始化这个上下文,将需要的数据放入其中: ```java VelocityContext context = new VelocityContext(); context.put("title", "My Webpage"); context.put("username", "John Doe"); ...

    velocity的所有jar包

    其中包含了许多关键组件,如`VelocityContext`(用于存储模板变量)、`Template`(表示模板文件)和`VelocityRuntime`(初始化并管理Velocity环境)。 3. **avalon-logkit-2.1.jar**:Avalon LogKit是Apache软件...

    velocity入门使用教程

    然后,在Java代码中初始化Velocity引擎,并通过Velocity引擎读取模板文件,再将Java对象数据传入模板,最终合并生成最终的文本输出。 具体实现步骤如下: 1. 创建模板文件hello.vm,在文件中定义输出内容,比如...

    velocity相关问题

    **Velocity初始化过程** 在实际应用中,我们需要对Velocity进行初始化以准备使用。这个过程可以通过以下步骤进行: 1. **导入依赖**:首先确保项目中包含了Velocity的相关库,如`velocity-engine-core`。 2. **...

    JAVAEE Velocity例子工程

    `VelocityTest` 文件可能是项目中的主要源代码文件,它可能包含了初始化Velocity上下文、加载模板和渲染输出的过程。例如,它可能有以下代码片段: ```java VelocityContext context = new VelocityContext(); ...

    velocity例子

    - 初始化Velocity:在Java代码中,使用`Velocity.init()`方法初始化Velocity引擎,并加载配置文件。 - 设置上下文:通过`VelocityContext`对象将Java对象添加到上下文中,以便在模板中使用。 - 渲染模板:调用`...

    velocity+itext导出pdf

    2. **初始化 Velocity**:在Java代码中,需要导入`org.apache.velocity.app.VelocityEngine`并实例化,配置Velocity的属性,如模板路径、缓存策略等。 3. **设置上下文**:创建一个`VelocityContext`对象,将需要在...

    Velocity文档和NVelocity类库

    NVelocity提供了一系列API,使得.NET开发者可以方便地初始化、解析和合并模板。以下是一些关键的API: 1. `VelocityContext`: 这是上下文对象,用于存储数据,这些数据在模板中可以通过变量引用访问。你可以通过`...

    Mastering.Apache.Velocity

    - **初始化 Velocity**:通过 Velocity 的 API 初始化引擎,并配置相关的属性。 #### 七、Velocity 的高级功能 1. **国际化支持**:Velocity 支持多语言和国际化,可以方便地切换不同语言版本的模板。 2. **错误...

    Velocity_API

    首先,需要初始化 Velocity 运行时环境: ```java Properties props = new Properties(); props.setProperty("runtime.log.logsystem.class", "org.apache.velocity.runtime.log.SimpleLog4JLogSystem"); props.set...

    velocity经典4pdf中文教程

    它介绍了Velocity Engine的API,包括初始化、渲染模板、数据模型的构建等。同时,书中还会讲解如何利用Velocity进行模板测试,以及在大型项目中的性能优化策略。 通过学习这四本书,开发者不仅可以掌握Velocity的...

    velocity-1.6.zip

    1. **创建引擎实例**:通过`org.apache.velocity.app.VelocityEngine`初始化Velocity引擎。 2. **设置配置**:配置Velocity,例如模板路径、缓存策略等。 3. **加载模板**:使用引擎加载模板文件。 4. **填充上下文*...

    velocity示例

    3. **初始化Velocity**:通过调用`Velocity.Init()`方法初始化Velocity引擎。 4. **获取模板**:使用`Velocity.GetTemplate`方法获取指定名称的模板。 5. **创建上下文对象**:创建一个`VelocityContext`对象用于...

    velocity 配置jar包

    - **事件处理器(Event Handlers)**:Velocity 提供了一套事件处理机制,允许你在模板解析和渲染过程中进行干预。 ### 4. 注意事项 - 在 Velocity 中,空格和缩进都会被输出,因此在编写模板时需要注意格式。 - ...

    velocity的简单demo

    在这个示例中,`VelocityDemo`类创建了一个`VelocityEngine`实例,初始化了`VelocityContext`并添加了两个变量:`name`和`color`。接着,它从资源文件夹中加载了`welcome.vm`模板,并使用`merge`方法将上下文中的...

    velocity模板路径

    - 在 Velocity 中,模板路径通常在初始化 Velocity Engine 时通过 `Properties` 对象进行配置。例如: ```java Properties velocityProperties = new Properties(); velocityProperties.setProperty("resource....

Global site tag (gtag.js) - Google Analytics