自从有了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渲染。
~~~~~~~~~