工作需要,开始接触FreeMarker,Google了半天,看了些07年 08年的博客文章,感觉都比较适合入门。但太深入的没有几篇。
当然,现在已经是2010年,刚开始接触FreeMarker。熟悉了下FreeMarker例子运行的大概流程,遇到些问题。但也都迎刃而解。还需要时间和精力读完官方的指导文档。还是从开发者指南部分开始读吧。免得浪费时间。
FreeMarkerServlet.java
package com.golfetrip.freemarker;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class FreeMarkerServlet extends HttpServlet {
Configuration cfg;
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
Map root = new HashMap();
root.put("user", "Big Joe");
Map latest = new HashMap();
root.put("latestProduct", latest);
latest.put("url", "products/greenmouse.html");
latest.put("name", "green mouse");
Template temp = cfg.getTemplate("test.ftl");
Writer out = new OutputStreamWriter(System.out);
try {
temp.process(root, out);
} catch (TemplateException e) {
e.printStackTrace();
}
out.flush();
}
@Override
public void init() throws ServletException {
cfg = new Configuration();
try {
//System.out.println(new File(getServletContext().getRealPath("/") + "/templates"));
//cfg.setDirectoryForTemplateLoading(new File(getServletContext().getRealPath("/") + "/templates"));
cfg.setDirectoryForTemplateLoading(new File("/templates"));
cfg.setObjectWrapper(new DefaultObjectWrapper());
} catch (IOException e) {
e.printStackTrace();
}
}
}
****************************
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>FreeMarkerServlet</servlet-name>
<servlet-class>com.golfetrip.freemarker.FreeMarkerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FreeMarkerServlet</servlet-name>
<url-pattern>/FreeMarkerServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
************************************
WebRoot下的templates文件夹中的test.ftl
<html>
<head><title>My First FreeMarker Application!</title></head>
<body>
Hi,${user}!
The latest product is <a href="${latestProduct.url}">${latestProduct.name}</a>.
</body>
</html>
***********************************
最基本的运行文件也就这三个,当然别忘记freemarker.jar。
在FreeMarkerServlet.java中,这里用的是一个servlet,方便在web环境中测试。
其中init方法中首先实例化了一个freemarker必要的Configuration实例,通过下面语句获取ftl文件加载目录,当然没有实际意义的后缀而已,完全可以用html或其他代替。
之后在service方法中设定模板文件。获取writer对象,最后在process方法中将模板和数据模型融合在一起,返回给客户端。
此例结果是在后台打印出来。
看似以上的编码都没有什么问题,但在运行的时候会报出找不到模板错误。
这里主要是因为路径的问题。new File("/templates");实际是在当前磁盘的根目录下查找templates文件夹。
解决方法是修改service方法中相关代码为
cfg.setDirectoryForTemplateLoading(new File(getServletContext().getRealPath("/") + "/templates"));