搭建一个

  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. java -static的特性和使用,静态类/方法/块/内部类/回收机制

    mark一下,今天的作业. java-core P115 如果将域定义为static,每个类中只有一个这样的域.(这里的域应该是指一片物理数据空间,而不是单纯的指代某一个变量,而是静态域). publ ...

  3. P4357 [CQOI2016]K远点对

    题意:给定平面中的 \(n\) 个点,求第 \(K\) 远的点对之间的距离,\(n\leq 1e5,K\leq min(100,\frac{n\times (n-1)}{2})\) 题解:kd-tre ...

  4. React vs Angular vs Vue 2019

    React vs Angular vs Vue 看待这三个主流框架给出的想法 Angular is the entire kitchen that gives you all the tools ne ...

  5. Win10 Subsystem Linux : Ubuntu 的root密码

    安装完Ubuntu后忽然意识到没有设置root密码, 不知道密码自然就无法进入根用户下.Ubuntu的默认root密码是随机的, 即每次开机都有一个新的root密码.我们可以在终端输入命令 sudo ...

  6. Js验证正则表达式

    //验证是否手机 var base = Objcet();base.isPhone = function(num) { var preg = /^1[3-7,8]{1}[0-9]{9}$/; retu ...

  7. Bzoj 4147: [AMPPZ2014]Euclidean Nim(博弈)

    4147: [AMPPZ2014]Euclidean Nim Time Limit: 1 Sec Memory Limit: 256 MB Description Euclid和Pythagoras在 ...

  8. 10分钟用Python爬取最近很火的复联4影评

    欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! <复仇者联盟4:终局之战>已经上映快三个星期了,全球票房破24亿美元,国内票房破40亿人民币. 虽然现在热度逐渐下降,但是我们还 ...

  9. 洛谷P1901发射站

    题目 一道单调栈裸题,主要是用单调栈维护单调性,和单调队列都可以在\(O(n)\)的时间内得出单调最大值或最小值,要比堆要快. 这个题可以用h来当做单调栈的使用对象,即用单调栈来维护高度,高度是越在栈 ...

  10. andriod studio连接SQLite

    SQLite SQLite是一种嵌入式的数据库引擎,以文件的形式保存数据的,专门适用于资源有限的设备上进行适量的数据存储. 从本质上来看,SQLite的操作方式只是一种更为便捷的文件操作,当应用程序创 ...