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方法结束===============================