FreeMarker:不深入钻研
一:FreeMarker简介:
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 FreeMarker允许Java servlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。模板用servlet提供的数据动态地生成 HTML。模板语言是强
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 级别配置信息的一
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%" border="0" 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文件。