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