一: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 级别配置信息的一
个重要地方。同时,它还负责创建及预解析模版(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文件。