Velocity工具-渲染自定义模板

自从有了Maven,一直在想使用模板技术搭建项目工程,其中之一就是日志的配置文件Log4j.xml,因为项目不同,日志的输出路径也是不同的。

 

因此,想在程序启动之前,以渲染的方式配置Log4j.xml文件内容,这样就实现了日志管理的模板化。

 

Velocity便是理想的选择,因此,写了个Velocity工具类VelocityHelper,专门用于渲染模板,并完成了测试。

 

/**  
 * Copyright (c) YMCN Team  
 * All rights reserved.  
 */
package com.aboy.toolkit.util;

import java.io.ByteArrayInputStream;
import java.io.CharArrayWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Writer;
import java.util.Map;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;

import com.aboy.toolkit.log4j.ConfigrationFactory;

/**
 * <pre>
 * Velocity引擎帮助类
 * </pre>
 * 
 * @author obullxl
 *
 * email: [email protected]  MSN: [email protected]  QQ: 303630027
 *
 * Blog: http://obullxl.iteye.com
 */
public class VelocityHelper {
    /** 单态实例 */
    private static final VelocityHelper instance = new VelocityHelper();

    /** 私有构造函数 */
    private VelocityHelper() {
        //初始化velocity的信息 主要设置一些Velocity的默认属性

        //初始化
        try {
            Velocity.init();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * <pre>
     * 取得实例
     * </pre>
     */
    public static VelocityHelper getInstance() {
        return instance;
    }

    /**
     * <pre>
     * 渲染:从reader到writer
     * </pre>
     *
     * @param context
     * @param writer
     * @param reader
     * @return
     */
    public boolean evaluate(Context context, Writer writer, Reader reader) {
        try {
            return Velocity.evaluate(context, writer, "", reader);
        } catch (Exception e) {
            throw new RuntimeException("velocity evaluate error! detail [" + e.getMessage() + "]");
        }
    }

    /**
     * <pre>
     * 通过Map过滤一个输入流
     * </pre>
     * 
     * @param map
     * @param reader
     * @return
     */
    @SuppressWarnings("unchecked")
    public InputStream evaluate(Map map, Reader reader) {
        try {
            // 把产生的输出流(字符流),转换成输入流(字节流)
            byte[] dataBytes = this.evaluateToWriter(map, reader).toString().getBytes();
            return new ByteArrayInputStream(dataBytes);
        } catch (Exception e) {
            throw new RuntimeException("velocity evaluate error! detial [" + e.getMessage() + "]");
        }
    }

    /**
     * <pre>
     * 通过Map过滤一个输入流
     * </pre>
     * 
     * @param map
     * @param reader
     * @return
     */
    @SuppressWarnings("unchecked")
    public Writer evaluateToWriter(Map map, Reader reader) {
        try {
            VelocityContext context = convertVelocityContext(map);
            CharArrayWriter writer = new CharArrayWriter();
            //开始评估
            this.evaluate(context, writer, reader);

            return writer;
        } catch (Exception e) {
            throw new RuntimeException("velocity evaluate error! detail [" + e.getMessage() + "]");
        }
    }

    /**
     * <pre>
     * 取得Velocity系统属性
     * </pre>
     * 
     * @param key
     * @return
     */
    public Object getProperty(String key) {
        return Velocity.getProperty(key);
    }

    /**
     * <pre>
     * 把Map转换成Context
     * </pre>
     */
    private VelocityContext convertVelocityContext(Map<String, Object> map) {
        VelocityContext context = new VelocityContext();
        if (map == null) {
            return context;
        }
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            context.put(entry.getKey(), entry.getValue());
        }
        return context;
    }

}

 

测试程序:

 

1、Src.txt的内容:

 

今天是:${date},天气:${weather}!

 

2、测试Java程序:

public class VelocityHelperTest {

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("date", "2010-04-27");
        map.put("weather", "晴朗");
        
        Reader reader = new FileReader("D:/Tmp/Src.txt");
        Writer writer = VelocityHelper.getInstance().evaluateToWriter(map, reader);
        
        // 今天是:2010-04-27,天气:晴朗!
        System.out.println(writer.toString());
    }

}

 

测试程序输出:今天是:2010-04-27,天气:晴朗!

 

VelocityHelper工具类完成,接下来将会介绍下Log4j.xml如何使用Velocity渲染。

 

~~~~~~~~~ 

你可能感兴趣的:(java,apache,maven,log4j,velocity)