JWeb之FreeMaker模板渲染

前面学习了Thymleaf和Velocity模板渲染,今天接触第三种模板渲染技术FreeMaker!

知识点预习:

  • 通过PrintWriter out = resp.getWriter();可以获取输出流
  • 依赖为freemarker
  • 使用前需要获取其下的配置对象Configuration cfg
  • 通过cfg.setDirectoryForTemplateLoading()读取模板文件目录
  • 通过cfg.getTemplate("test.html")加载模板目录下指定名称的模板
  • 渲染材料封装于Map中
  • 通过template.process(material,out)将渲染数据后的页面响应给前端
  • 通过FrameMaker渲染的模板不单单局限于html结构的文件,也可以是ftl后缀的文件

下面通过案例展示如何渲染两种格式模板的过程!

一.案例展示

1.测试准备

项目工程(maven下的webapp骨架)

JWeb之FreeMaker模板渲染_第1张图片

2.代码展示

***pom.xml

  
    
      junit
      junit
      4.12
      test
    
    
      org.freemarker
      freemarker
      2.3.28
    
    
      javax.servlet
      servlet-api
      2.5
    
    
      javax.servlet
      javax.servlet-api
      3.1.0
    
  

***test.ftl

我是${name},今年${age}岁,只有一个爱好就是${hobby}!

***test.html





FrameMaker


	<#--注释的写法-->
	

${title}

${existPreMap.attention} ${existPreMap.message}
多级变量获取省->市->区
${location.province.city.area}
if的用法
<#if sex==1>
我是男人
<#else>
我是女人
switch的用法
<#switch sex> <#case 0> I am girl! <#break> <#case 1> I am boy! <#break> <#default> I am nothing!
set集合
<#list cities as city>${city},
list集合
<#list names as name>${name},
数组
<#list stars as star>${star},
数组加角标
${stars[0]}
数值计算
<#--加减乘除运算--> 1+2/3=${1+2/3} <#--取整--> 1+2/3=${(1+2/3)?int}
<#--遍历list-->
<#list ["a","f","b"]+["aa","rr","cc"] as temp> ${temp},
<#--加号连接两个哈希表,如果有重复的话,那么选择+号右侧的优先。注意<#assign只有头,没有结尾-->
<#assign ages={"Joe":21,"KK":33}+{"Joe":30,"BB":60}> Joe:${ages.Joe} BB:${ages.BB}

***FTLServlet.java

package com.howie;

import freemarker.template.Configuration;
import freemarker.template.Template;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author weihuanwen
 * @Date 2019/8/23 13:49
 * @Version 1.0
 */
@WebServlet("/fs")
public class FTLServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=UTF-8");
            //获取输出流
            PrintWriter out = resp.getWriter();
            //1.获取framemaker的配置对象
            Configuration cfg=new Configuration();
            cfg.setDefaultEncoding("UTF-8");
            //2.获取项目根路径->指向classes
            String path = FTLServlet.class.getResource("/").getPath();
            //3.配置中添加项目模板文件夹
            cfg.setDirectoryForTemplateLoading(new File(path+"template"));
            //4.加载模板
            Template template=cfg.getTemplate("test.ftl");
            //5.封装渲染材料
            Map map=new HashMap();
            map.put("name","堂吉诃德");
            map.put("age","99");
            map.put("hobby","躺着");
            //6.渲染模板并将渲染后的页面响应前端
            template.process(map,out);
            out.flush();
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

***HtmlServlet.java

package com.howie;

import freemarker.template.Configuration;
import freemarker.template.Template;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;

/**
 * @Author weihuanwen
 * @Date 2019/8/23 14:17
 * @Version 1.0
 */
@WebServlet("/hs")
public class HtmlServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=UTF-8");
            //获取输出流
            PrintWriter out = resp.getWriter();
            //1.获取framemaker的配置对象
            Configuration cfg=new Configuration();
            cfg.setDefaultEncoding("UTF-8");
            //2.获取项目根路径->指向classes
            String path = FTLServlet.class.getResource("/").getPath();
            //3.配置中添加项目模板文件夹
            cfg.setDirectoryForTemplateLoading(new File(path+"template"));
            //4.加载模板
            Template template=cfg.getTemplate("test.html");
            //5.封装渲染材料
            Map material=new HashMap();
            material.put("title", "FreeMaker");

            Map existPreMap=new HashMap();
            material.put("existPreMap", existPreMap);
            existPreMap.put("attention", "请注意!");
            existPreMap.put("message", "有消息!");

            //设置所在地(多级变量)
            Map area=new HashMap();
            area.put("area", "西虹");
            Map city=new HashMap();
            city.put("city", area);
            Map province=new HashMap();
            province.put("province", city);
            material.put("location", province);

            //设置性别
            material.put("sex",1);

            //设置城市集合
            Set cities=new TreeSet();
            cities.add("河北");
            cities.add("河南");
            cities.add("河东");
            cities.add("河西");
            cities.add("南京");
            cities.add("北京");
            material.put("cities", cities);

            //List
            ArrayList names =new ArrayList();
            names.add("Jhon");
            names.add("Lily");
            names.add("Smith");
            names.add("Jack");
            material.put("names", names);

            //数组
            String[] stars=new String[]{"☆","☆☆","☆☆☆"};
            material.put("stars", stars);


            //6.渲染模板并将渲染后的页面响应前端
            template.process(material,out);
            out.flush();
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

3.测试

①启动项目后访问请求路径:http://localhost:8080/fs,页面展示如下:

JWeb之FreeMaker模板渲染_第2张图片

②继续访问请求路径:http://localhost:8080/hs,页面展示如下:

JWeb之FreeMaker模板渲染_第3张图片

 

你可能感兴趣的:(Java)