天天看点

FreeMarker:浅尝辄止

一:FreeMarker简介:

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写  FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序  FreeMarker允许Java servlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成 HTML。模板语言是强

FreeMarker:浅尝辄止

FreeMarker 显示过程

大的直观的,编译器速度快,输出接近静态HTML页面的速度。

二:

能够生成各种文本:HTML、XML、RTF、Java源代码等等  

易于嵌入到你的产品中:轻量级;不需要Servlet环境  

插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等  

你可以按你所需生成文本:保存到本地文件;作为Email发送;从Web应用程序发送它返回给Web浏览器

三:

很强大的标签详细不作介绍请看:http://karoii.bokee.com/6461730.html

四:实践:数据+模版=输出

首先我们要从http://freemarker.sourceforge.net/features.html下载FreeMarker.ja目前最新版本是:2.3.19.tar.

为什吗要写这个呢?因为我们可能获取的不是一个模版文件。

public class InitServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public static String rootPath;
           

下面我们具体看看这个:模版转换数据class

首先你需要创建一个Configuration(freemarker.template.Configuration)的实例,设置其中的某些属性。Configuration 是存放FreeMarker 的Application 级别配置信息的一

个重要地方。同时,它还负责创建及预解析模版(template)。

public class AnyChartUtil {
	private static Configuration cfg;
	
	static{
		cfg=new Configuration();
		//指定一个加载模版的数据源
		try{
			cfg.setDirectoryForTemplateLoading(new File(getTemplatePath()));
			//指定模版如何让查看数据模型
			cfg.setObjectWrapper(new DefaultObjectWrapper());
			cfg.setDefaultEncoding("UTF-8");
		}catch (Exception e){
			e.printStackTrace();
		}
	}
	public static String getAnyChartXml(String filename,Map<String,Object> parameter){
		return getAnyChartXml(filename,parameter,null);
	}
	public static String getAnyChartXml(String filename,Map<String,Object> parameter,Map<String,String> replaces){
		String xmlStr=null;
		StringWriter out=null;
		try {
			//模版对象一般就是指代freemarker.template.Template 实例。通常你可以从一
			//个Configuration 实例中获取模版实例。你可以通过getTemplate 这个方法来获得
			Template temp=cfg.getTemplate(filename);
			Map<String,Object> root=new HashMap();
			if(parameter!=null)
			{
				root.putAll(parameter);
			}
			out=new StringWriter();
			//数据模型+模版=输出,而我们一旦拥有数据模型(root)和一个模版
			//(template)那么我们就可以把他们合并获得输出。
			temp.process(root, out);
			out.flush();
			xmlStr=out.toString();
			System.out.println("----------------------------------------------------");
			System.out.println(xmlStr);
			System.out.println("----------------------------------------------------");

			xmlStr=xmlStr.replaceAll("@", "%");
			System.out.println(xmlStr);
			System.out.println("----------------------------------------------------");

			if(replaces!=null)
			{
				Set<String> keyset=replaces.keySet();
				for(String key:keyset){
					xmlStr.replace(key, replaces.get(key));
				}
				System.out.println("===================================================");
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TemplateException ex) {
			// TODO Auto-generated catch block
			ex.printStackTrace();
		}
		finally{
			if(out!=null){
				try{out.close();}catch(IOException e){}
			}
		}
		return xmlStr;
	}
	public static String getTemplatePath(){
		
		String path=InitServlet.rootPath;
		path=path.replaceAll("\\\\\\\\","/");
		System.out.println("*******************************************************"+path);
	    path=path.replaceAll("%20"," ");
	    System.out.println(path);
	    return path;
	}
	
}



	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		rootPath=getServletContext().getRealPath("/xml");
		System.out.println("======"+rootPath);
	}

	
}
           

我们看一下:模版文件它是以.ftl结尾的文件

<html>
<head>

<title>Test </title>
</head>

<body>
<table width="100%"  cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
<tr>
    <td>${1}</td>  <td>${2}</td>  <td>${3}</td>  <td>${4}</td>  
</tr>
<tr>
<#list list as l>
	<td>${l}</td>
</#list>
</tr>
</table>           
           

</body>
</html>	
           
我们在Servlet中测试一下:
public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Map<String,Object> parameter=new  HashMap<String,Object>();
		parameter.put("1", 1);
		parameter.put("2", 2);
		parameter.put("3", 3);
		parameter.put("4", 4);
		List list=new ArrayList();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		list.add("e");
		parameter.put("list", list);
		String str=AnyChartUtil.getAnyChartXml("MyXml.ftl",parameter);
		System.out.println(str);
		
	}
           
可以看到控制台输出的“输出”。 之所以用到模版是由于我们项目中的报表在前台需获得一个XMl的文件,XML当中的文件就是这样“数据”+模版=“输出”的xml文件。

继续阅读