搭建一个

  1、FreeMarker取值

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>逻辑</h1>
<div>
1、取基本值
<ul>
<li>整型:${intValue }</li>
<li>字符串:${stringValue }</li>
<li>double型:${doubleValue }</li>
<li>布尔型:${booleanValue }</li>
<li>时间:${dateValue?string('yyyy-MM-dd') }</li>
<li>null值:${nullValue}</li>
</ul>
2、运算
<ul>
<li>加法:${intValue + 100}</li>
</ul>
3、集合
<ul>
List集合
<#list list as item>
<li>${item}</li>
</#list>
Map集合
<#list map?keys as key>
<li>${key}:${map[key]}</li>
</#list>
</ul>
</div>
</body>
</html>

  2、逻辑语法

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>逻辑语法</h1>
<div>
1、if
<ul>
<#assign var=99/>
<#if var == 99 >
<li>var=${var }</li> </#if> <#assign var1=199/>
<#if var1 == 99 >
<li>var1=${var1 }</li>
<#else>
<li>var1=99</li>
</#if> <#assign var2 = 299/>
<#if var2 &lt; 99 >
<li>var2 &lt; 99</li>
<elseif var2 == 99 >
<li>var2 = 299</li>
<#else >
<li>var2 &gt; 99</li>
</#if>
</ul>
2、switch
<ul>
<#assign var=3/>
<#switch var >
<#case >
<li>1</li>
<#case >
<li>2</li>
<#break>
<#case >
<li>3</li>
<#case >
<li>4</li>
<#break>
<#default>
<li>default</li>
</#switch>
</ul> </div>
</body>
</html>

  3、字符串处理

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>字符串</h1>
<h2>字符串常用内置函数</h2>
<div>
<ul>
<#assign a='hello'/>
<#assign b='world'/>
<br />"+" 加号连接
<li>a + b = ${a + b }</li>
<br />substring 截取
<li>(a + b)?substring(5,8) = ${(a + b)?substring(5,8) }</li>
<br />length 长度
<li>(a + b)?length = ${(a + b)?length }</li>
<br />upper_case 大写
<li>(a + b)?upper_case = ${(a + b)?upper_case }</li>
<br />lower_case 小写
<li>(a + b)?lower_case = ${(a + b)?lower_case }</li>
<br />index_of 位置
<li>(a + b)?index_of('w') = ${(a + b)?index_of('w') }</li>
<br />replace 替换
<li>(a + b)?replace('w', 'W' ) = ${(a + b)?replace('w', 'W') }</li>
<br />contains 包含
<li>(a + b)?contains('w') = ${(a + b)?contains('w') }</li>
</ul>
</div>
</body>
</html>

  4、自定义函数

    a、编写自定义函数方法类

 package com.test.freemarker.method;

 import java.math.BigDecimal;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; import freemarker.template.SimpleSequence;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException; public class SortMethod implements TemplateMethodModelEx{ @Override
public Object exec(List arguments) throws TemplateModelException { // 获取第一个请求参数
// 参数先转freemarker数据类型
SimpleSequence arg0 = (SimpleSequence) arguments.get(0);
List<BigDecimal> list = arg0.toList(); Collections.sort(list, new Comparator<BigDecimal>() { @Override
public int compare(BigDecimal o1, BigDecimal o2) {
return o1.compareTo(o2);
}
}); return list;
} }

    b、在model中添加方法

 @RequestMapping("/customMethod")
public ModelAndView customMethod() {
ModelAndView modelAndView = new ModelAndView("customMethod");
modelAndView.addObject("sort_int", new SortMethod());
return modelAndView;
}

    c、也模板中使用方法

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>自定义函数</h1>
<h2>字符串常用内置函数</h2>
<div>
<#assign myList=[2,3,4,5,1,8,9,7] />
<br />未排序
<ul>
<#list myList as item >
<li>${item }</li>
</#list>
</ul>
<br />排序(sort_int)
<ul>
<#list sort_int(myList) as item >
<li>${item }</li>
</#list>
</ul>
</div>
</body>
</html>

  5、指令、自定义指令

    a、编辑自定义指令类

 package com.test.freemarker.service;

 import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import org.springframework.stereotype.Service; import freemarker.core.Environment;
import freemarker.template.SimpleSequence;
import freemarker.template.TemplateBooleanModel;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateScalarModel; @Service
public class RoleDirectiveModel implements TemplateDirectiveModel{ /**
* env:环境变量
* params:指令参数(存储所需的值,随便是什么Key-Value)
* loopVars:循环变量
* body:指令内容
* 除params外,其他的都能是null
*/
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
throws TemplateException, IOException {
System.out.println("================="); TemplateScalarModel user = (TemplateScalarModel) params.get("user");
TemplateScalarModel role = (TemplateScalarModel) params.get("role"); if("123456".equals(user.getAsString()) && "admin".equals(role.getAsString())) {
loopVars[0] = TemplateBooleanModel.TRUE;
} List<String> otherRights = new ArrayList<String>();
otherRights.add("add");
otherRights.add("update");
otherRights.add("delete");
loopVars[1] = new SimpleSequence(otherRights); // 输出
body.render(env.getOut());
} }

    b、注册自定义指令

 <bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="" />
<property name="freemarkerSettings">
<props>
<!-- 设置标签类型 两种:[] 和 <> , []这种标记解析要快些 -->
<prop key="tag_syntax">auto_detect</prop>
<!-- 检查模板更新时间间隔,默认5s -->
<prop key="template_update_delay">1</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="url_escaping_charset">UTF-8</prop>
<prop key="locale">zh-CN</prop>
<!-- 时间格式化 -->
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">0.##########</prop>
<!-- 去掉多余的空格 -->
<prop key="whitespace_stripping">true</prop>
<prop key="classic_compatible">true</prop>
<prop key="template_exception_handler">ignore</prop>
</props>
</property> <!-- freemarker变量 -->
<property name="freemarkerVariables">
<map>
<entry key="role" value-ref="roleDirectiveModel"></entry>
</map>
</property>
</bean>

    c、在模板中使用自定义指令

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>指令</h1>
<h2>List常用指令</h2>
<div>
<#assign myList=[2,3,4,5,1,8,9,7] />
<br />排序指令sort
<ul>
<#list myList?sort as item >
<li>${item_index } - ${item }</li>
</#list>
</ul>
<br />导至输出reverse
<ul>
<#list myList?sort?reverse as item >
<li>${item_index } - ${item }</li>
</#list>
</ul>
<br />大小
<ul>
<li>myList?size - ${myList?size }</li>
<li>myList[3] - ${myList[3] }</li>
</ul>
</div>
<h2>自定义指令</h2> <div>
<@role user='123456' role='admin' ; result1, result2 >
<br />例:用户123456 是否拥有admin角色,并返回admin权限
<ul>
<#if result1 >
<li>我的角色是: amdin</li>
</#if>
我拥有的权限是:
<#list result2 as item >
<li>${item }</li>
</#list>
</ul>
</@role>
</div>
</body>
</html>

  6、FreeMarker内置函数

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>内建函数</h1>
<h2>1、字符串内建函数</h2>
<div>
<#assign myList=[2,3,4,5,1,8,9,7] />
<br />split
<ul>
<#list 'a|b|c|d'?split('|') as item >
<li>${item }</li>
</#list>
</ul>
<br />字符串转日期
<ul>
<#assign var1 = "01/03/2017"?date("MM/dd/yyyy") />
<#assign var2 = "15:05:30"?time("HH:mm:ss") />
<#assign var3 = "2019-07-22 03:05 PM"?datetime("yyyy-MM-dd HH:mm") />
<li>${var1 }</li>
<li>${var2 }</li>
<li>${var3 }</li>
</ul>
</div>
<h2>2、数字内建函数</h2>
<div>
<#assign numVar1=3.1415926 />
<br />3.1415926
<ul>
<li>${numVar1?string("0.##") }</li>
<li>${numVar1?round }</li>
</ul>
</div>
<h2>3、List内建函数</h2>
<div>
<#assign myList1=[2,3,4,5,1,8,6,9,7] />
<br />chunk
<ul>
<li>${myList1?chunk(3)?size }</li>
<#list myList1?chunk(3)?last as item >
<li>${item }</li>
</#list>
</ul>
</div>
<h2>4、其他内建函数</h2>
<div>
<#assign sVar="hello" />
<br />hello
<ul>
<li>${sVar?is_number?string('yes', 'no') }</li>
<li>${sVar?has_content?string('yes', 'no') }</li>
<li>${"1" + "2" ? eval }</li>
<li>${vDefault!"sss" }</li>
</ul>
</div> </body>
</html>

  7、macro宏指令

 <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>模板中使用macro指令定义</h1>
<h2>1、macro:宏指令</h2>
<div>
<br />无参数的macro
<ul>
<#macro test>
<li>我是无参的macro</li>
</#macro>
<@test />
</ul>
<br />有参数的macro
<ul>
<#macro test param1 param2>
<li>我是有参的macro param1 = ${param1}, param2 = ${param2}</li>
</#macro>
<@test param1="java" param2="python" />
</ul>
<br />有默认值参数的macro
<ul>
<#macro test param1 param2="def">
<li>我是有默认值参数的macro param1 = ${param1}, param2 = ${param2}</li>
</#macro>
<@test param1="java" />
</ul>
<br />有多个参数的macro
<ul>
<#macro test param1 param2="def" paramExt... >
<li>有多个参数的macro param1 = ${param1}, param2 = ${param2}</li>
<li>${paramExt["param3"]} </li>
</#macro>
<@test param1="java" param2="python" param3="html"/>
</ul>
</div>
<h2>2、nested</h2>
<div>
<br />嵌套 <ul>
<#macro test param1="java">
<li>${param1 }</li>我是无参的macro<br />
<#nested param1, "我的nested 参数">
</#macro>
<@test param1="java1"; loopVar1, loopVar2>
<font color="red">hello ${loopVar1}, ${loopVar2}</font>
</@test>
<@test param1="java2"; loopVar1, loopVar2>
hello ${loopVar1}, ${loopVar2}
</@test>
</ul>
</div>
<h2>2、函数</h2>
<div>
<br />函数调用 <ul>
<#function doAdd param1 param2>
<#return param1+param2 >
</#function>
<li>${doAdd(20, 30) }</li>
</ul>
</div> </body>
</html>

【FreeMarker】FreeMarker使用(三)的更多相关文章

  1. FreeMarker笔记 第三章 模板

    ,先来一打小白兔: 3.1 总体结构 用程序语言编写的程序就是模板,模板也被成为FTL(代表FreeMarker模板语言). 模板是由如下部分混合而成的: Text文本:文本会照着原样来输出: Int ...

  2. Freemarker常用技巧(三)

    freemarker模板解析过程 例如:一个freemarker表达式<body> ${hello} </body>,会被解析成三个部分,分别是<body>${he ...

  3. springmvc freemarker 全局变量的三种配置方式

    方法一 直接在spring-servlet.xml 中进行配置 <bean id="freemarkerConfiguration" class="org.spri ...

  4. FreeMarker 学习

    一.FreeMarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是 ...

  5. 初识FreeMarker

    一.什么是FreeMarker? FreeMarker基于设计者和程序员是具有不同专业技能的不同个体的观念 他们是分工劳动的:设计者专注于表示——创建HTML文件.图片.Web页面的其它可视化方面: ...

  6. Freemarker的使用方法

    1. Freemarker概念 1.1 什么是freemarker FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运 ...

  7. freemarker常见语法大全

    推荐freemarker系列教程:http://swiftlet.net/archives/category/freemarker FreeMarker的插值有如下两种类型:1,通用插值${expr} ...

  8. 基于springboot的freemarker创建指定格式的word文档

    在web或其他应用中,经常我们需要导出或者预览word文档,比较实际的例子有招聘网站上预览或者导出个人简历,使用POI导出excel会非常的方便,但是如果想导出word,由于其格式控制非常复杂,故而使 ...

  9. Java导出freemarker实现下载word文档格式功能

    首先呢,先说一下制作freemarker模板步骤, 1. 在WPS上写出所要的下载的word格式当做模板 2. 把模板内不固定的内容(例:从数据库读取的信息)写成123或者好代替的文字标注 3. 把固 ...

随机推荐

  1. 《代码敲不队》第九次团队作业:Beta冲刺与验收准备

    项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 代码敲不队 作业学习目标 (1)掌握软件测试基础技术(2)学习迭代式增量软件开发过程(Scrum) ...

  2. 神经网络MNIST数据集分类tensorboard

    今天分享同样数据集的CNN处理方式,同时加上tensorboard,可以看到清晰的结构图,迭代1000次acc收敛到0.992 先放代码,注释比较详细,变量名字看单词就能知道啥意思 import te ...

  3. mysql 截取字符串 函数

    文章摘取自http://www.cnblogs.com/zdz8207/p/3765073.html 练习截取字符串函数(五个) mysql索引从1开始 一.mysql截取字符串函数 1.left(s ...

  4. python_并发编程——消费者和生产者模型

    消费者和生产者模型 from multiprocessing import Process,Queue import time import random class Producer(Process ...

  5. ado.net核心:DataTable对象

    概述 DataTable表示内存中数据的一个表. .net命名空间:System.Data DataTable构造方法 DataTable() //不带参数初始化DataTable 类的新实例. Da ...

  6. 行为型模式(十一) 解释器模式(Interpreter)

    一.动机(Motivate) 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化.在这种情况下,将特定领域的问题表达为某种语法规 ...

  7. 002——转载Excel2010分成两个或者多个独立窗口

    在借鉴了很多个baidu方法之后,使用修改注册表之后我的Excel终于可以独立窗口出来了.转自:www.xuexila.com/excel/2010/2051008.html方法如下: 本操作需要修改 ...

  8. Acwing P274 移动服务 题解

    每日一题 day21 打卡 Analysis DP的状态为已经完成的请求数量,通过指派一位服务员可以把”完成i - 1个请求的状态”转移到”完成i个请求的状态”那么我们可以知道转移从dp[i - 1] ...

  9. C# 打开 EXE 文件

    命名空间是using System.Diagnostics; 在编写程序时经常会使用到调用可执行程序的情况,本文将简单介绍C#调用exe的方法.在C#中,通过Process类来进行进程操作. Proc ...

  10. 浅谈Python-IO多路复用(select、poll、epoll模式)

    1. 什么是IO多路复用 在传统socket通信中,存在两种基本的模式, 第一种是同步阻塞IO,其线程在遇到IO操作时会被挂起,直到数据从内核空间复制到用户空间才会停止,因为对CPython来说,很多 ...