这两种符号都是用来检查一个变量是否存在,如果不存在,则用括号里的表达式的结果来替代这个变量,从而避免因为变量不存在而引发异常。 freemarker2.4以前的版本,obj?default('www.hbbz08.com 0')总是会计算default里面的值,而和obj!('0')只在default条件成立时,才会即选括号里的表达式。2.4以后二者基本上是一样的了。