默认值操作符:
   使用形式例如:
    userName!default_expr
    或 userName!
    或 (userName)!default_expr
    或 (userName)!
    这个操作符允许你为可能不存在的变量指定一个默认值(default_expr),'!'后没有参数默认返回一个空。

    例如,假设下面展示的代码中没有名为 mouse 的变量:
      ${mouse!"No mouse."}
      <#assign mouse="Jerry">
      ${mouse!"No mouse."}
      将会输出:

      No mouse.
      Jerry

    如果默认值被省略了,那么结果将会是空串,空序列或空哈希表。 (这是 FreeMarker 允许多类型值的体现)请注意,如果想让默认值为 0 或 false,则不能省略它。例如:

    ${mouse!})
    <#assign mouse = "Jerry">
    (${mouse!})
    将会输出:

    ()
    (Jerry)

    默认值可以是任何类型的表达式,也可以不必是字符串。 也可以这么写:hits!0 或 colors!["red", "green", "blue"]。 默认值表达式的复杂程度没有

  严格限制,还可以这么来写: cargo.weight!(item.weight * itemCount + 10)。

   用于非顶层变量时,默认值操作符可以有两种使用方式:
   1. product.color!"red"
   2. (product.color)!"red"
   两种使用方式区别:
   第一种方式,当product为null,这会解析出错(java中的空指针),只有当product有值,color为null时能显示默认值 "red" 而不会报错,
   第二种方式:当product为null或者product存在而color为null,都能显示默认值"red"而不会报错

   本例和上例写法的重要区别在于用括号时,就允许其中表达式的任意部分可以未定义。而没有括号时,仅允许表达式的最后部分可以不被定义。

   警告!
   如果在 !后面有复合表达式, 如 1 + x,通常 使用括号,如 ${x!(1 + y)} 或 ${(x!1) + y)},这样就根据你的意图来确定优先级。 由于FreeMarker 2.3.x 版本的源码中的小失误所以必须这么来做。 ! (作为默认值操作) 右侧的优先级非常低。 这就意味着 ${x!1 + y} 会被 FreeMarker 误解为 ${x!(1 + y)},而真实的意义是 ${(x!1) + y}。 这个源码错误在FreeMarker 2.4中会得到修正。 在编程中注意这个错误,要么就使用FreeMarker 2.4!

因为语法的含糊 <@something a=x! b=y /> 将会解释为 <@something a=x!(b=y) />,那就是说 b=y 将会被视为是比较运算,然后结果作为 x的默认值,而不是想要的参数 b。 为了避免这种情况,如下编写代码即可: <@something a=(x!) b=y />

默认值操作符(Freemarker的空值处理)的更多相关文章

  1. Newtonsoft.Json高级用法 1.忽略某些属性 2.默认值的处理 3.空值的处理 4.支持非公共成员 5.日期处理 6.自定义序列化的字段名称

    手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数 ...

  2. 【BIRT】交叉报表中出现空值设置为默认值

    在使用BIRT做交叉报表的时候,往往会出现有些维度下的值是空值,例如如下报表: 那么我们可以为这些空值给出默认值,例如"-" 具体操作如下: 点击上图的[Cross Tab]后选中 ...

  3. combobox默认值为第一个数据,修改为空值

    以前用combobox的时候默认是空的,可是昨天不知道为什么,默认的居然为第一个数据,实在让人烦恼.百度了很多,有些人说默认本来就是为空的,而有些也和我一样默认是第一个数据. 我想造成这个现象的原因应 ...

  4. oracle-null和默认值

    Oracle的默认值处理要当心,如果应用中使用的是ORM工具,则必须要考虑对于字段为Null的处理,必要时在ORM工具中将Null转换为default或插入时去掉值为Null的字段. 可以将下面的系统 ...

  5. FreeMarker的空值运算符和逻辑运算符

    1.空值处理运算符 如果你在模板中使用了变量但是在代码中没有对变量赋值,那么运行生成时会抛出异常.但是有些时候,有的变量确实是null,怎么解决这个问题呢? 判断某变量是否存在:“??” 用法为:va ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...

  7. jeecg小吐槽续——自己折腾修改在线开发功能中“默认值”的使用

    -- 原来设置了"默认值"的字段,新建表单时不会出现在表单上,要保存后才能在列表页面出现,而且第二次编辑时,设置了"默认值"的字段再也不能改成空值! -- 要修 ...

  8. Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

    Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift1 ...

  9. struts中的常量,action配置中的默认值

    1.struts中Action的开发方式 继承ActionSupport类,这种方法实现的Action可以进行数据校验: 实现Action接口: 不继承任何类,不实现任何接口: 是否继承类或实现接口, ...

随机推荐

  1. Mysql基础01-语法

    数据库 数据的存储:将数据放到表中,表再放到库中. 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己.表名具有唯一性. 表由列组成,我们也称为字段.每个字段描述了它所含有的数据的意义表由列组 ...

  2. RabbitMQ的三大交换器

    pom文件都是相同的 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

  3. 强化学习一:Introduction Of Reinforcement Learning

    引言: 最近和实验室的老师做项目要用到强化学习的有关内容,就开始学习强化学习的相关内容了.也不想让自己学习的内容荒废掉,所以想在博客里面记载下来,方便后面复习,也方便和大家交流. 一.强化学习是什么? ...

  4. 将项目部署到github的方法

    GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub. GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的 We ...

  5. 【MYSQL】安装MySQL端口被占用

    出现问题: 安装mysql时,发现端口被占用 解决方法: 方法一: 修改端口号:3308,3309等都可以 方法二: 按键盘"win+r" → 打开 cmd → 输入netstat ...

  6. 学习ES6笔记──工作中常用到的ES6语法

    学习博客:https://segmentfault.com/a/1190000016068235

  7. ubuntu远程桌面软件vnc。

    http://www.linuxidc.com/Linux/2017-03/141936.htm 现在Linux是非常火的  很多人喜欢用它,界面简单,操作容易,有很多图形化工具如WinSCP可以与U ...

  8. 记Linux下一次乱码事件

    近来需要对着教程敲代码,但是之前在Windows上的压缩包在Linux解压后发生了乱码,主要是文件内乱码,文件名还是正常的.搜索“Linux rar解压乱码“试了一圈也没解决.不过到是发现了winra ...

  9. 《Java练习题》进阶练习题(二)

    编程合集: https://www.cnblogs.com/jssj/p/12002760.html 前言:不仅仅要实现,更要提升性能,精益求精,用尽量少的时间复杂度和空间复杂度解决问题. [程序58 ...

  10. Jenkins+GitLab+Sonarqube+Shell持续集成CI/CD

    1.部署GitLab 2.部署Jenkins 3.Sonar代码审计 4.参数化构建 5.git参数化构建