freeMarker导出html文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Majker/article/details/82846576

1.什么是freemarker?

FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

这种方式通常被称为 MVC (模型 视图 控制器) 模式,对于动态网页来说,是一种特别流行的模式。 它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。设计师无需面对模板中的复杂逻辑, 在没有程序员来修改或重新编译代码时,也可以修改页面的样式。

作用

FreeMarker最初的设计,是被用来在MVC模式的Web开发框架中生成HTML页面的,它没有被绑定到 Servlet或HTML或任意Web相关的东西上。它也可以用于非Web应用环境中。

根据提供的数据和创建好的模板,去自动的创建html静态页面.

2. 实战

pom.xml

      <!--FreeMarker需要添加的Maven依赖:-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
        </dependency>
        <!--FreeMarker需要添加的Maven依赖:-->

test.ftl

<html>
<head>
    <title>Welcome!</title>
</head>
<body>
<h1>Hello ${w}!</h1>

  <#list articleVoList as article>
                        <p><a href="/article/${article.id}">${article.title}</a></p>
  </#list>

</body>
</html>

java控制器

package com.majker.modules.api;

import com.majker.modules.blog.entity.vo.ArticleQueryVo;
import com.majker.modules.blog.entity.vo.ArticleVo;
import com.majker.modules.blog.service.ArticleService;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/****************************************************
 *
 *  FreeMarker导出html
 * @author zhouzf
 * @date 2018-09-25 21:47
 * @version 1.0
 **************************************************/
@Controller
@RequestMapping("test")
public class FreeMarkerController {
    @Resource
    Configuration cfg;

    @Autowired
    private ArticleService articleService;

    @GetMapping("main")
    public String main(Model model, HttpServletRequest request, HttpServletResponse response) {
        cfg.setDefaultEncoding("UTF-8");
        cfg.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/docTemplate");
        String w = "Welcome FreeMarker!";
        Map root = new HashMap();


        try {
            ArticleQueryVo queryVo=new ArticleQueryVo();
            root.put("w", w);
            List<ArticleVo> articleVoList=articleService.findArticle(queryVo);
            root.put("articleVoList", articleVoList);
            response.setContentType( "application/html; charset=UTF-8");
            response.setHeader("Content-Disposition","Attachment;filename= " + new String(("index.html").getBytes("UTF-8"),"UTF-8"));
            freeMarkerContent(root,response.getWriter());
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        }
//        model.addAttribute("w", "Welcome FreeMarker!");
        return "test";
    }

    private void freeMarkerContent(Map<String, Object> root,Writer wt) {
        try {

            Template temp = cfg.getTemplate("test.ftl");
            //以classpath下面的static目录作为静态页面的存储目录,同时命名生成的静态html文件名称
//            String path = this.getClass().getResource("/").toURI().getPath() + "static/test.html";
//            Writer file = new FileWriter(new File(path.substring(path.indexOf("/"))));
            temp.process(root, wt);
//            file.flush();
//            file.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
    }


}

链接: http://freemarker.foofun.cn/index.html.

猜你喜欢

转载自blog.csdn.net/Majker/article/details/82846576
今日推荐