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

来源:互联网 发布:京东秒杀软件有用吗 编辑:程序博客网 时间:2024/04/30 06:19

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 ) {         this(templateFile , null);    }    /**     * 根据模板文件和模板上下文(参数)初始化模板引擎     * @param templateFile     * @param chainContext     */    public VelocityParser( String templateFile , VelocityContext chainContext ) {        try        {            //新建模板引擎            velocityEngine = new VelocityEngine( );                        //获取初始化参数            properties = initProperties( );            //初始化模板引擎            velocityEngine.init( properties );                        //获取模板对象            mainTemplate = velocityEngine.getTemplate( templateFile );                        //设置模板上下文              if(chainContext!=null){                //设置模板上下文                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方法,即可在控制台输出模板和参数合并后生成的数据。

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


9 2
原创粉丝点击