`
xiaoxin5230
  • 浏览: 88850 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

模板之freemarker

    博客分类:
  • j2ee
 
阅读更多
    FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写

FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序

虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成

页面,通过模板显示准备的数据
  
package com.xyj.com.tool.template;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import freemarker.cache.MruCacheStorage;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;

/**
 * @className:FreemarkerUtil.java
 * @classDescription:freemarker操作类
 * @author:xiayingjie
 * @createTime:2010-12-2
 */

public class FreemarkerUtil {
	private static String  encoding="UTF-8";
	
	private static Configuration cfg = null;
	private static Template template = null;

	/**
	 * 初始化配置对象
	 * 
	 * @param dir
	 * @return
	 */
	public static Configuration initConfig() {
		if(cfg==null){
			cfg = new Configuration();
			// 设置默认包装
			setObjectWrapper();
			// 设置缓存
			setCache(20, 250);
			// 设置cfg编码
			setCfgEncoding(encoding);	
			
		}
		return cfg;
	}

	// ------------------设置模版 ,三种模式----------------
	/**
	 * 设置模板存在的目录(如果目录不存在则抛出异常)
	 * 
	 * @param dir
	 *            模板存在的目录
	 */
	public static void setTemplet(String dir) {
		try {
			cfg.setDirectoryForTemplateLoading(new File(dir));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * class方式加载模板(比上一种要稳定和安全,你可以把资源文件或者图标打包到.jar文件中)
	 * 
	 * @param object
	 * @param prefix
	 */
	public static void setTemplet(Class object, String prefix) {
		cfg.setClassForTemplateLoading(object, prefix);
	}

	/**
	 * web应用上下文加载模板
	 * 
	 * @param servletContext
	 *            web应用上下文
	 * @param path
	 *            基路径(相对于WEB—INF目录)
	 */
	public static void setTemplet(Object servletContext, String path) {
		cfg.setServletContextForTemplateLoading(servletContext, path);
	}

	/**
	 * 从多个位置加载模板 例: FileTemplateLoader ftl=new FileTemplateLoader(new
	 * File("temp/template")); FileTemplateLoader ft2=new FileTemplateLoader(new
	 * File("uses/template")); ClassTemplateLoader ct1=new
	 * ClassTemplateLoader(getClass(),""); TemplteLoader[]loaders=new
	 * TemplateLoader{ft1,ft2,ct1}; 加载模板会先从ft1中查找,如果没有则ft2,其次ct1
	 * 
	 * @param loaders
	 *            多模板位置
	 */
	public static void SetMultiTemplet(TemplateLoader[] loaders) {
		MultiTemplateLoader multiTemplate = new MultiTemplateLoader(loaders);
		cfg.setTemplateLoader(multiTemplate);
	}

	// ---------------对config的设置--------------
	/**
	 * 设置对象包装模式,这里设置成默认包装
	 * 
	 */
	public static void setObjectWrapper() {
		cfg.setObjectWrapper(new DefaultObjectWrapper());
	}

	/**
	 * 设置freemarker缓存(建议设置成非0的数值,不然每次生成会导致重复加载) 如果一级缓存满的话,使用的少的文件将推送到二级缓存
	 * 
	 * @param strong
	 *            引用区域 (一级缓存)20
	 * @param soft
	 *            弱引用区域(二级缓存)250
	 */
	public static void setCache(int strong, int soft) {
		cfg.setCacheStorage(new MruCacheStorage(strong, soft));
		// cfg.setSetting(Configuration.CACHE_STORAGE_KEY,"strong:"+strong+",soft:"+soft);
	}

	/**
	 * 清除缓存
	 */
	public static void clearCache() {
		cfg.clearTemplateCache();
	}

	/**
	 * 设置Configuration默认编码
	 * 
	 * @param encoding
	 *            编码例如"UTF8","ISO8859-1"
	 */
	private static void setCfgEncoding(String encoding) {
		cfg.setDefaultEncoding(encoding);
	}

	// ----------template操作----------

	/**
	 * 获取模板(如果文件不存在则抛出异常)
	 * 
	 * @param fileName
	 *            模板名
	 * @return Temlplate 模板对象
	 */
	public static Template getTemplate(String fileName) {
		try {
			template = cfg.getTemplate(fileName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return template;
	}

	/**
	 * 设置模板编码
	 * 
	 * @param template
	 *            模板对象
	 * @param encoding
	 *            编码
	 */
	private static void setTempEncoding(String encoding) {
		template.setEncoding(encoding);
	}

	/**
	 * 获取输出对象
	 * 
	 * @param outFile
	 *            输出的文件路径
	 * @return Writer
	 */
	public static void process(Object object, String outFilePath,
			String encoding) {
		try {
			File outFile = new File(outFilePath);
			if (!outFile.exists()) {
				outFile.createNewFile();
			}
			Writer out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(outFile), encoding));
			// 合并数据和模型
			template.process(object, out);
			
			
			// 清除缓存
			out.flush();
			out.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 获取输出对象
	 * 
	 * @param outFile
	 *            输出的文件路径
	 * @return Writer
	 */
	public static String process(Object object) {	
		String outString=null;
		StringWriter  sw=new StringWriter();
		try {
			Writer out = new BufferedWriter(sw);
			// 合并数据和模型
			template.process(object, out);
			// 清除缓存
			out.flush();
			out.close();

			outString=sw.getBuffer().toString();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return outString;
	}
	

	/**
	 * 根据模版生成文件 简化操作
	 * 
	 * @param directory
	 *            template文件目录
	 * @param fileName
	 *            文件名
	 * @param outFilePath
	 *            输出文件
	 * @param object
	 *            模版
	 * @param encoding
	 *            编码
	 * @return
	 */
	public static String makeTemplate2Str(String directory, String fileName, Object object) {
		String out = null;
		try {
			// 初始化config
			initConfig();
			// 设置模版路径
			setTemplet(directory);			
			// 获取模板
			getTemplate(fileName);
			// 设置模版编码
			setTempEncoding(encoding);
			// 输出文件
			out=process(object);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return out;
	}
	/**
	 * 根据模版生成文件 简化操作
	 * 
	 * @param directory
	 *            template文件目录
	 * @param fileName
	 *            文件名
	 * @param outFilePath
	 *            输出文件
	 * @param object
	 *            模版
	 * @param encoding
	 *            编码
	 * @return
	 */
	public static boolean makeTemplate(String directory, String fileName,
			String outFilePath, Object object) {
		boolean flag = false;
		try {
			// 初始化config
			initConfig();	
			// 设置模版路径
			setTemplet(directory);
			// 获取模板
			getTemplate(fileName);
			// 设置模版编码
			setTempEncoding(encoding);
			// 输出文件
			process(object, outFilePath, encoding);
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}
	
	public static void main(String[]args){
		
		String directory=System.getProperty("user.dir")+"/src/com/xyj/com/tool/template/";
		
		System.out.println(directory);
		String outPath="D:/aa.xml";
		String fileName="search.xml";
		
		List<Music> l=new ArrayList<Music>();
		
		Music m1=new Music();
		m1.setMusicName("一千个伤心的理由");
		m1.setSinger("张学友");
		m1.setUrl("http://www.txt.com/client-data!ff.action?id=90823");
		
		Music m2=new Music();
		m2.setMusicName("一路上&有你");
		m2.setSinger("张学友");
		m2.setUrl("http://gh.gh.com/yyc/client-data!esdown :!: .action?id=92671");
	   
	  l.add(m1);
	  l.add(m2);
		
	    
		// 创建根哈希表 
		Map root = new HashMap(); 
		// 在根中放入字符串"user" 
		root.put("musicList", l); 
		// 为"latestProduct"创建哈希表 
		
	//	FreemarkerUtil.makeTemplate(directory,fileName,outFilePath,root);
		long start=System.currentTimeMillis();
	for(int i=0;i<100000;i++){
		String s=FreemarkerUtil.makeTemplate2Str(directory,fileName,root);
	}
	
		//String t=FreemarkerUtil.makeTemplate2Str(directory,fileName,root);
		System.out.println(System.currentTimeMillis()-start);
		
		
		//System.out.println(s);
	}

}
/**
 * 页面格式: 集合: <#if 集合list??> <#list 集合list as 自定义对象object > <#if object.属性=="">
 * ${object.属性} </#if> <#if 10<object.属性?length> ${object.属性[0..9]} <#else>
 * ${object.属性} </#if> </#list> </#if>
 * 
 * 对象: <#if object.属性==""> ${object.属性} </#if> <#if 10<object.属性?length>
 * ${object.属性[0..9]} <#else> ${object.属性} </#if> hashMap:同上
 * 
 * 条件判断: <#if condition> ... <#elseif condition2> ... <#else> ... </#if> 集合:
 * <#list sequence as item> ... </#list> item_index:这是一个包含当前项在循环中的步进索引的数值。
 * item_has_next:来辨别当前项是否是序列的最后一项的布尔值。 include指令:<#include "/common/navbar.html"
 * parse=false encoding="UTF-8"> parse:true-表示解析导入文件语法 import指令:<#import
 * "/libs/mylib.ftl" as my> <@my.copyright date="1999-2002"/>
 * noparse指令:不会在这个指令之间进行解析 compress指令:删除多余的空格,一行的前后空格 escape指令:<#escape x as
 * x?html>First name: ${firstName}Last name: ${lastName}</#escape> 等同于 First
 * name: ${firstName?html}Last name: ${lastName?html}
 * assign指令:创建一个新的变量,或者替换一个已经存在的变量<#assign name=value>
 * global指令:在所有命名空间都可用<#global name=value> local指令 :定义 root 中局部对象<#local
 * name=value> setting指令:格式化输出的值:<#setting
 * name=value>-locale:en,en_US,en_US_MAC;
 * number_format:number,computer,currency,percent;
 * boolean_format:是"true,false"date_format,time_format,datetime_format:"short",
 * "long_medium", "MM/dd/yyyy" url_escaping_charset:用来 URL 转义(比如${foo?url})的字符集;
 * 
 * 函数:后面加问号表示 string?cap_first cap_first:转换首字母大写 lower_case:转换成小写
 * upper_case:转换成大写 size:序列中元素的个数 trim:去掉字符 int:数字的整数部分 html: 字符串中所有的特殊 HTML
 * 字符都需要用实体引用来代替(比如<代替&lt;) 定义宏:<#macro copyright date> ${date}<#macro>
 */

   
分享到:
评论

相关推荐

    java 模板之freemarker 小述

    1. 使用模板缓存:为了提高性能,可以启用Freemarker的模板缓存,减少不必要的模板加载。 2. 避免复杂的模板逻辑:尽量将复杂的业务逻辑保留在Java代码中,模板主要负责布局和格式化。 3. 错误处理:合理处理模板...

    word文档生成html模板(freemarker)再转为pdf示例代码

    3、示例有本地模板和远程模板之分,可杜绝pdf标题丢失的问题; 4、资源概要:先阅读README.md文档,然后根据文档中的资源示例运行代码,有postman和内部调用两种方式; 5、项目目录other/下面有示例文件可快速入手; ...

    通过freemarker模板 生成PDF

    本主题将深入探讨如何利用Freemarker模板和wkhtmltox工具来实现这一功能。 **Freemarker模板** 是一个强大的Java模板引擎,用于动态生成文本输出,如HTML、XML或PDF。它支持变量替换、控制结构(如if/else)和复杂...

    Java模板引擎之FreeMarker

    Java模板引擎之FreeMarker FreeMarker是一个开源的Java模板引擎,它被广泛应用于Web开发中,用于生成动态HTML、XML或其他格式的文本。这个强大的工具允许开发者将逻辑代码与表现层分离,使得网页设计人员可以专注于...

    Freemarker模板生成pdf+java

    Freemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+java

    FreeMarker+poi 模板生成word+导入图片

    2. **FreeMarker配置**: 在Java代码中,设置FreeMarker的配置,加载模板文件,并定义数据模型,该模型包含要填充到模板中的数据,比如图片路径。 3. **POI读取模板**: 使用Apache POI的`XWPFDocument`类打开模板文件...

    Java模板引擎 FreeMarker

    FreeMarker是一个强大的、开源的Java模板引擎,常用于Web应用中的动态内容生成,尤其是在MVC架构中,作为视图层的技术。它与JSP、JSTL等技术不同,FreeMarker是模型和视图完全分离的,使得开发者可以专注于业务逻辑...

    freemarker模板技术生成复杂word文档---解决了编码问题

    大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出‘.doc’ word文档。经测试这样方式生成的word文档完全符合office标准,...

    FreeMarker模板基本语法

    ### FreeMarker模板基本语法 #### 一、FreeMarker概述与基本用法 **FreeMarker**是一种强大的、基于Java的模板引擎,主要用于动态生成HTML页面,但也支持其他类型的文本格式(如XML、JavaScript、电子邮件等)。它...

    Java模板引擎 FreeMarker.7z

    Java模板引擎FreeMarker是一款强大的开源模板技术,常用于Web应用中的动态内容生成,尤其是在MVC架构中,作为视图层的解决方案。它与Spring、Struts等框架配合使用,能够将业务逻辑与页面展示分离,使得开发者可以...

    模板:velocity和freemarker的比较

    Velocity和Freemarker模板技术比较 模板技术在现代软件开发中扮演着重要角色,而在目前最流行的两种模板技术中, Velocity 和 Freemarker 独占鳌头。在 WebWork2 中,我们可以随意选择使用 Freemarker 或 Velocity ...

    可视化div布局 生成freemarker模板

    本话题主要探讨的是如何利用可视化div布局来生成FreeMarker模板,并结合Spring MVC 3框架进行应用。下面将详细阐述这些概念及其相关知识点。 1. **FreeMarker模板引擎**:FreeMarker是一个开源的Java模板引擎,它...

    FreeMarker模板语言API

    它与Java语言紧密结合,但模板设计者并不需要了解Java,只需要熟悉FreeMarker的模板语言。在Android Studio(AS)中,FreeMarker API可以作为构建动态内容的有效工具。 FreeMarker的核心概念包括数据模型、模板和...

    freemarker解析成pdf

    Freemarker是一个基于模板的、与语言无关的模板引擎,它的主要工作是将数据模型和模板结合,生成最终的输出。模板是由开发者设计的,包含了一些特殊的语法元素,这些元素会被Freemarker引擎替换为实际的数据值。 ...

    FreeMarker模板设计指南

    FreeMarker概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力...

    freemarker根据word模板生成word的完整示例

    Freemarker是一个基于模板的语言,它的核心是模板文件,模板文件中包含了一系列控制结构(如条件语句、循环)和变量引用。这些变量是由后台Java代码提供,模板引擎会将这些变量替换为实际值,然后生成最终的输出文档...

    基于java的模板引擎 FreeMarker.zip

    FreeMarker是一个强大的、开源的Java模板引擎,常用于Web应用中的动态内容生成,尤其是在MVC(Model-View-Controller)架构中,它作为View层的一部分,将数据模型和HTML或其他类型的文档模板结合,生成最终的网页。...

    Java模板引擎FreeMarker

    FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,FreeMarker被设计用来生成HTML Web页面(为了提高页面的访问速度,把页面静态化),特别是基于MVC模式的应用程序

    mybatis自动生成代码的模板--freemarker版本.zip

    附件包含了mybatis-plus自动生成代码,基于freemarker的模板。包括常规的curd。 【特点】针对每个接口都有对应的入参和出参,不公用entity。 如,add接口,则入参会自动生成为addEntityReq。具体可下载模板进行查看...

    freeMarker模板文件附件.zip

    这个“freeMarker模板文件附件.zip”压缩包包含了一些关键资源,便于学习者深入理解并实践FreeMarker模板语言的用法。 1. **FreeMarker模板语言基础** FreeMarker是基于模板的,它与Java代码分离,使得视图层的...

Global site tag (gtag.js) - Google Analytics