zoukankan      html  css  js  c++  java
  • Freemarker的使用方法

    1、 Freemarker概念

    1.1 什么是freemarker

    FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarkerWeb容器无关,即在Web运行时,它并不知道ServletHTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XMLJSPJava 等。

    1.2 Freemarker的使用方法

    第一步:把freemarkerjar包添加到工程中

    第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。

    第三步:创建一个Configration对象

    第四步:告诉config对象模板文件存放的路径。

    第五步:设置config的默认字符集。一般是utf-8

    第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。

    第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。

    第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。

    第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。

    第十步:关闭writer对象。

    1.3 代码实现

    public class FreeMarkerTest {
    
        @Test
        public void testFreeMarker() throws Exception {
            // 第一步:把freemarker的jar包添加到工程中
            // 第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。
            // 第三步:创建一个Configuration对象
            Configuration configuration = new Configuration(Configuration.getVersion());
            // 第四步:告诉config对象模板文件存放的路径。
            configuration.setDirectoryForTemplateLoading(new File("D:\workspaces\portal\src\main\webapp\WEB-INF\ftl"));
            // 第五步:设置config的默认字符集。一般是utf-8
            configuration.setDefaultEncoding("utf-8");
            // 第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。
            Template template = configuration.getTemplate("first.ftl");
            // 第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。
            Map root = new HashMap<>();
            root.put("hello", "hello freemarker");
            // 第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。
            Writer out = new FileWriter(new File("D:\temp\html\hello.html"));
            // 第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。
            template.process(root, out);
            // 第十步:关闭writer对象。
            out.flush();
            out.close();
        }
    }

    模板:

    ${hello}

    2、 Freemarker模板的写法

    2.1 取简单数据类型数据

    使用EL表达式。

    ${hello}

    2.2 包装数据类型

    模板:

    <html>
    <head>
        <title>${title}</title>
    </head>
    <body>
        <label>学号:</label>${student.id}<br>
        <label>姓名:</label>${student.name}<br>
        <label>住址:</label>${student.address}<br>
    </body>
    </html>

    2.3 历遍集合/数组

    List<Person> persons = new ArrayList<Person>();
    
    省略….
    
    页面中内容
    
    <#list persons as p>
    
    ${p.id}/${p.name}
    
    </#list>

    2.4 获得当前迭代的索引

    List<Person> list = new ArrayList<Person>();
    
    获取当前选代的索引:<br/>
    <#list persons as p>
        ${p_index}
    </#list>

    2.5 模板中判断条件

    <#if 判断条件>
    <#else>
    </#if>
    
    逻辑运算符(==   !=   ||   &&)

    2.6 日期类型格式化

    默认格式
    1:date
    ${cur_time?date}
    2:datetime
    ${cur_time?datetime}
    3:time
    ${cur_time?time}
    
    自定义格式
    ${cur_time?string("yyyy-MM-dd HH:mm:ss")} 

    2.7 处理null

    root.put(“val”,null);
    
    解决办法
    1:null 变 空串
    ${val!}     ${val!"这里是空"}
    2:为Null时给默认值
    ${val!"我是默认值"}
    3、时间类型判断为空
    <#if curdate ??> 当前日期:${curdate?string("yyyy/MM/dd HH:mm:ss")} <#else> curdate属性为null </#if>

    2.8 Include

    将另一个页面引入本页面时可用以下命令完成
    
    <#include "/include/head.html">

    3、项目中使用freemarker

    使用freemarker整合spring。把Configuration交给spring容器管理。

    依赖的jar包:

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.1.3.RELEASE</version>
    </dependency>
    
    <dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
    </dependency>

    3.1 Spring配置文件

     在Spring中配置Configration对象

    <bean id="freemarkerConfig"
            class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
            <property name="templateLoaderPath" value="/WEB-INF/ftl/" />
            <property name="defaultEncoding" value="UTF-8" />
    </bean>

    第一个参数是模板存放路径,第二个字符编码

    3.2 静态文件生成的时机

    1、当用户第一次访问时生成静态文件。不推荐使用。

    原因:高并发的情况下,容易将不完整的静态页面传递给前台用户。

    2、当后台添加、编辑商品时生成静态网页。

    此时,需要前台系统发布服务,供后台系统调用,当后台添加或者修改商品时调用此服务。此时前台系统的功能就是生成静态页面。

    3.3 整合代码

        @Override
        public Result genItemHtml(Long itemId) throws Exception {
            //商品基本信息
            TbItem tbItem = itemService.getItemById(itemId);
            //商品描述
            String itemDesc = itemService.getItemDescById(itemId);
            //规格参数
            String itemParam = itemService.getItemParamById(itemId);
            //生成静态页面
            Configuration configuration = freeMarkerConfigurer.getConfiguration();
            Template template = configuration.getTemplate("item.ftl");
            //创建一个数据集
            Map root = new HashMap<>();
            //向数据集中添加属性
            root.put("item", tbItem);
            root.put("itemDesc", itemDesc);
            root.put("itemParam", itemParam);
            //创建一个Writer对象
            Writer out = new FileWriter(new File(STATIC_PAGE_PATH + itemId + ".html"));
            //生成静态文件
            template.process(root, out);
            out.flush();
            out.close();

          return Result.ok();

    }

    3.4 访问配置

    可以参考我之前写的

    二、nginx搭建图片服务器

    3.5 报错406问题

    由于请求的url的后缀为.html,要求返回为一个字符串页面。所以报错

    解决方法:不要使用*.html的后缀,配置多个servlet-mapping,拦截其他的后缀,如*.action

     注:其实解决方案很多,本文写的这种是生成文件放在硬盘,使用http服务器访问静态文件。还有一种应用很广泛的解决方案,就是类似jsp的配置,实际就是配置一个视图解析器,流程和使用jsp一样,用户在请求这个页面时,将生成的静态页面直接呈现在用户面前,硬盘并不保存这个页面。

  • 相关阅读:
    分库分表(1) --- 理论
    Elasticsearch(10) --- 内置分词器、中文分词器
    Elasticsearch(9) --- 聚合查询(Bucket聚合)
    Elasticsearch(8) --- 聚合查询(Metric聚合)
    Elasticsearch(7) --- 复合查询
    Elasticsearch(6) --- Query查询和Filter查询
    Elasticsearch(5) --- 基本命令(集群相关命令、索引CRUD命令、文档CRUD命令)
    第二周 Word版面设计
    第六周 Word目录和索引
    第五周 Word注释与交叉引用
  • 原文地址:https://www.cnblogs.com/laoyeye/p/6790786.html
Copyright © 2011-2022 走看看