FreeMarker模板引擎

课程介绍

  • 了解模板引擎
  • 掌握FreeMarker常用语法
  • servlet中使用freeMarker

什么是模板引擎

  • 数据 + 模板 = 结果

  • 模板引擎将数据与展现有效的解耦

FreeMarker模板引擎_第1张图片

主流模板引擎

  • JSP
  • FreeMarker
  • BeetlBeetl是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎, 而是新一代的模板引擎,它功能强大,性能良好,超过当前流行的模板引擎。而且还易学易用。

FreeMarker

  • Freemarker 是免费开源的模板弓|擎技术

  • Freemarker提供 了大量内建函数来简化开发

  • JSPFreemarker的区别

FreeMarker模板引擎_第2张图片

FreeMarker快速上手

安装freemarker

<dependency>
  <groupId>org.freemarkergroupId>
  <artifactId>freemarkerartifactId>
  <version>2.3.30version>
dependency>

第一个freemarker示例

Java文件:

 public static void main(String[] args) throws IOException, TemplateException {
        //1.加载模板
        //创建核心配置对象
        Configuration config = new Configuration(Configuration.VERSION_2_3_30);
        //设置加载日志
        config.setClassForTemplateLoading(FreeMarkerSample01.class, "");
        //得到模板对象
        Template template =  config.getTemplate("sample01.ftl");

        //2.创建数据
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("site", "百度");
        data.put("url", "http://www.baidu.com");

        //3.产生输出
        template.process( data, new OutputStreamWriter(System.out));
    }

ftl文件:

${site} : ${url}

输出结果:

百度 : http://www.baidu.com

FTL取值

  • ${属性名} 取值,可对属性进行计算
  • ${属性名!默认值} 属性不存在,则使用默认值
  • ${属性名? 格式化} 格式化字符串

普通数据取值:

<#-- Freemarker取值 -->
${site} : ${url}
<#-- 当属性存在时,并且没使用默认值,则报错 :${author}  -->
<#-- !默认值}   -->
${author ! "不存在的属性"}
<#-- ?格式化}   -->
${date?string("yyyy年MM月dd日 HH:mm:ss SSS")}
${number}
${number?string("0.00")}

javabean的数据取值

Computer
SN:${computer.sn}
型号:${computer.model}
采购时间:${computer.dop?string("yyyy年MM月dd日 HH:mm")}
采购价格:${computer.price?string("0.00")}
配置信息(javabean中map集合取值)
Cpu:${computer.info["cpu"]}
内存:${computer.info["memory"]!"无内存信息"}

判断分支语句

<#if computer.state == 1>
状态:正在使用
<#elseif computer.state == 2>
状态:闲置
<#elseif computer.state == 3>
状态:已作废


<#-- ??代表:判断对象是否为空 -->
<#if computer.user??>
用户:${computer.user}


<#switch computer.state>
    <#case 1>
        状态:正在使用
        <#break>
    <#case 2>
        状态:闲置
        <#break>
    <#case 3>
        状态:已作废
        <#break>
    <#default>
    状态:无效状态

list迭代列表

<#list students as stu>
	${stu_index} - ${stu.name}

list迭代Map

<#list map?keys as key>
	${key} : ${map[key].属性名}

内建函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Arv0i0Cg-1594655985174)(C:%5CUsers%5Cleevmh%5CDesktop%5CJavaWEB%5Cimages%5Cimage-20200713195117907.png)]

servlet中使用freeMarker

作为基础了解,在web应用程序范畴内使用 FreeMarker 和其它并没有什么不同; FreeMarker将它的输出写入传递给 Template.process 方法的 Writer 对象,它不关心 Writer 将输出写入控制台,文件或是 HttpServletResponse 的输出流。

FreeMarker 并不知道什么是servletweb;它仅仅是使用模板文件来合并Java对象, 之后从它们中间生成输出文本。

"Model 2"模型

许多框架依照HTTP请求转发给用户自定义的"action"类,将数据作为属性放在 ServletContextHttpSessionHttpServletRequest 对象中,之后请求被框架派发到一个JSP页面中(视图层),使用属性传递过来的数据来生成HTML页面,这样的策略通常就是所指的Model 2模型。

FreeMarker模板引擎_第3张图片

servlet中如何配置

使用这样的框架,你就可以非常容易地用FTL文件来代替JSP文件。 但是,因为你的Servlet容器(Web应用程序服务器),不像JSP文件,它可能并不知道如何处理FTL文件,那么就需要对Web应用程序进行一些额外的配置:

<servlet>
  <servlet-name>freemarkerservlet-name>
  <servlet-class>freemarker.ext.servlet.FreemarkerServletservlet-class>
    
  
    <init-param>
        <param-name>TemplatePathparam-name>
        <param-value>/param-value>
    init-param>
    <init-param>
        <param-name>NoCacheparam-name>
        <param-value>trueparam-value>
    init-param>
    <init-param>
        <param-name>ContentTypeparam-name>
        <param-value>text/html; charset=UTF-8param-value> 
    init-param>
    
  <load-on-startup>1load-on-startup>
servlet>


<servlet-mapping>
  <servlet-name>freemarkerservlet-name>
  <url-pattern>*.ftlurl-pattern>
servlet-mapping>

基本原理

它是怎么工作的?

让我们先来看看JSP是怎么工作的。

许多servlet容器处理JSP时使用一个映射为 *.jspservlet请求URL格式。这样servlet就会接收所有URL是以 .jsp 结尾的请求,查找请求URL地址中的JSP文件, 内部编译后生成 Servlet,然后调用生成好的serlvet来生成页面。

这里为URL类型是 *.ftl 映射的 FreemarkerServlet 也是相同功能,只是FTL文件不会编译成Servlet,而是给 Template 对象, 之后 Template 对象的 ``process` 方法就会被调用来生成页面。

比如,代替这个JSP页面 (注意它使用了Struts标签库来保存设计,而不是嵌入可怕的Java代码):

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<html>
<head><title>Acmee Products Internationaltitle>
<body>
  <h1>Hello <bean:write name="user"/>!h1>
  <p>These are our latest offers:
  <ul>
    <logic:iterate name="latestProducts" id="prod">
      <li><bean:write name="prod" property="name"/>
        for <bean:write name="prod" property="price"/> Credits.
    logic:iterate>
  ul>
body>
html>

你可以使用这个FTL文件(使用 .ftl 扩展名而不是 .jsp):

<html>
<head><title>Acmee Products Internationaltitle>
<body>
  <h1>Hello ${user}!h1>
  <p>These are our latest offers:
  <ul>
    <#list latestProducts as prod>
      <li>${prod.name} for ${prod.price} Credits.
    #list>
  ul>
body>
html>

在这两个模板中,当你要引用 userlatestProduct 时,首先它会尝试去查找已经在模板中创建的同名变量 (比如 prod;如果你使用JSP:这是一个page范围内的属性)。如果那样做不行,它会尝试在 HttpServletRequest 对象中查找那个名字的属性,如果没有找到就在 HttpSession中找,如果还没有找到那就在ServletContext 中找。FTL按这种情况工作是因为 FreemarkerServlet 创建数据模型由上面提到的3个对象中的属性而来。 那也就是说,

这种情况下根哈希表root不是 java.util.Map (正如本手册中的一些例子那样),而是ServletContext+HttpSession+HttpServletRequest

FreemarkerServlet 也会在数据模型中放置3个哈希表,这样你就可以直接访问3个对象中的属性了。这些哈希表变量是:RequestSessionApplication (和ServletContext对应)。它还会暴露另外一个名为 RequestParameters 的哈希表,这个哈希表提供访问HTTP请求中的参数。

包含其它Web应用程序资源中的内容

你可以使用由 FreemarkerServlet 提供的客户化标签
s
<@include_page path="..."/> 来包含另一个Web应用资源的内容到输出内容中;

<@include_page path="path/to/some.jsp"/>

和在JSP中使用该标签是相同的:


你可能感兴趣的:(JavaWeb)