`
obullxl
  • 浏览: 183212 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Velocity工具-渲染自定义模板

    博客分类:
  • Java
阅读更多

自从有了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: obullxl@163.com  MSN: obullxl@hotmail.com  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渲染。

 

~~~~~~~~~ 

1
3
分享到:
评论
1 楼 obullxl 2010-04-27  
忘记了粘贴Maven依赖:
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.6.3</version>
</dependency>

相关推荐

    Velocity--java的模板引擎

    在Java项目中,要使用Velocity,首先需要添加Velocity的依赖库,然后创建VelocityContext对象,将数据放入上下文,接着初始化Velocity Engine,最后渲染模板并输出结果。以下是一个简单的示例: ```java import org...

    velocity-1.5.jar,velocity-1.6.2-dep.jar,velocity-tools-1.3.jar

    在实际使用中,开发者需要将这些JAR文件添加到项目的类路径中,然后可以通过创建VelocityContext对象,填充数据,最后使用Velocity Engine渲染模板。这整个过程是完全独立于具体的服务器环境的,使得Velocity成为一...

    velocity-tools-2.0-src.zip

    - **模板渲染优化**:通过分析 Velocity Tools 源码,开发者可以学习如何优化模板渲染速度,例如避免不必要的计算或减少模板中的逻辑复杂度。 - **自定义工具**:根据项目需求,开发者可以参考 Velocity Tools 的...

    velocity的jar包

    5. **自定义工具(Customizable Tools)**:Velocity Tools允许开发者自定义工具类,以适应特定项目的需求。 使用这两个jar包,开发者可以轻松地在项目中集成Velocity,构建高效的动态内容生成系统。需要注意的是,在...

    velocity-1.6.2.zip

    Velocity 通过将逻辑与呈现分离,为开发者提供了一个强大的工具,使得网页设计人员和程序员可以更加专注于各自的工作,从而提高了开发效率和代码可维护性。 在"velocity-1.6.2.zip"中,我们可以找到以下关键组件和...

    velocity-dvsl-1.0.zip123

    总的来说,下载并解压"velocity-dvsl-1.0.zip",开发者可以深入了解Velocity的DVSL特性,学习如何在项目中集成和利用这个强大的工具来处理数据驱动的模板渲染。这将有助于提升Web应用的用户体验,同时简化开发者的...

    velocity-1.6.1.tar.gz

    - **运行**:在Java代码中,通过VelocityContext对象设置变量,然后使用Velocity引擎渲染模板并输出结果。 **常见指令与语法** - **$variable**:表示输出变量的值。 - **#set($var = "value")**:设置变量的值。 ...

    SpringBoot Velocity 代码生成模板

    同时,还需要在代码中创建Velocity的上下文对象,并注入需要的数据,然后使用Velocity引擎渲染模板并生成代码。 7. **最佳实践**: 在实际应用中,可以结合Maven或Gradle的插件来实现代码生成任务,如MyBatis的...

    Velocity用户手册---中文版

    6. **处理结果**:Struts根据配置的Result类型,调用Velocity引擎渲染模板,并将结果返回给客户端。 在实际应用中,Velocity的优势在于其简洁的语法和强大的逻辑处理能力,它允许开发者使用简单的指令(如#$,#set...

    velocity-1.7

    新版本提供了更多的API接口,使得开发者可以更容易地集成Velocity到他们的应用中,比如增强了模板加载和缓存管理的API,提高了自定义的灵活性。 6. **兼容性和稳定性** Velocity 1.7保持了与早期版本的良好兼容性...

    SSM笔记-SpringMVC自定义视图及重定向视图、语言国际化

    自定义视图解析器可以控制视图如何被创建和渲染,从而满足项目中复杂多变的视图需求。 接着,我们来看重定向视图。在SpringMVC中,当需要将请求从一个处理方法重定向到另一个URL时,可以使用`RedirectView`。例如,...

    velocity-1.6.1官方开发包

    ** Velocity 框架概述 ** Velocity 是一个开源的 Java 模板引擎,它允许...虽然现在的Web开发趋势更倾向于前后端分离和更现代的框架,但Velocity作为经典的模板引擎,对于理解Web模板渲染原理和历史仍然具有重要价值。

    Apache Velocity - Developer's Guide

    Apache Velocity 是一个基于 Java 的模板引擎,它提供了一种简单而强大的方法来创建和渲染格式化数据的文档。Velocity 的设计目的是使得开发者能够轻松地将数据模型与表现层进行分离,从而更灵活地管理和更新应用...

    velocity-1.6.3.zip

    7. **Integration with Apache Turbine**: 在更早的时候,Velocity经常与Apache Turbine框架一起使用,Turbine利用Velocity来渲染视图。虽然现在两者可以独立使用,但历史上它们的结合提供了一套完整的Web应用开发...

    velocity_lib1.7-jar包

    4. 事件处理器(Event Handlers):Velocity 提供了一种机制,允许开发者自定义处理模板解析过程中的特定事件,如模板开始、结束、遇到变量等,增强了模板的灵活性和安全性。 三、Velocity Lib 1.7特性 1. 性能...

    Apache Velocity - Velocity User Guide

    - **渲染(Rendering)**:如何控制 Velocity 渲染输出的过程。 - **索引表示法(Index Notation)**:使用索引来访问数组或集合元素。 - **正式引用表示法(Formal Reference Notation)**:更复杂的引用结构。 - *...

    Velocity模板引擎 v2.2.0.zip

    Velocity模板引擎是一款强大的Java模板...总的来说,Velocity模板引擎v2.2.0是一个强大的工具,帮助开发者轻松创建动态内容。通过了解其核心概念、指令以及新版本的特点,你可以更好地利用它来提升Web应用的用户体验。

    Velocity模板使用指南中文版

    ** Velocity 模板使用指南中文版 ** Velocity 是一个基于 Java ...通过阅读这份《Velocity 模板使用指南中文版》,你将能够掌握 Velocity 的基础和进阶知识,从而在实际项目中灵活运用 Velocity 实现高效的模板渲染。

    velocity 电子书

    - 用户还可以通过Velocity Tools框架添加自定义工具,增强模板的功能。 7. **性能优化** - 了解如何通过缓存管理、减少不必要的模板解析和优化VTL代码来提升Velocity的性能。 - 使用Velocity Profiler工具进行...

    velocity的学习资料

    - 缓存管理:Velocity支持缓存编译后的模板,提高重复渲染的性能。 - 自定义指令:可以通过扩展Velocity,编写自定义指令以满足特定需求。 7. **最佳实践** - 尽量避免在模板中进行复杂的逻辑处理,保持模板简洁...

Global site tag (gtag.js) - Google Analytics