FreeMarker

Freemarker是免费开源的模板引擎技术;

Freemarker脚本为Freemarker Template Language;

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

JSP与Freemarker

JSP Freemarker
官方标准
执行方式 编译型 解释型
执行效率
开发效率
扩展能力
数据提取 JSTL+EL 内置标签

FreeMarker基本用法

FreemarkerSample1.java

package freemarker;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map; import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException; public class FreemarkerSample1 { public static void main(String[] args) throws TemplateNotFoundException, MalformedTemplateNameException,
ParseException, IOException, TemplateException {
// 1.加载模板
// 创建核心配置对象
Configuration config = new Configuration(Configuration.VERSION_2_3_28);
// 设置加载的目录
config.setClassForTemplateLoading(FreemarkerSample1.class, ""); // ""代表当前包
// 得到模板对象
Template t = config.getTemplate("sample1.ftl");
// 2.创建数据
Map<String, Object> data = new HashMap<>();
data.put("site", "百度");
data.put("url", "http://www.baidu.com");
// 3.产生输出
t.process(data, new OutputStreamWriter(System.out));
} }

sample1.ftl

<#-- 这是注释 -->
${site}-${url}

控制台输出

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

FTL取值

  • ${属性名} 取值,可对属性进行计算
  • ${属性名!默认值} 如果属性不存在的话使用默认值
  • ${属性名?string("")} 格式化输出

分支判断

<#-- if -->
<#if state == 1>
我是1
<#elseif state == 2>
我是2
</#if>
<#if user??> <#-- 判断对象是否为null -->
我不是null
</#if> <#-- switch -->
<#switch state>
<#case 1>
我是1
<#break>
<#case 2>
我是2
<#break>
<#default>
其他
</#switch>

list迭代

<#-- list迭代列表 -->
<#list students as stu>
<li>${stu_index}-${stu.name}</li>
</#list> <#-- list迭代Map -->
<#list map?keys as key>
${key}:${map[key]}
</#list>

常用内建函数

函数名 说明 示例
lower_case/upper_case 大小写转换 "abcdefg"?upper_case
cap_first 首字母大写 "jackson"?cap_first
index_of 查找字符索引 "abcdef"?index_of("b")
length 返回字符串长度 "abcdef"?length
round/floor/ceiling 四舍五入/下取整/上取整 pi?floor
size 得到集合元素总数 students?size
first/last 获取第一个/最后一个元素 students?first
sort_by 按某个属性对集合排序 list?sort_by("time")
<#-- ?string可以实现三目运算符的操作 -->
${(words?index_of("blood") != -1)?string("包含敏感词汇", "不包含敏感词汇")} <#-- replace -->
${words?replace("blood", "*****")} <#-- sort_by返回一个新的集合,默认升序排列 -->
<#-- reverse将顺序反转 -->
<#list computers?sort_by("price")?reverse as c>
${c.sn}-${c.price}
</#list>

freemarker中文官方参考手册: http://freemarker.foofun.cn/

Freemarker与Servlet整合

配置FreemarkerServlet

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>fm</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/WEB-INF/ftl</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
</web-app>

最新文章

  1. &lt;welcome-file-list&gt;标签的控制作用以及在springmvc中此标签的的配置方式
  2. 【前端】String.prototype.match() 用法详解
  3. struts2中的constant配置详解
  4. iptables防火墙原理详解
  5. 关于点击ztree的节点将页面生成到easyui的新增选项卡(easyui-tabs)时,总是在浏览器中生成一个新的页面的问题
  6. 【读书笔记】读《JavaScript DOM 编程艺术-第2版》
  7. css 历史及css3 新特性
  8. 解决xubuntu的thunar第一次启动慢
  9. gcc: error trying to exec &#39;cc1plus&#39;: execvp: 没有那个文件或目录
  10. 计算机视觉入门 Intorduction To Computer Vision
  11. TCP/UDP常见问题小结
  12. cocos2dx实现功能强大的RichText控件
  13. Android中全局搜索(QuickSearchBox)详解
  14. MySql命令——show,分页,正则表达式
  15. dm642在线写EPROM.txt
  16. nyoj_120: 校园网络
  17. yii2.0 url美化-apache服务器
  18. SQL Server 怎么在分页获取数据的同时获取到总记录数
  19. #Leetcode# 1016. Binary String With Substrings Representing 1 To N
  20. 【译】8. Java反射——注解

热门文章

  1. 清新三角格子风工作报告季度总结年终汇报通用PPT模板
  2. 我的第一个Mybatis项目搭建
  3. 03. Go 语言容器
  4. 详解C++ STL map 容器
  5. Educational Codeforces Round 76 (Rated for Div. 2) D. Yet Another Monster Killing Problem 贪心
  6. vb.net 带有一个参数的线程
  7. 防止ssh暴力破解的小工具denyhosts
  8. IT兄弟连 Java语法教程 流程控制语句 循环结构语句1
  9. 解决最新Java12 安装
  10. [01]从零开始学 ASP.NET Core 与 EntityFramework Core 课程介绍