在开发过程中,有可能变量的值是为null的,freemarker不像EL表达式,EL表达式当某个变量不存在的时候不会出现报错,而freemarker是不能容忍null值的,除非预先判断,或者指定为null的时候的默认值.
处理方法一.
在变量后指定默认值,当变量为null的时候就直接赋值默认值.
语法:${变量名!默认值}
项目结构:
null.ftl
<#--
处理方法一
指定默认值
当变量user不存在的时候user的值就直接赋值字符串"admin"
如果在模版中存在user变量的值,则按照模版中的数据输出,为了
演示,user是在数据模型中存在的,而user1是在数据模型中不存
在的
-->
${user!"admin"}
${user1!"zhangsan"}
<#--注意如果u1变量是在hash表中不存在的
那么此处会报错,这个需要特别注意-->
${u1.username!"zhaoliu"}
User.java
package org.freemarker.test;
/**
* 用户实体类
* @author YHC
*
*/
public class User {
private String username;//用户名称
public User() {
}
public User(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
Test.java
package org.freemarker.test;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class Test {
public static void main(String[] args) throws IOException,
TemplateException {
Configuration cfg = new Configuration();
// 指定模板文件从何处加载的数据源,这里设置成一个文件目录。
cfg.setDirectoryForTemplateLoading(new File("./template"));
// 指定模板如何检索数据模型,这是一个高级的主题了…
// 但先可以这么来用:
cfg.setObjectWrapper(new DefaultObjectWrapper());
// 创建根哈希表
Map<String,Object> root = new HashMap<String,Object>();
//此变量是在模型中存在的
root.put("user", "lisi");
//放置对象到hash表中,注意此对象的username属性是为null的
root.put("u1", new User());
// 从配置Configuration对象中获取模版
Template temp = cfg.getTemplate("null.ftl");
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
out.close();
}
}
最终输出结果:
lisi
zhangsan
zhaoliu
处理方法二.
使用if标签判断变量是否存在.
语法:<#if 变量名??></#if>
在变量名后面通过放置??来判断变量是否存在,如果指定变量不存在的话,那么会忽略if开闭标签中的内容.
项目结构和上图一致.
Test.java
package org.freemarker.test;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class Test {
public static void main(String[] args) throws IOException,
TemplateException {
Configuration cfg = new Configuration();
// 指定模板文件从何处加载的数据源,这里设置成一个文件目录。
cfg.setDirectoryForTemplateLoading(new File("./template"));
// 指定模板如何检索数据模型,这是一个高级的主题了…
// 但先可以这么来用:
cfg.setObjectWrapper(new DefaultObjectWrapper());
// 创建根哈希表
Map<String,Object> root = new HashMap<String,Object>();
//此变量是在模型中存在的
root.put("user", "lisi");
//放置对象到hash表中,注意此对象的username属性是为null的
root.put("u1", new User());
//注意此对象的username是有值的
root.put("u2",new User("qianqi"));
// 从配置Configuration对象中获取模版
Template temp = cfg.getTemplate("null.ftl");
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
out.close();
}
}
null.ftl
<#--
处理方法二
判断指定变量是否存在.
如果user变量不存在会忽略if开闭标签中的内容
-->
<#if user??>
user对象存在,值为:${user}
</#if>
<#if user1??>
user1对象不存在
<#else>
user1对象不存在
</#if>
<#--
判断多级变量.
u1对象的username属性为null的.
u2对象的username属性是有值的.
-->
<#if u1.username??>
u1对象username属性存在值为${u1.username}.
<#else>
u1对象username属性不存在.
</#if>
<#if u2.username??>
u2对象username属性存在值为${u2.username}.
<#else>
u2对象username属性不存在.
</#if>
User.java
package org.freemarker.test;
/**
* 用户实体类
* @author YHC
*
*/
public class User {
private String username;//用户名称
public User() {
}
public User(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
最终输出结果:
user对象存在,值为:lisi
user1对象不存在
u1对象username属性不存在.
u2对象username属性存在值为qianqi.