FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序。

所谓模板,就是一份已经写好了基本内容,有着固定格式的文档,其中空出或者用占位符标识的内容,由使用者来填充,不同的使用者给出的数据是不同的。在模板中的占位符,在模板运行时,由模板引擎来解析模板,并采用动态数据替换占位符部分的内容。

FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件,FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java文件等。

虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)

分离表现层和业务逻辑

使用JSP开发过程中在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,在后期大量的修改维护过程中就变得非常困难。FreeMarker根本不支持Java脚本代码,而是使用el表达式来输出展示数据。FreeMarker的设计初衷就是:模板+数据模型=输出,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都是由数据模型来处理的。用户最终看到的输出是模板和数据模型合并后创建的。

提高开发效率

在我们以往的开发中,使用的都是JSP页面来展示数据的,即所谓的表现层。我们都知道,JSP在第一次执行的时候需要转换成Servlet类,开发阶段进行功能调适时,需要频繁的修改JSP,每次修改都要编译和转换,那么试想一天中我们浪费在程序编译的时间有多少。相对于JSP来说,FreeMarker模板技术不存在编译和转换的问题,所以就不会存在上述问题。而且开发过程中,我们在不必在等待界面设计开发人员完成页面原形后,我们再来开发程序。

分工明确

以往用JSP展现数据时,程序员并不熟悉界面设计技术,反之界面开发人员,也并不熟悉程序语言。协调工作很困难,使用FreeMarker后,作为界面开发人员,只专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据。

在spring中简单使用:

配置文件:

<!-- FreeMarker-->
<beanid="freemarker"class="freemarker.template.Configuration"><propertyname="templateLoader" ref="templetLoader" /><propertyname="defaultEncoding" value="UTF-8"></property><propertyname="numberFormat" value="0"></property>
</bean>

代码:

public Template getTemplate(String tableName) {Template template = null;try {template = freemarker.getTemplate(tableName,freemarker.getLocale(), ENCODING);return template;} catch (IOException e) {e.printStackTrace();return null;}}
public void list(String id, HttpServletRequest request,HttpServletResponse response) {//step.1 根据表名获取该表单的配置参数String jversion = cgFormFieldService.getCgFormVersionByTableName(id);Map<String, Object> configs = configService.queryConfigs(id,jversion);//step.2 获取列表ftl模板路径FreemarkerHelper viewEngine = new FreemarkerHelper();Map<String, Object> paras = new HashMap<String, Object>();//step.3 封装页面数据loadVars(configs,paras,request);//step.4 组合模板+数据参数,进行页面展现String html = viewEngine.parseTemplate("/itoo/cgform/freemaker/autolist.ftl", paras);try {response.setContentType("text/html");response.setHeader("Cache-Control", "no-store");PrintWriter writer = response.getWriter();writer.println(html);writer.flush();} catch (IOException e) {e.printStackTrace();}      }

ftl模版:

<#setting number_format="0.#####################">
<!DOCTYPE html>
<html><head><title></title><script type="text/javascript" src="plug-in/jquery/jquery-1.8.3.js"></script><script type="text/javascript" src="plug-in/tools/dataformat.js"></script><link id="easyuiTheme" rel="stylesheet" href="plug-in/easyui/themes/default/easyui.css" type="text/css"></link><link rel="stylesheet" href="plug-in/easyui/themes/icon.css" type="text/css"></link><link rel="stylesheet" type="text/css" href="plug-in/accordion/css/accordion.css"><script type="text/javascript" src="plug-in/easyui/jquery.easyui.min.1.3.2.js"></script><script type="text/javascript" src="plug-in/easyui/locale/easyui-lang-zh_CN.js"></script><script type="text/javascript" src="plug-in/tools/syUtil.js"></script><script type="text/javascript" src="plug-in/My97DatePicker/WdatePicker.js"></script><script type="text/javascript" src="plug-in/lhgDialog/lhgdialog.min.js"></script><script type="text/javascript" src="plug-in/tools/curdtools.js"></script><script type="text/javascript" src="plug-in/tools/easyuiextend.js"></script><link rel="stylesheet" href="plug-in/uploadify/css/uploadify.css" type="text/css"></link><script type="text/javascript" src="plug-in/uploadify/jquery.uploadify-3.1.js"></script><script type="text/javascript" src="plug-in/tools/Map.js"></script></head><body style="overflow-y: scroll" ><form id="formobj" action="cgFormBuildController.do?saveOrUpdate" name="formobj" method="post"><input type="hidden" id="btn_sub" class="btn_sub"/><input type="hidden" name="tableName" value="${tableName?if_exists?html}" ><input type="hidden" name="id" value="${id?if_exists?html}" ><#list columnhidden as po><input type="hidden" id="${po.field_name}" name="${po.field_name}" value="${data['${tableName}']['${po.field_name}']?if_exists?html}" ></#list>
</form>

以上是FreeMaker能给我们带来的好处及简单的使用。当然,使用FreeMaker也可能出现很多问题,比如:读取到过期数据、抛出异常等。所以我们选择的时候应该从实际的项目需求出发来选择。同FreeMaker类似的还有:Velocity等模版引擎,可以对比了解了解。

Freemarker(一)简介相关推荐

  1. Freemarker+Fmpp简介

    1 Freemarker.Fmpp是什么  FreeMarker是个"模版引擎",所谓模版引擎,就是一段文本,其中包含一些可变的部分,这些可变部分用特殊符号标示了,这就是所谓的模版 ...

  2. 详解模板注入漏洞(下)

    作者 | 原作者gosecure,翻译整理shan66 来源 | http://gosecure.github.io/ 在上一篇文章中,我们为读者详细介绍了模版注入漏洞的概念,模版引擎的识别方法,以及 ...

  3. 零基础快速入门SpringBoot2.0教程 (三)

    一.SpringBoot Starter讲解 简介:介绍什么是SpringBoot Starter和主要作用 1.官网地址:https://docs.spring.io/spring-boot/doc ...

  4. FreeMarker简介及其语法

    1.Freemarker简介        FreeMarker允许Java servlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的.模板用servlet提供的数据动态地生 ...

  5. Freemarker 简介 及手册

    FreeMarker 手册 什么是FreeMarker? FreeMarker是一款模板引擎:即一种基于模板.用来生成输出文本(任何来自于HTML格式的文本用来自动生成源代码)的通用工具.它是为Jav ...

  6. FreeMarker 简介

    FreeMarker概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用 ...

  7. FreeMarker的逻辑判断功能简介

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/51274306 本文出自[我是干勾鱼的博客] FreeMarker是一个很不错的模 ...

  8. freemarker简介

    转自:(http://blog.csdn.net/chenghui0317/article/details/7832474)作者:永恒の_☆ 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...

  9. Java模板引擎之freemarker简介

    转载于:https://www.cnblogs.com/hwgok/p/9590375.html

最新文章

  1. KDD Cup 2020 多模态检索赛道:数据分析
  2. elasticsearch版本不同,批量查询也不相同
  3. Python脚本-批量修改文件名
  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 终结篇之发布项目
  5. 【JUC系列】Java的锁机制
  6. silverlight 使用IValueConverter 转换
  7. C++primer 第 3 章 字符串、向量和数组 3 . 4 迭代器介绍
  8. 安卓应用安全指南 4.2.3 创建/使用广播接收器 高级话题
  9. Single Responsibility Principle (SRP) - OO设计的单一职责原则
  10. Python数据结构与算法(附录)——块状链表的动态调整
  11. jQuery AJAX实现调用页面后台方法
  12. 全员远程办公,半年入 1 亿美元:GitHub 的最大竞争对手上市了
  13. PingFang(苹方)字体的引用
  14. bt5使用教程----主要是渗透方面
  15. 配流07—基于BPR函数的Frank Wolfe算法
  16. VLIW技术与嵌入式系统
  17. 电脑小知识:电脑怎么查看ip地址?
  18. gromacs 安装_gromacs cpu版安装
  19. 从软件外包到阿里技术专家再到CTO,他究竟是如何一路晋升?
  20. JavaScript概述和HTML中嵌入JavaScript的三种方式

热门文章

  1. php实现腾讯云视频加密
  2. linux下内存分配原因导致的Load过高
  3. 计算机网络智能化在铁路通信的发展,接入网在铁路通信中的应用
  4. 坐标变换学习笔记—代码篇Matlab
  5. 大学该不该开python教学_孩子该不该学编程?
  6. 四个视频营销策略,让你火过傅园慧,Papi酱
  7. 写分配与写不分配的区别
  8. 神经网络入门书籍推荐,神经网络基础书籍
  9. webug4.0支付漏洞
  10. 你离顶尖游戏大厂只差这份招面试攻略啦