首页 > 代码库 > 基于Velocity开发自己的模板引擎

基于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方法,即可在控制台输出模板和参数合并后生成的数据。

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


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