Freemarker是用Map数据填充模版*.ftl内的$变量,当我们查询到很多数据,返回list,且list内存放的是一个个javabean,那该怎么做呢?Freemarker当然有法了。
例:新闻表news -> id,title,content,author,封装它(那些set,get方法,省了....)
代码1:Freemarker.java
package com.xyl.util;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 初始化Freemarker并生成模版的类
* @author XU yanli
*/
public class Freemarker {
//Log实例变量
private static Log log = LogFactory.getLog(Freemarker.class);
//创建Configuration实例
private static Configuration fmConfig;
/**
* 初始化FreeMarker配置
* @param inServletContext Servlet上下文
*/
public void init(ServletContext inServletContext) {
if (fmConfig == null) {
fmConfig = new Configuration();
fmConfig.setDefaultEncoding("UTF-8");
fmConfig.setObjectWrapper(new DefaultObjectWrapper());
//设置FreeMarker的模版文件位置
fmConfig.setServletContextForTemplateLoading(inServletContext, "templates");
}
}
/**
* 获得模版文件,建立数据模型,生成Freemarker模版
* @param inTemplate 模版文件
* @param inData 数据模型
* @return 模版+数据=生成的模版文件
*/
public String run(String inTemplate, Map inData) throws Exception {
Template template = null;
try {
template = fmConfig.getTemplate(inTemplate);
} catch (IOException ex) {
//Logger.getLogger(Freemarker.class.getName()).log(Level.SEVERE, null, ex);
log.error("Freemarker.run() - 不能加载Freemarker模版 " +
inTemplate +"..不在环境变量 - (Error: " + ex);
return "error";
}
//输出生成流
Writer out = new StringWriter();
template.process(inData, out);
out.flush();
if(log.isDebugEnabled()){
log.debug("Freemarker.run() - 输出 =" + out);
}
//返回输出
log.trace("Freemarker.run() - Exit");
return out.toString();
}
}
代码2:AllNews.ftl模版
<ul>
<#list newsList as news>
<li><a href="doc_${news.id}.html">${news.title}</a>-------author:${news.author}</li>
</#list>
<#if userLogo = true>
你好呀!
</#if>
</ul>
代码3:index.jsp (测试)
< contentType="text/html" pageEncoding="UTF-8"%>
< import="java.util.*" %>
< import="com.xyl.bean.NewsBean" %>
< import="com.xyl.util.Freemarker" %>
< import="javax.servlet.ServletContext" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试</title>
</head>
<body>
<h4>
<%
NewsBean news1 = new NewsBean(1, "测试1", "我来测试1", "ugly1");
NewsBean news2 = new NewsBean(2, "测试2", "我来测试2", "ugly2");
NewsBean news3 = new NewsBean(3, "测试3", "我来测试3", "ugly3");
NewsBean news4 = new NewsBean(4, "测试4", "我来测试4", "ugly4");
List newsList = new ArrayList();
newsList.add(news1);
newsList.add(news2);
newsList.add(news3);
newsList.add(news4);
Map<String, Object> tokens = new HashMap<String, Object>();
tokens.put("newsList", newsList);
tokens.put("userLogo", false);
ServletContext inServletContext = request.getSession().getServletContext();
Freemarker freemarker = new Freemarker();
freemarker.init(inServletContext);
String test = freemarker.run("AllNews.ftl", tokens);
out.print("======================================================="+test);
%>
</h4>
</body>
</html>
效果:
测试可以吧,当然项目中使用Freemarker并不是这么单纯的用,继续研究,继续研究