freemaker常用语法

来源:互联网 发布:手机测谎软件 编辑:程序博客网 时间:2024/05/18 21:08

                                                   FreeMarker简介 
    FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。所谓模板,就是一份已经写好了基本内容,有着固定格式的文档,其中空出或者用占位符标识的内容,由使用者来填充,不同的使用者给出的数据是不同的。在模板中的占位符,在模板运行时,由模板引擎来解析模板,并采用动态数据替换占位符部分的内容。 
FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 文等。  


前提:将数据封装到map中,每个元素可以是个对象,有属性,有关联的对象


properties 为准备好的Map对象集合,


注意:freeMarker控制较严格,数据如果为null会报错。




== 常用方法


${ package } packge为变量,为map的key,${}后可以直接显示内容;
${.now} 当前时间


className=dept
${ className?cap_first }   首字母大写
${ className?uncap_first } 首字母小写
全小写
<#if (list.title?length>15)> 字符串长度


${ package?replace(".","/") } 替换




== html


html 用于将字符串中的<、>、&和“替换为对应得&lt;&gt;&quot:&amp


== 特殊字符替换


$ ${'$'}
# ${'#'}


== FreeMarker不会自动进行类型的转换
 
常见的转换:
 
String -> int            ?eval
int  -> String           ?c


== for循环
properties 为准备好的Map对象集合,
表结构-----------------元数据(MetaData)
<#list properties as pro>  
private  ${pro.proType} ${pro.proName};<#if pro.proComment != "">//${pro.proComment}</#if>
</#list>


== 定义变量,显示变量


<#assign x=pro.proName?index_of("createBy")>
${x}

布尔类型转换为字符串显示
<#assign x=pro.primary?string('yes', 'no')>
${x}

==布尔判断 
<#if pro.primary>
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
</#if>
<#if pro.primary?string('yes', 'no')=="no">
<#if "createBy,createDept,createTime,updateBy,updateTime"?index_of(pro.proName) == -1>
public ${pro.proType} get${pro.proName?cap_first}() {
return this.${pro.proName};
}
public void set${pro.proName?cap_first}(${pro.proType} ${pro.proName}) {
this.${pro.proName} = ${pro.proName};
}
</#if>
</#if>


==判断空串


<#if pro.proComment != "">//${pro.proComment}</#if>




1. 判断对象是否存在(null)


经常会用到,如果对象 != null 则xxxx,在freemarker中表达比较奇怪,例如判断 target 是否为null,如果不为 nll 则做xxx动作


<#if target??>
    xxxx
</#if>
 
(目标变量后面连续两个??)
 


2. 字符串或数字比较
 
java里标准字符串比较需要 .equals() 方法,在freemarkder中进行了简化,字符串的比较方法和数字做到完全一样
 
<#if str == "success">
    xxx
</#if>


<#if str !== "error">
    xxx
</#if>



==判断是否包含子串:


pro.proName为子串


<#if "CreateBy,CreateDept,CreateTime"?index_of(pro.proName)==-1>




== 高级应用:宏


业务:实现每个文件引入版本


CopyRight.ftl
<#macro CopyRight> 
/**
 * @Description: ${ className }Service接口
 * @Author: userName
 * @Company: http://www.java.ccom
 * @CreateDate: ${.now}
 */
 </#macro>


调用:


<#import "CopyRight.ftl" as my>

<@my.CopyRight/>

 附:freemaker  jsp velocity比较

以前做web开发页面层用的基本就是就是,最近公司Java项目页面层用的技术是velocity。听说jsp要淘汰,也不知道是真是假,但本人还是比较喜欢jsp的,下面是网上查找的javaweb项目页面3种技术的区别。

在java领域,表现层技术主要有三种:jsp、freemarker、velocity。


jsp是大家最熟悉的技术
优点:
1、功能强大,可以写java代码
2、支持jsp标签(jsp tag)
3、支持表达式语言(el)
4、官方标准,用户群广,丰富的第三方jsp标签库
5、性能良好。jsp编译成class文件执行,有很好的性能表现
缺点:
jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。


velocity是较早出现的用于代替jsp的模板语言
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能良好,据说比jsp性能还要好些
3、使用表达式语言,据说jsp的表达式语言就是学velocity的
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多。
3、对jsp标签支持不够好


freemarker
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能非常不错
3、对jsp标签支持良好
4、内置大量常用功能,使用非常方便
5、宏定义(类似jsp标签)非常方便
6、使用表达式语言
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多


选择freemarker的原因:
1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
2、宏定义比jsp tag方便
3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
4、支持jsp标签
5、可以实现严格的mvc分离