freemarker 处理null值

 

在开发过程中,有可能变量的值是为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.
 
 






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值