ftl编辑器(freemarker)的使用和说明

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、准备工作
1.1 下载文件
可以从/站点下载最新的freemarker.jar包(目前最新版本是2.3.18)与eclipse插件(最新版本是0.9.14)。

1.2 安装eclipse插件
将下载来的eclipse插件解压缩到本地磁盘,更改hudson.freemarker_ide_0.9.14文件夹中的freemarker-2.3.6.jar文件更改成最新版本的freemarker-2.3.18.jar,并且将META-INF/MANIFEST.MF文件中的Bundle-ClassPath属性值修改为freemarker-2.3.18.jar。

最后将hudson.freemarker_ide_0.9.14放到eclipse的plugins目录中,完成eclipse 插件的安装。

1.3 freemarker文档下载
从/官方网站中下载帮助文档(也有中文的手册)
二、freemarker的使用
2.1 简介
2.1.1 FTL tag标签
由于freemarker tag标签是属于freemarker的指令,它们仅仅是freemarker 处理过程中的信息,而不会输出到页面上,所以它们与html标签有一些区别。

这些标签都是以#号开头,如<#import "/public/work_public.ftl" as public>。

但用户自定义的标签是以@符号开头,如在freemarker中使用struts标签:<@s.if test="results!=null&&results.size()!=0">
注意FTL标签不可以在其他FTL标签和插值中使用(注释可以在FTL标签和插值中使用,因为它在解析时,整个注释都将抛弃,不会影响具体代码),如下面这样就是一个错误的写法:
<#if <#include 'foo'>='bar'>...</#if>
2.1.2 注释
freemarker的文档注释与html相似,但它是以<#--和-->来分割的。

任何介于这两个分隔符(包含分隔符本身)之间内容会被freemarker忽略,就不会输出出来了。

其他任何不是FTL 标签,插值或注释的内容将被视为静态文本,这些东西就不会被freemarker所解析,会被按照原样输出出来。

2.1.3 引入外部文件
如果模板文件使用了struts2标签,则可以这样调用:
<@s.include value="/public/publis.jsp" />
在freemarker版本2.3.15及其以后都可以使用如下方式引入外部文件:
<@include_page path="/public/publis.jsp"/>或者使用:<#include "/copyright_footer.html">的方式引入外部文件。

注意:<#include "/copyright_footer.html">是为了包含freemarker模板而不会牵涉到servlet容器,使用<#include..>包含的模板和包含它的模板共享模板处理状态,比如数据模型和模板语言变量,而<@include_page..>开始一个独立的HTTP请求处理。

对于js、css等其他外部资源的引入方式不变,依旧是类似:
<script type="text/javascript" src="./public/work_public.js"> </script>注意该路径与ftl文件路径地址无关,而是真正的访问路径。

2.2 freemarker与spring的集成
将freemarker.jar包放到web工程的lib目录中,并在web.xml文件中加入如下的代码:
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>
freemarker.ext.servlet.FreemarkerServlet
</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>NoCache</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>ContentType</param-name>
<param-value>text/html</param-value>
</init-param>
<init-param>
<param-name>template_update_delay</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
2.3 freemarker中使用struts标签
由于freemarker本身的标签在变量名不存在或变量为null的情况下处理比较复杂(它不允许出现这两种情况的变量,在使用可能出现变量名不存在或null值的变量时,首先需要判断该变量是否存在,否则当出现这两种情况时,freemarker会报解析错误,这将直接在最终生成的html页面中显示出来),所以当不能确定该值是否存在时,可以在freemarker中使用struts标签,它没有这类的问题(freemarker也提供了判断一个值是否为空的情况,如${list!}或者使用<#if指令来判断指定的变量是否存在:<#if list?exists && list!=null></#if>或<#if list!=null></#if>)。

首先将struts2-core.jar包中的struts-tags.tld文件加入到WEB-INF/tags 文件夹中
然后在需要加入struts2标签的freemarker的ftl文件头部加入如下语句:
<#assign s=JspTaglibs["/WEB-INF/tags/struts-tags.tld"]>
注意:与在jsp中使用标签类似,每个使用ftl文件的头部都需要加上上述#assign 标签,在公共文件中加入上述#assign后,其他引用该公共文件的ftl文件中若想使用struts标签的话,也是需要再次加入的。

例如:strtus2的判断语句在freemarker文件中的使用方式如下:
<@s.if test="results!=null&&results.size()!=0">
${public_count_data}<@s.property value="results.size()"/> </@s.if>
<@s.else>
${public_none_data}
</@s.else>
2.4 变量
在freemarker中变量是区分大小写的,如list就不能写成List。

定义变量使用assign标签,具体使用如:<#assign test_string="字符串">,也可以使用如<#assign test_string_array=["字符串1","字符串2","字符串3"]>的方式来定义数组(或列表)
可以使用如下两种方式在页面上显示一个变量:
struts2的property标签
<@s.property value="#er_name"/>
freemarker的${}标签
${myobj} myobj可以是后台传递的变量,也可以是在模板文件中定义的变量
处理不存在的变量
由于直接使用freemarker标签会经常碰到不存在的变量或变量值为null的情况,而freemarker则不支持使用这样的变量,因此在可能出现不存在的变量或变量值为null 时,首先需要判断该变量是否存在(是否不为null)。

如:${RequestParameters['locale']!'zh_CN',这时,如果URL参数中的locale属性不存在,则返回'zh_CN'这段字符串,如果存在,则'zh_CN'将不起任何作用。

或者使用<#if user??><h1>Welcome ${user}!</h1></#if>判断指定的变量user 是否存在(??需要结合if使用)。

2.5 列表
一般界面上可以使用两种形式来循环列表,一种是使用struts2中的iterator标签,另一种是使用freemarker的list标签。

下面就这两种标签做一些描述:
struts2的iterator标签
<@s.iterator id="user" value="results" status="index"> <@s.property value="#er_name"/>
</@s.iterator>
说明:
value="results"指的是从后台action中传递过来的列表results,即在action 中定义一个results的变量,然后定义一个get方法即可在前台页面中使用。

如果results值不是从后台获取的,那么可以使用value="{'a','b','c'}"这种方式。

id="user"指的是results列表中的每一个对象,如在循环中的:<@s.property value="#er_name"/>可以循环的显示出results中每一个对象的user_name属性。

status="index"这是一个标识行数的属性,如<@s.property value="#index.index"/>它表示当前项在循环中的步进索引的数值,该值从0开始。

也可以使用#index.odd这个属性来判断当前项在循环中步进索引的数值是偶数还是奇数,当#index.odd为true时,表示为偶数,为false时,表示为奇数。

freemarker的list标签
<#assign mylist=['a', 'b', 'c']>
<#list mylist as myobj>
${myobj_index}: ${myobj}
<#if myobj_has_next>,</#if></#list>
说明:
<#assign mylist=['a', 'b', 'c']>定义一个定长数组,数组中包含3个元素。

<#list mylist as myobj>循环mylist数组,每个数组变量在循环时取一个别名:myobj,类似Java中的for(String myobj: mylist){}。

mylist也可以更换成后台Java代码中的对象,如results:<#list results as user>
${myobj_index}这是一个包含当前项在循环中的步进索引的数值。

<#if myobj_has_next>,</#if>来辨别当前项是否是序列的最后一项的布尔值。

${myobj}在页面上显示myobj数据。

如果需要跳出list循环的话,可以使用<#break>来退出当前循环。

相关文档
最新文档