如果empty标签没有在servlet中添加key或者值为null，会报错 empty Value Expression newTag is undefined。有人说这是个好的控制错误的机制，但本人不这么认为，因为空值太常见了，谁知道什么时候里面就成空值了？每个变量理论上都有可能。难道每个变量都要加入一个判断？就像struts中丑陋的<empty>标签？既然是模板引擎，就要灵活，何必来那么多限制？还好，freemarker至少提供了解决办法，否则我只好选择其它引擎了。freemarker中空值的多种处理方法：1.按照freemarker的规范，老老实实的判断是否有空值，有空值怎么处理。这在某种时候是有用的。格式：${empty!"EmptyValue of fbysss"} 比如值为空时，你可以给出一个友好的说明，但是很多的变量都要这么说明，未免太麻烦了。2.<#escape x as x!""></#escape>可以对所有的变量进行空值处理，这里是全部替换为空字符串。当然也可以替换为其它字符串。 如果其中某些变量不需要这种替换，可以加入<#noescape></#noescape>标签。3.属性配置方法： 配置classic_compatible=true可以满足一般需要。默认情况变量为null则替换为空字符串，如果需要自定义，写上${empty!"EmptyValue of fbysss"}的形式即可a.通过Configuration设置。Configuration cfg = new Configuration(); cfg.setClassicCompatible(true);//设置属性b.通过Eviroment设置。 Environment env = template.createProcessingEnvironment(root, out); env.setClassicCompatible(true);c.通过ftl设置：在ftl前加入 ;d.通过Spring配置文件设置 true e.class目录下添加freemarker.properties文件：加入classic_compatible=true (需要struts2或spring)举一反三，其他属性也可以用类似方法进行设置。
Freemarker空值null处理的3种方式：?exists、?if_exists、?default("")<#list itemList as item></#list>如果 item为NULL 会报错。加上?exists(是否存在) 或者?default("")如果为null时默认为空。例如：<#if itemList ?exists && itemList .size != 0 > <#if Session["itemList"]?exists> <#list Session["itemList"] as item> ${item?default("")} </#list> <#if item?exists> 等价于 ${item?if_exists}exists用在逻辑判断，而if_exists用来打印东西时用到，如果存在打印，不存在打印空字符串。exp1?exists 可用exp1?? 代替 exp1?if_exists 可用exp1! 代替 exp1?default(exp2) 可用exp1!exp2 代替