基于Velocity开发自己的模板引擎

Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只 关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提 供了便利,同时也为我们在JSP,PHP和Freemarker之外又提供了一种可选的方案。

大多数开发人员只了解上述部分,即Velocity可以作为MVC的V,所以出现了很多Velocity和SpringMVC,Velocity和Struts集成的设计。但少有人关注,Velocity作为模板引擎的意义,既然是模板引擎,那它就不应该仅仅局限在MVC的领域。

Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当 作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。

以下代码,是我对Velocity的简单封装,可以将Velocity作为单独的组件来使用,稍加丰富就可以成为我们应用的模板引擎。

核心代码:

package com.ths.platform.framework.template;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.Properties;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;

public class VelocityParser
{
    //模板上下文
    private VelocityContext mainContext;
    //模板对象
    private Template mainTemplate;
    //模板引擎
    private VelocityEngine velocityEngine;
    //模板引擎初始化参数
    private  Properties properties;

    public static void main( String[ ] args ) {
        String filepath = "template/view.jsp";
        VelocityParser velocityParser = new VelocityParser( filepath );
        velocityParser.addToContext( "title" , "HelloWorld" );
        velocityParser.processTemplate( );
    }

    /**
     * @MethodName	: addToContext
     * @Description	: 向模板上下文中添加参数
     * @param key
     * @param value
     */
    public void addToContext( String key, Object value ) {
        if ( mainContext == null )
        {
            mainContext = new VelocityContext( );
        }

        mainContext.put( key , value );
    }

    /**
     * @MethodName	: addToContext
     * @Description	:初始化模板上下文
     * @param chainCtx
     */
    public void addToContext( VelocityContext chainCtx ) {
        mainContext = new VelocityContext( chainCtx );
    }

    /**
     * @MethodName	: processTemplate
     * @Description	: 输出到控制台
     */
    public void processTemplate() {
        try
        {
            BufferedWriter writer = new BufferedWriter( new OutputStreamWriter( System.out ) );
            if ( mainTemplate != null )
            {
                mainTemplate.merge( mainContext , writer );
            }

            writer.flush( );
            writer.close( );
        }
        catch ( Exception ex )
        {
            ex.printStackTrace( );
        }
    }

    /**
     * @MethodName	: processTemplate
     * @Description	: 输出到文件
     * @param destPath
     */
    public void processTemplate(String destPath) {
        try
        {
            OutputStream os = new FileOutputStream(destPath);
            OutputStreamWriter writer = new OutputStreamWriter(os, "UTF-8");

            if ( mainTemplate != null )
            {
                mainTemplate.merge( mainContext , writer );
            }

            writer.flush( );
            writer.close( );
        }
        catch ( Exception ex )
        {
            ex.printStackTrace( );
        }
    }

    /**
     * 根据模板文件初始化模板引擎
     * @param templateFile
     */
    public VelocityParser( String templateFile ) {
        try
        {
            //新建模板引擎
            velocityEngine = new VelocityEngine( );

            //获取初始化参数
            properties = initProperties( );

            //初始化模板引擎
            velocityEngine.init( properties );

            //获取模板对象
            mainTemplate = velocityEngine.getTemplate( templateFile );

        }
        catch ( Exception ex )
        {
            System.out.println( "Error processing template file: " + templateFile );
        }
    }

    /**
     * 根据模板文件和模板上下文(参数)初始化模板引擎
     * @param templateFile
     * @param chainContext
     */
    public VelocityParser( String templateFile , VelocityContext chainContext ) {
        try
        {
            //新建模板引擎
            velocityEngine = new VelocityEngine( );

            //获取初始化参数
            properties = initProperties( );

            //初始化模板引擎
            velocityEngine.init( properties );

            //获取模板对象
            mainTemplate = velocityEngine.getTemplate( templateFile );

            //设置模板上下文
            mainContext = chainContext;

        }
        catch ( Exception ex )
        {
            System.out.println( "Error processing template file: " + templateFile );
        }
    }

    /**
     * @MethodName	: initProperties
     * @Description	: 设置初始化参数
     * @return
     */
    private Properties initProperties() {
        Properties properties = new Properties( );
        //设置从classpath中加载模板文件
        properties.setProperty( Velocity.FILE_RESOURCE_LOADER_PATH , Thread.currentThread( )
                .getContextClassLoader( ).getResource( "" ).getPath( ) );
        //解决模板中文乱码
        properties.setProperty( Velocity.INPUT_ENCODING , "utf-8" );
        properties.setProperty( Velocity.OUTPUT_ENCODING , "utf-8" );
        return properties;
    }

}

模板:

 <table>
 <tr><td>$title</td></tr>
 </table>

执行main方法,即可在控制台输出模板和参数合并后生成的数据。

有了这段代码,只要开发过程中,再涉及到重复劳动,再涉及到输出什么报告,只要你能抽取出模板,其他工作,就让它滚犊子去吧。

时间: 2024-10-17 16:46:54

基于Velocity开发自己的模板引擎的相关文章

开发自己的模板引擎

自定义模板引擎类 MyTpl.class.php 1 <?php 2 class MyTpl 3 { 4 private $tpl_vars = array(); 5 //分配 6 public function assign($key,$value){ 7 $this->tpl_vars[$key] = $value; 8 } 9 public function display($tpl){ 10 $contents = file_get_contents($tpl); 11 foreach

一些基于jQuery开发的控件

基于jQuery开发,非常简单的水平方向折叠控件.主页:http://letmehaveblog.blogspot.com/2007/10/haccordion-simple-horizontal-accordion.html (无法找到)下载:http://letmehaveblog.blogspot.com/2007/10/haccordion-simple-horizontal-accordion.html 示例:http://letmehaveblog.blogspot.com/2007

[JavaWeb基础] 019.Velocity 模板引擎简单示例

1.什么是Velocity 一种J2EE的前端模版技术,和JSP,Freemarker差不多,都是用来展示网页内容的.和JSP不同的是velocity只能显示Action中的数据,不能处理数据.不能写java代码,但是可以使用Velocity标记.也就是说把显示代码和后端的JAVA代码分离开来,降低程序的耦合性 2.需要引入哪些Jar包 velocity-1.5.jar,velocity-1.6.2.jar,velocity-tools-2.0.jar,velocity-tools-generi

JS模板引擎:基于字符串拼接

目的 编写一个基于字符串拼接的js模板引擎雏形,这里并不会提供任何模板与数据的绑定. 基本原理 Javascript中创建函数的方式有多种,包括: 1. var func = function () {...} 2. function func () {...} 3. var func = new Function (...); 其中new Function的方法给到了我们很大的自由度,比如: var func = new Function('a', 'b', 'return a+b;'); f

高性能跨语言模板引擎Crox

http://thx.github.io/crox/ Crox是一个由JavaScript语言实现的高性能跨语言模板引擎.Crox模板可以直接在JavaScript环境中使用,也可以翻译成PHP,JSP等其他编程语言的可执行方法或翻译成Velocity,Smarty等其他模板引擎的源模板,Crox将保证翻译后的结果具备最佳执行效率. 在生产系统中,我们使用的各种前后端模板引擎多有其独到的一面,而Crox的特点即它是面向"跨语言并高性能"这个目标设计的,Crox的设计过程是在模板提供的功

TinyTemplate模板引擎火热出炉,正式开源了

涉水模板引擎领域,纯属不小心.在此对以下人员表示强烈感谢与致敬:@sub jetbrick作者@sept@webit webit作者@罗格林 rythm作者@闲.大赋 beetl作者以及许许多多虽然没有列出来,但是在我写tinytemplate时帮助过我的人. 序言 本来是没有自己写一个模板引擎的计划的,因为按我的理解,一直认为这种“语言”级的引擎,难度是非常大的.总感觉自己的水平不够,因此不敢有这个念头.直到大量使用Velocty的时候,碰到velocty诸多不尽如人意的地方,但是又无能为力,

前端模板引擎入门

模板引擎 模板引擎 起到 数据和视图分离的作用, 模板对应视图, 关注如何展示数据, 在模板外头准备的数据, 关注那些数据可以被展示. 后端模板引擎 freemarker 如下介绍,  java后台的模板引擎, freemark介绍,其图能很好标明这种关系. http://freemarker.org/ Apache FreeMarker is a template engine: a Java library to generate text output (HTML web pages, e

10 个强大的JavaScript / jQuery 模板引擎推荐

模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档.由于在开发过程中,网站或应用程序的界面与数据实现分离,大大提升了开发效率,良好的设计也使得代码重用变得更加容易.本文整理了10 款基于JavaScript和jQuery的模板引擎,希望能对你的开发工作带来一些帮助. 1. NANO 最简单的jQuery模板引擎,完美实现对JSON的解析. 源码 / 演示 2. The "template" binding 该工具通过渲染模板将相关联的DOM元素组织到一起.

高性能JavaScript模板引擎原理解析

随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来.javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在开源社区中更是百花齐放,在 Twitter.淘宝网.新浪微博.腾讯QQ空间.腾讯微博等大型网站中均能看到它们的身影. 本文将用最简单的示例代码描述现有的 javascript 模板引擎