Velocity和Freemarker模板牛刀小试(java)

时间:2022-11-24 18:30:10

1:Velocity简介

        Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。 Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当 作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。

封装工具类代码:

package com.util;

import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Velocity封装类
 */
public class VelocityTemplateUtil {
	private static Logger logger = LoggerFactory.getLogger(VelocityTemplateUtil.class);

	public static final String DEFAULT_ENCODING = "UTF-8";
	public static final String DEFAULT_PATH = "template/";

	private VelocityTemplateUtil() {

	}
	/**
	 * 初始化Velocity参数
	 */
	static {
		Properties p = new Properties();
		p.setProperty("input.encoding", DEFAULT_ENCODING);
		p.setProperty("output.encoding", DEFAULT_ENCODING);
		p.setProperty("resource.loader", "class");
		p.setProperty("class.resource.loader.class",
				"org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
		try {
			Velocity.init(p);
		} catch (Exception e) {
			logger.error("Velocity init error !: " + e.toString());
		}
	}
	/**
	 * 直接把模板内容作为参数传入
	 * @param templateContent
	 * @param contextParameter
	 * @return
	 */
	public static String parseVMContent(String templateContent, Map<String, Object> contextParameter) {
		logger.debug("parse content : [{}],context parameters :[{}]", templateContent, contextParameter);
		try {
			VelocityContext context = new VelocityContext();
			StringWriter writer = new StringWriter();
			for (String key : contextParameter.keySet()) {
				context.put(key, contextParameter.get(key));
			}
			Velocity.evaluate(context, writer, "fe", templateContent);
			String result = writer.toString();

			logger.debug("velocity parse result is : [{}]", result);
			return result;
		} catch (Exception e) {
			logger.error("Velocity parse error !: " + e.toString()+ ", content:" + templateContent);
		}
		return null;
	}

	/**
	 * 利用模板文件.vm
	 * @param templateFileName
	 * @param contextParameter
	 * @return
	 */
	public static String parseVMTemplate(String templateFileName, Map<String, Object> contextParameter) {
		logger.debug("parse template file name : [{}],context parameters : [{}]", templateFileName, contextParameter);
		try {
			Template template = Velocity.getTemplate(DEFAULT_PATH + templateFileName, DEFAULT_ENCODING);
			VelocityContext context = new VelocityContext();
			for (String key : contextParameter.keySet()) {
				context.put(key, contextParameter.get(key));
			}
			StringWriter writer = new StringWriter();
			template.merge(context, writer);

			String result = writer.toString();
			logger.debug("velocity parse result is : [{}]", result);
			return result;
		} catch (Exception e) {
			logger.error("Velocity parse error !: " + e.toString() + ", file:" + templateFileName);
		}
		return null;
	}

	public static void main(String[] args) {
		Map<String, Object> temp = new HashMap<String, Object>();
		temp.put("datetime", "adfasd");
		String s = VelocityTemplateUtil.parseVMContent("order_dispatch_suc{datetime}", temp);
		System.out.println(s);
	}

}

2:Freemarker简介

        FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。

封装工具类代码:

package com.util;

import java.io.StringWriter;
import java.util.HashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.raxtone.freemarker.HelloFreeMarker;
import freemarker.template.Configuration;
import freemarker.template.Template;

/**  
 * FreeMarker封装
 */
public class FreeMakerUtil {
	private static Logger logger = LoggerFactory.getLogger(FreeMakerUtil.class);
	/** 编码格式 UTF-8 */  
	public static final String DEFAULT_ENCODING = "UTF-8";  
    public static final String DEFAULT_PATH = "template/";
    private static Configuration cfg;
	private FreeMakerUtil() {

	}
	static {
		
		cfg = new Configuration();
		cfg.setDefaultEncoding(DEFAULT_ENCODING);
		// 设置FreeMarker的模版文件位置
		//基于文件系统
		//cfg.setDirectoryForTemplateLoading(new File("templates"));
		//基于Servlet Context
		/*public void setServletContextForTemplateLoading
		(Object servletContext,String path)*/
		//cfg.setServletContextForTemplateLoading(getServletContext(),"/templates");
		//基于类路径
		/*public void setClassForTemplateLoading(Class clazz,
                String pathPrefix)*/
		cfg.setClassForTemplateLoading(HelloFreeMarker.class, "/template");
		
		
	}
	public static String processContent(HashMap<String,Object> content,String templatePath) {
		try {
			Template tem = cfg.getTemplate(templatePath);
			StringWriter writer = new StringWriter(); 
			tem.process(content, writer);
			logger.debug("组合后的内容为:"+writer.toString());
			writer.flush();
			writer.close();
			return  writer.toString();
		} catch (Exception e) {
			logger.error("FreeMarker init error !: " + e.toString());
		}
		return null;
	}
	
}
maven配置:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gao.web</groupId>
  <artifactId>myweb</artifactId>
  <packaging>war</packaging>
  <version>1.0</version>
  <name>myweb Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
  	<dependency> 
      <groupId>freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.8</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>	
    <dependency>
     <groupId>velocity</groupId>
     <artifactId>velocity-dep</artifactId>
     <version>1.4</version>
    </dependency>
</dependencies>
</project>

测试代码:

package com.gao.test;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.time.DateFormatUtils;

import com.util.FreeMakerUtil;
import com.util.VelocityTemplateUtil;

/**  
 * @Description: (测试模板)     
 * @author:yqgao  
 * @date:2014-12-2 上午11:25:27     
 */
public class TestFreeMarkerAndVelocity {
	public static void main(String[] args) {
		testVelocity();
		testFreeMarker();
	}
	/**
	 * 测试Velocity方法
	 */
	public static void testVelocity(){
		System.out.println("测试Velocity方法开始===============================");
		Map<String, Object> templateParam = new HashMap<String, Object>();
		templateParam.put("datetime", DateFormatUtils.format(new Date(), "yyyy年MM月dd日 HH时mm分ss秒"));
		templateParam.put("content", "看到我就说明测试成功了~~~");
		//利用模板文件
		String exchangContentString =  VelocityTemplateUtil.parseVMTemplate("test.vm", templateParam);
		System.out.println(exchangContentString);
		//直接内容作为参数
		String exchangContent =  VelocityTemplateUtil.parseVMContent("第二个测试 今天是:${datetime}===>测试内容为:${content}", templateParam);
		System.out.println(exchangContent);
		System.out.println("测试Velocity方法结束===============================");
	}
	/**
	 * 测试FreeMarker方法
	 */
	public static void testFreeMarker(){
		System.out.println("测试FreeMarker方法开始===============================");
		HashMap<String,Object> content = new HashMap<String, Object>();
		content.put("name", "dear");
		content.put("msg", "您已经完成了第一个FreeMarker的示例!");
		String templatePath = "test.ftl";
		String myContentString = FreeMakerUtil.processContent(content, templatePath);
		System.out.println("测试--"+myContentString); 
		System.out.println("测试FreeMarker方法结束===============================");

	}
}
测试执行结果:

测试Velocity方法开始===============================
 [DEBUG] 2014/12/03 11:47:02 -->--> (VelocityTemplateUtil.java): parse template file name : [test.vm],context parameters : [{content=看到我就说明测试成功了~~~, datetime=2014年12月03日 11时47分02秒}] 
 [DEBUG] 2014/12/03 11:47:02 -->--> (VelocityTemplateUtil.java): velocity parse result is : [今天是:2014年12月03日 11时47分02秒===>测试内容为:看到我就说明测试成功了~~~] 
今天是:2014年12月03日 11时47分02秒===>测试内容为:看到我就说明测试成功了~~~
 [DEBUG] 2014/12/03 11:47:02 -->--> (VelocityTemplateUtil.java): parse content : [第二个测试 今天是:${datetime}===>测试内容为:${content}],context parameters :[{content=看到我就说明测试成功了~~~, datetime=2014年12月03日 11时47分02秒}] 
 [DEBUG] 2014/12/03 11:47:02 -->--> (VelocityTemplateUtil.java): velocity parse result is : [第二个测试 今天是:2014年12月03日 11时47分02秒===>测试内容为:看到我就说明测试成功了~~~] 
第二个测试 今天是:2014年12月03日 11时47分02秒===>测试内容为:看到我就说明测试成功了~~~
测试Velocity方法结束===============================
测试FreeMarker方法开始===============================
 [DEBUG] 2014/12/03 11:47:02 -->--> (Log4JLoggerFactory.java): Could not find template in cache, creating new one; id=[test.ftl[zh_CN,UTF-8,parsed] ] 
 [DEBUG] 2014/12/03 11:47:02 -->--> (Log4JLoggerFactory.java): Compiling FreeMarker template test.ftl[zh_CN,UTF-8,parsed]  from file:/E:/myweb/target/classes/template/test.ftl 
 [DEBUG] 2014/12/03 11:47:02 -->--> (FreeMakerUtil.java): 组合后的内容为:dear,你好!您已经完成了第一个FreeMarker的示例! 
测试--dear,你好!您已经完成了第一个FreeMarker的示例!
测试FreeMarker方法结束===============================