form>,一定不要写错了!
使用时发现对中文的支持不好,显示时中文出现乱码,这里修改下struts.xml配置文件:
现在就可以在struts2中正常使用freemarker了!
二、在java程序中使用FreeMarker
FreeMarker的模板就是一个.ftl文本文件,在该文件中使用了一些FreeMarker的特别标记,这些标记会动态显示,或者控制程序输出,如下面的模板文件代码:
${name},你好!
${msg}
这里类似于${}的就是动态的内容,称作"插值".
为了使用FreeMarker来将数据模型中的值合并到模板文件中,可按如下步骤进行:
1,创建Configuration实例,该实例负责管理FreeMarker的模板加载路径,负责生成模板实例
2,使用Configuration实例来生成Template实例,同进需要指定使用的模板文件
3,填充数据模型,数据模型就是一个Map对象
4,调用Template实例的process方法完成合并.
下面来看看几个测试实例,以加深我们的对模板语言的认识:
实例一:
Freemarker基本使用方法:
我们下面就用一个使用FreeMarker来创建一个java测试程序,将模板中的内容输出的指定的文件中,来简单了解一下其基本语法,程序源代码如下:
publicvoidtestFreemarker01()throwsException{
//指定模板文件路径(在项目下,你可以修改此路径)
Stringdir="E:
/workspace/freemarker/src/com/freemarker/test";
//创建一个Configuration对象:
该实例负责管理FreeMarker的模板加载路径,负责生成模板实例
Configurationcfg=newConfiguration();
//配置freemarker从什么地方加载模板文件,通过创建的Configuration对象加载模板文件
cfg.setDirectoryForTemplateLoading(newFile(dir));
//加载模板,生成模板实例对象,同时制定所使用的模板文件
Templatetemplate=cfg.getTemplate("test01.ftl");
//定义数据模型(Map对象),并填充数据
Maproot=newHashMap();
root.put("strvalue","世界,你好");
//定义输出,将其输出到指定文件中去
Writerout=newFileWriter(dir+"/test01_out.txt");
//处理执行,将模板与数据进行合并
template.process(root,out);
}
test01.ftl模板文件如下:
第一个测试程序:
${strvalue}
test01_out.txt文件内容结果:
第一个测试程序:
世界,你好
实例二:
Freemarker中关于空值的处理问题:
当在模板文件中取值,拿不到,为空值时,freemaker默认会将错误信息打印在页面中或输出到指定文件中,为了将错误信息隐藏到后台,而不要现在前台页面中,需要设置setTemplateExceptionHandler
来忽略异常信息,具体代码如下:
//关于空值的处理问题
publicvoidtestFreemarker02()throwsException{
Stringdir="E:
/workspace/freemarker/src/com/freemarker/test";
Configurationcfg=newConfiguration();
//配置freemarker从什么地方加载模板文件
cfg.setDirectoryForTemplateLoading(newFile(dir));
[color=red]//增加设置忽略异常
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);[/color]
//加载模板
Templatetemplate=cfg.getTemplate("test02.ftl");
//定义数据
Maproot=newHashMap();
//root.put("strvalue","世界,你好");
root.put("boolvalue",true);
root.put("today",newDate());
//定义输出
Writerout=newFileWriter(dir+"/test02_out.txt");
template.process(root,out);
}
贴出模板文件test02.ftl:
${strvalue}
${boolvalue?
string("是","否")}
${today?
string("yyyy年MM月dd日")}
文件test02_out.txt显示结果:
是
2010年04月11日
如果上面的不设置忽略异常的话,则在模板文件中的${strvalue}将取不到值而在页面显示错误,当然可以在模板文件中可以使用条件判断将空值情况排除
<#ifstrvalue?
exists>#if>。
实例三:
关于集合处理的问题
在模板中显示数据模型中集合列表信息,
显示集合列表信息:
<#list>#list>
条件判断:
<#if变量?
exists>#if>
条件${?
string("1","0")}关于这些还是去看实例吧,我就不在这里描述了。
从实例中去学习其语法。
具体代码如下:
//关于集合的处理
publicvoidtestFreemarker03()throwsException{
Stringdir="E:
/workspace/freemarker/src/com/freemarker/test";
Configurationcfg=newConfiguration();
//配置freemarker从什么地方加载模板文件
cfg.setDirectoryForTemplateLoading(newFile(dir));
//忽略异常
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
//加载模板
Templatetemplate=cfg.getTemplate("test03.ftl");
//定义数据
Maproot=newHashMap();
Listlist=newArrayList();
for(inti=0;i<10;i++){
list.add("listvalue"+i);
}
root.put("list",list);
//定义输出
Writerout=newFileWriter(dir+"/test03_out.txt");
template.process(root,out);
}
test03.ftl模板文件如下:
listvalue:
<#--正常显示的文本信息-->
<#listlistasv>
${v}-${v_index}[${v_has_next?
string("y","n")}]
#list>
test03_out.txt显示结果如下:
listvalue:
listvalue0-0[y]
listvalue1-1[y]
listvalue2-2[y]
listvalue3-3[y]
listvalue4-4[y]
listvalue5-5[y]
listvalue6-6[y]
listvalue7-7[y]
listvalue8-8[y]
listvalue9-9[n]
实例四:
关于宏定义的应用<#macro>#macro>
//关于freemarker的宏定义
publicvoidtestFreemarker04()throwsException{
Stringdir="E:
/workspace/freemarker/src/com/freemarker/test";
Configurationcfg=newConfiguration();
//配置freemarker从什么地方加载模板文件
cfg.setDirectoryForTemplateLoading(newFile(dir));
//忽略异常
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
//加载模板
Templatetemplate=cfg.getTemplate("test04.ftl");
//定义数据
Maproot=newHashMap();
root.put("name","李四");
//定义输出
Writerout=newFileWriter(dir+"/test04_out.txt");
template.process(root,out);
}
来看看模板文件test04.ftl:
<#macrogreetp>
Hello,${p}
#macro>
<@greetp="张三"/>
<@greetp="${name}"/>
来看看输出文件的结果:
Hello,张三
Hello,李四
实例五:
关于auto-import特性的使用,自动引入模板文件
//关于auto-import特性
publicvoidtestFreemarker05()throwsException{
Stringdir="E:
/workspace/freemarker/src/com/freemarker/test";
Configurationcfg=newConfiguration();
//配置freemarker从什么地方加载模板文件
cfg.setDirectoryForTemplateLoading(newFile(dir));
//忽略异常
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
//添加auto-import
cfg.addAutoImport("my","common.ftl");
//加载模板
Templatetemplate=cfg.getTemplate("test05.ftl")