模板引擎:第一章:FreeMarker

简介: 模板引擎:第一章:FreeMarker

Freemarker模板引擎技术

①概念

FreeMarker是一款模板引擎:即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据。

②工作原理

所有的模板视图技术的工作原理基本类似,也就意味着FreeMarker和JSP基本差不多。模板文件和数据模型是模板视图技术用来生成HTML页面所必须的组成部分。

数据模型(Java) + 模板文件(.ftl .jsp文件)= 输出(HTML,XML,源码文件)

JSP在Web系统中弥补了Servlet生成HTML页面的不足,但只能应用于Web系统,生成HTML页面。而FreeMarker不仅仅应用于Web系统,也可以应用于Java系统,还能生成Java, XML等文件,所以应用面更广。使用时,需要在项目pom.xml文件中增加依赖关系。

    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.19</version>
    </dependency>

用在SpringMVC中时需要加入对应的视图解析器

<bean id="freemarkerConfig"
  class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <!-- <property name="templateLoaderPath" value="/WEB-INF/ftl/" /> --> 
  <property name="templateLoaderPaths">
    <list>
      <value>/WEB-INF/ftl/</value>      
      <value>classpath:/ftl/</value>
    </list>
  </property>
  <property name="freemarkerSettings">
    <props>
      <prop key="defaultEncoding">UTF-8</prop>
      <!-- FreeMarker默认每隔5秒检查模板是否被更新,如果已经更新了,就会重新加载并分析模板。 但经常检查模板是否更新可能比较耗时。如果你的应用运行在生产模式下,而且你预期模板不会经常更新, 
        则可以将更新的延迟时间延长至一个小时或者更久。 可以通过为freemarkerSettings属性设置template_update_delay达到这一目的,0 
        表示每次都重新加载 -->
      <prop key="template_update_delay">0</prop>
      <prop key="default_encoding">UTF-8</prop>
      <prop key="number_format">0.##########</prop>
      <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
      <prop key="classic_compatible">true</prop>
      <prop key="template_exception_handler">ignore</prop>
    </props>
  </property>
</bean>
<bean
  class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"
  p:prefix="/" p:suffix=".ftl">
  <property name="cache" value="false" />
  <property name="viewClass"
    value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
  <property name="contentType" value="text/html;charset=UTF-8"></property>
  <property name="exposeRequestAttributes" value="true" />
  <property name="exposeSessionAttributes" value="true" />
  <property name="exposeSpringMacroHelpers" value="true" />
  <property name="requestContextAttribute" value="base"></property>
  <property name="order" value="0"></property>
</bean>

③基本语法

${...}

FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为interpolation(插值)。

<#-- 注释内容 -->

注释和HTML的注释也很相似,但是它们使用<#-- and -->来标识。不像HTML注释那样,FTL注释不会出现在输出中(不出现在访问者的页面中),因为FreeMarker会跳过它们。

<#if condition>
    ...
<#elseif condition2>
    ...
<#elseif condition3>
    ...
<#else>
    ...
</#if>

FTL标签和HTML标签有一些相似之处,但是它们是FreeMarker的指令,是不会在输出中打印的。这些标签的名字以#开头。(用户自定义的FTL标签则需要使用@来代替#)

④例子

bean.ftl文件

package ${packageName}.bean;
public class ${className} {
}

Java代码

// 创建Freemarker对象的配置对象
Configuration cfg = new Configuration();
// 设定默认的位置(路径)
cfg.setDirectoryForTemplateLoading(new File(""));
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
// 数据
Map paramMap = new HashMap();
String className = "User";
paramMap.put("packageName", "com.atguigu.crowdfunding");
paramMap.put("className", className);
Template t = cfg.getTemplate("bean.ftl");
// 组合生成
Writer out = new OutputStreamWriter(new FileOutputStream(new File("User.java")), "UTF-8");
// 执行
t.process(paramMap, out);

⑤常用语法

[1]条件

<#if condition>
    ...
<#elseif condition2>
    ...
<#elseif condition3>
    ...
<#else>
    ...
</#if>

[2]循环

<#list users as user>
    ${user.name},${user_index}
</#list>

[3]包含

<#include "xxxx.ftl">

[4]表达式

表达式 说明
${Request.member.name} 从Request域读取数据
${Session.member.name} 从Session域读取数据
${Application.member.name} 从Application域读取数据
${RequestParameters['id']} 读取请求参数
${book.name?if_exists } 用于判断如果存在,就输出这个值
${book.name?default(‘xxx’)} 默认值xxx
${book.name!"xxx"} 默认值xxx
${book.date?string('yyyy-MM-dd')} 日期格式
s?html 对字符串进行HTML编码
s?cap_first 使字符串第一个字母大写
s?lower_case 将字符串转换成小写
s?trim 去掉字符串前后的空白字符
s?size 获得序列中元素的数目

SpringBoot中使用FreeMarker

①依赖

        <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>

②增加相关配置

spring.freemarker.allow-request-override=false
spring.freemarker.allow-session-override=false
spring.freemarker.cache=true
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.enabled=true  
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=true
spring.freemarker.prefer-file-system-access=false
spring.freemarker.suffix=.ftl
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.settings.template_update_delay=0
spring.freemarker.settings.default_encoding=UTF-8
spring.freemarker.settings.classic_compatible=true 
spring.freemarker.order=1

其中最重要的是spring.freemarker.suffix和spring.freemarker.template-loader-path,其他配置项可以使用默认值。

  @RequestMapping("/testftl")
  public String testFtl(Model model) {
    model.addAttribute("message", "good news!!!");
    return "target";
  }

 

freemarker集成maven的简单的应用

之前做过的分布式项目中就有用到freemarker




 



项目在我的github上


也可以在百度云上下载


注意:导入项目后需要相应的修改,这里分享我的maven仓库防止导入项目全部报红。

相关文章
|
Java Windows
JDK 1.8(Windows版)安装教程
JDK 1.8(Windows版)安装教程
482 1
|
8月前
|
机器学习/深度学习 算法 计算机视觉
YOLOv11改进策略【SPPF】| SimSPPF,简化设计,提高计算效率
YOLOv11改进策略【SPPF】| SimSPPF,简化设计,提高计算效率
319 13
YOLOv11改进策略【SPPF】| SimSPPF,简化设计,提高计算效率
|
3月前
|
缓存 物联网 异构计算
智谱发布新一代旗舰模型 GLM-4.5,面向推理、代码与智能体的开源SOTA模型!
7月28日晚,智谱带来新一代旗舰模型——GLM-4.5!GLM-4.5 系列模型是专为智能体设计的基础模型。GLM-4.5拥有 3550 亿总参数量,其中 320 亿活跃参数;GLM-4.5-Air 采用更紧凑的设计,拥有 1060 亿总参数量,其中 120 亿活跃参数。GLM-4.5模型统一了推理、编码和智能体能力,以满足智能体应用的复杂需求。
455 0
|
7月前
|
运维 安全 弹性计算
基于阿里云的开源应用智能管理架构设计与工程实践
本文以Websoft9技术方案为例,探讨企业级应用管理的范式。通过解析开源应用管理面临的部署复杂性、运维低效性和知识碎片化三大挑战,提出基于阿里云的三层架构:智能应用管理门户、核心功能层和基础设施层。文章详细阐述了应用编排标准化(IaC实践)、智能运维体系构建及知识资产数字化的技术实现路径,并结合金融与制造行业的案例,展示解决方案的实际效果。最后提供开发者资源与工具链支持,助力企业高效管理应用。
245 1
|
Linux 开发工具 git
[笔记]ubuntun18.0+clion+qt5 搭建跨平台应用环境
[笔记]ubuntun18.0+clion+qt5 搭建跨平台应用环境
348 0
|
监控 算法 Linux
Linux下工具tc详细讲解及限制IP和端口实例
TC (Traffic Control) 是Linux内核中提供的一个用于控制和管理网络流量的强大工具,它允许用户实现QoS(Quality of Service)策略,包括带宽限制、优先级控制、延迟保证等。TC基于内核的队列 discipline (qdisc) 和流量类别(class) 体系结构,允许对进入或离开网络接口的数据流进行复杂的整形和过滤。
985 0
|
人工智能 弹性计算 算法
【云故事探索】NO.5:PETKIT小佩,科技与爱,共绘宠物智能生活新篇章
在数字化浪潮中,中国宠物行业蓬勃发展,国内养宠规模已超2亿,形成千亿市场。成立于2013年的PETKIT小佩,专注智能宠物用品,服务遍布40+国家。面对618、双11等高峰挑战,阿里云ECS弹性扩容助其稳定运行。借助阿里云全球化部署能力,小佩成功出海。最新可视喂食器结合AI算法与OSS存储,提升用户体验。未来,双方将进一步探索AI大模型在宠物行业的应用,持续优化养宠体验。
|
JavaScript
如何在Vue页面中引入img下的图片作为背景图。../的使用
这篇文章介绍了在Vue页面中如何引入`img`目录下的图片作为背景图,提供了两种使用相对路径的方法。第一种是使用`../assets/img/`作为路径引入图片,第二种是使用`../../assets/img/`作为路径。文章还展示了使用这些方法的代码实现和效果展示,并鼓励读者学无止境。
如何在Vue页面中引入img下的图片作为背景图。../的使用
|
测试技术 编译器 API
13-FreeRTOS任务创建与删除
13-FreeRTOS任务创建与删除
|
自然语言处理
NLP项目(二)——拼写纠错
NLP项目(二)——拼写纠错