现在的位置: 首页 > 综合 > 正文

2011年4月17日

2014年07月17日 ⁄ 综合 ⁄ 共 3676字 ⁄ 字号 评论关闭

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 (测试)

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<
%@page import="java.util.*" %>
<
%@page import="com.xyl.bean.NewsBean" %>
<
%@page import="com.xyl.util.Freemarker" %>
<
%@page 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>

效果:
2011年4月17日 - xiaojunwei1987 - http://hi.baidu.com/
测试可以吧,当然项目中使用Freemarker并不是这么单纯的用,继续研究,继续研究2011年4月17日 - xiaojunwei1987 - http://hi.baidu.com/

抱歉!评论已关闭.