freemarker

Java模板引擎之Freemarker篇
介绍
1,解析服务器端的数据,并展示在视图层
2,FreeMarker不是一个框架
3,Freemarker是一个web图层组件不是web框架,解析服务端数据到页面

学习新领域的流程:
1、先划分一个范围
2、定好一个目标
3、制定学习计划
4、边玩边学

maven构建spring+free marker
maven管理可直接拖动架包
pom(代表是maven项目)中添加 spring Freemarker包依赖 的配置
spring 配置 applicationcontext.xml
Freemarker Servlet (servlet 转发 request和respond) 配置spring- servlet.xml

webapp下的WEB_INF下创建ftl目录放ftl文件
web.xml 配置引入applicationcontext.xml 获得bean 或者隐式的<context:componnet-scan base-package="com.mooc.">加载对应目录下的注解过的类
web.xml 配置引入springservlet DispatcherServlet

start.spring.io 用 start.spring.io 构建spring boot项目


Java中的常见数据模型
基本数据模型 int long double boolean ..
对象类型: 类对象(User对象)
集合: list Map

Freemarker

Freemarker的取值
${var}(可进行计算)
${var!} 对null或不存在的变量不输出任何值
${var!默认值} 默认值只在null或变量不存在时输出
${var?html}如何转义html,字体大小都是文本形式显示,不会产生效果
${var!?string("yyyy")}当var有值的时候执行string格式化日期,为null或不存在则不输出

boolen类型不能用true,false会报异常
@ boolean的取值 ${var} yes
<prop key="boolean_format">yes,no</prop>
@布尔类型转换${booleanVar?string('yes','no')}

date类型:freemarker不支持java.util.Date类型,支持java.sql.Date类型
@ <prop key="date_format">yes,no</prop>
@${item.birthday?string("yyyy-MM-dd")}
@{new java.sql.Date(new Date().getTime())}


Freemarker变量的赋值以及定义
<#assign a=100/>
${a} ${a+100} ${a*100}

调用user对象的属性
{user.name}
user不存在
${(user.name)! '默认值'}先判断user是否存在,后判断name手否存在,默认值

遍历list对象 (userList)
<ul>
<#if userList??> 判断变量是否存在,存在就执行里面的东西,不存在就不执行
<#if userList?exists> 判断变量是否存在,存在就执行里面的东西,不存在就不执行
<#list userList as item>
<li> ${item.name}</li>
<li> ${item.birthday?string("yyyy-MM-dd")}</li> 日期格式化"
?string"表示调用方法格式化时间
</#list>
</#if>
</ul>


map的遍历

<ul>
<#list map?key as key>
<li> ${key}</li>
<li> ${map[key]}
</#list>
</ul>


if语法
<#assign var=100/>

<#if var==99>
<font color="red">var==99</font>
<#elseif var==100>
<font color="red">var==100</font>
<#else>
<font color="red">var!==99&&100</font>
</#if>

<#if (var=='python'&& var?length==4) || (var=='java')>

switch语法
<#assign var=100/>
<#assign var="java"/>

<#switch var>
<#case 100>
<#case 111>
.....
<#break>
<#case 100>
..
<#break>
<#default>
...
<#break>
</#switch>


字符串 集合的操作
+ 字符串拼接
[index] 集合取值

<#assign a="hello">
<#assign b="world">
${a+b}
${(a+b)?substring(5,8)} 包前不包后
${(a+b)?length}
${(a+b)?upper_case}
${(a+b)?lower_case}
${(a+b)?index_of('w')}
${(a+b)?last_index_of('w')}
${(a+b)?replace('o',"xx")}


*****自定义指令实现TemplateDirectiveModel 自定义函数实现TemplateMethodModelEx
**自定义函数

<#assign myList=[2,3,4,5,1,,8,9,8,7]>

<#list sort_int(myList) as item>
${item}

</#list>


Java

mv.addObject("sort_int",new SortMethod());

》 class SortMethod implements TemplateModelEx{

public Object exec(List arguments) throws TemplateModelException{
//获取第一个参数
SimpleSequence arg0=(SimpleSequence)arguments.get(0);
List<BigDecimal> list=arg0.toList();
Collections.sort(list,new Comparator<BigDecimal>(){
public int compare(BigDecimal o1,BigDecimal o2){

return o1.intvalue()-o2.intValue();//升序


}

})

};


}


排序:<#list myList?sort as item> 调用sort方法进行排序(升序)
<#list myList?sort?reverse as item> 降序
${item_index} //获取下标

</#list>

${myList?size}
${myList[3]} //通过下表获取元素



**自定义指令(自定义指令用@符号)

eg:用户123456是否拥有admin角色,并且返回admin的权限

<@role user='123456' role="admin"; result1,result2>
role: user 用户id role:用户角色
result1 用户是否有该角色 result2 用户所拥有的角色
<#if result1>
</#if>

<#list result2 as item>
${item}
</#list>
</@role>

role是在spring_freemarker.xml中配置

<property name="freemarkerVariables">
<map>
<entry key="role" vaule-ref="roleDirectiveModel">
</map>
</property> key:自定义指令的名称 vaule-ref:freemarker加载的bean(注解@service)

@service
public class RoleDirectiveModel implements TemplateDirectiveModel{

public void execute(Environment env,Map params(入参),TemplateModel[] loopvars(返回值),TemplateDirectiveBody body) throws TemplateException,IOException{

TemplateScalarModel user=(TemplateScalarModel)params.get("user");
TemplateScalarModel role=(TemplateScalarModel)params.get("role");
if("123456".equals(user.getString())&& "admin".equals(role.getString())){
loopvars[0]=TemplateBooleanModel.TRUE;

}


List<String> otherRights=new ArrayList<String>();
otherRights.add("add");
otherRights.add("delete");
otherRights.add("update");
loopvars[1]=new SimplateSequence(otherRights);
body.render(env.getOut()); //输出

}


}

*****%%%%%%%%***********


macro语法:(macro封装模板片段)
<#macro macro_name param1 param2 param3..../ >
template_code ${param1}

<#nested/> //调用的引用

</#macro>

调用:<@macro_name param1="value1" param2="value2"/>

nested_template 嵌套的代码片段

</@macro_name>

eg:定义:@ 无参 <#macro test>
<font color="red">大大</font>
</#macro>

调用:<@test/>


@ 带参:<#macro test param1 param2="dd">

<font color="red">大大 ${param1} ${param2}</font>
</#macro>

调用:<@test param1="java" param2="python"/>
<@test param1="java"/> 此时${param2}值为默认值dd


@多参数 <#macro test param1 param2="dd" paramExt...>
${paramExt['paramW']} //此时paramW就是调用时传的参数
</#macro>
调用:<@test param1="java" param2="python" paramW="23"/>

nested:嵌套(灵活模板)
<#macro test param1="java">
${param1}<br/>
<#nested param1,"我的nested参数"><br/>
</#macro>

<@test param1="java";loopVar1,loopVar2>

<font color="red">hello ${loopVar1} ${loopVar2}</font>
<@test>

<@test param1="python";loopVar1>

hello ${loopVar1}
<@test>


function语法
<#function function_name param1 param2>
<#return>
</#function>
调用:
${function_name(param1,param2)}

eg:定义 <#function addTest param1 param2>
<#return param1+param2>
</#function>

调用:${addTest(10,10)}

举例子

<a <#if topic.isCollect?? && topic.isCollect=="y">
class="topic-favo favo-cur" <#else> class="topic-favo" </#if>
id="${topic.id}" href="javascript:void(0);"><i class="iconfont">&#xe672;</i></a>


<ul>
<#list  topThreeTopicList as  topic>
<#if topic_index == 0>
<li class="topic-list-item topic-list-item1" data-url="#">
<a href="#"><img src="${topic.topicImage}"></a>
<#else>
<li class="topic-list-item " data-url="#">
<a href="${basepath}/topic/detail/${topic.id}"><img src="${topic.topicImage}"></a>
</#if>

<div class="floatl">
<p class="name text-ellipsis">${topic.topicName}</p>
<p class="date"><i class="iconfont">&#xe606;</i>${topic.topicPeriod}</p>
</div>
<div class="flaotr">
<p><i class="iconfont">&#xe610;</i><span>${topic.pageView}</span></p>
<p>${topic.isCollect!""} <a <#if topic.isCollect?? && topic.isCollect=="y">
class="topic-favo favo-cur" <#else> class="topic-favo" </#if>
id="${topic.id}" href="javascript:void(0);"><i class="iconfont">&#xe672;</i></a><span>${topic.collect}</span></p>

</div>
</li>
</#list>
</ul>
<p class="mb2">
<span class="fright">${template.browseNum}浏览/${template.downloadNum}下载</span>
<#if template.nowPrice!="0.00"&&template.score=0 >
<span class="mb_price">
<i class="iconfont">&#xe617;</i>${template.nowPrice}
</span>
<#elseif template.nowPrice=="0.00"&&template.score=0>
<span class="mb_score">
<i class="iconfont">&#xe616;</i>免费
</span>
<#else>
<span class="mb_score">
<i class="iconfont">&#xe618;</i>${template.score}
</span>
</#if>
</p>
原文地址:https://www.cnblogs.com/huiminxu/p/8393218.html