[FreeMarker 2.3.20] Part I 关于模版设计的介绍 ~准备阶段~ data-model总览

就如你们所看到的,data-model 就是一颗简单的树。这棵树可以是任意的复杂度和深度,比如下例:

(root)
  |
  +- animals
  |   |
  |   +- mouse
  |   |   |   
  |   |   +- size = "small"
  |   |   |   
  |   |   +- price = 50
  |   |
  |   +- elephant
  |   |   |   
  |   |   +- size = "large"
  |   |   |   
  |   |   +- price = 5000
  |   |
  |   +- python
  |       |   
  |       +- size = "medium"
  |       |   
  |       +- price = 4999
  |
  +- test = "It is a test"
  |
  +- whatnot
      |
      +- because = "don't know"  

	

那些类似文件夹的变量 (比如 root, animals, mouse, elephant, python, whatnot) 我们把它们叫做 hashes 我们可以通过查找名字 (比如:animal, mouse, price) 来访问其他变量的值 (被称作 子变量)。


那些存储当个值的变量我们叫做 scalars.


当你在模板中想要使用一个子变量的时候,你只需要指定一个从根节点到目标变量的以 dot 分隔的字符串就好,这个比较像是树的访问,在数据结构中,多数是将值存在叶子节点。当你想访问 mouse 里的 price 变量时,那么就需要从 root 开始 首先进入 animals, 然后是 mouses 最后将碰到 price,因此这样一个字符串是这样的 animals.mouse.price。这时当你用 ${...} 符号将类似字符串围起来的时候其实就是在告诉 FreeMarker 让它在符号出现的地方显示对应的值。


此外这里还有一种更重要的变量:sequences. 它们和 hashes 是比较类似的,但有点不同的就是它们不会存储对应变量的名称,更多的感觉是将原来可以用 hashes 表示的地方换成序号了,相应的会顺序 (sequentially) 存储这些变量集,就像数组一样通过下表来访问对应的值。如下例,在这个 data-model 中,animalswhatnot.fruits 就是 sequences:


(root)
  |
  +- animals
  |   |
  |   +- (1st)
  |   |   |
  |   |   +- name = "mouse"
  |   |   |
  |   |   +- size = "small"
  |   |   |
  |   |   +- price = 50
  |   |
  |   +- (2nd)
  |   |   |
  |   |   +- name = "elephant"
  |   |   |
  |   |   +- size = "large"
  |   |   |
  |   |   +- price = 5000
  |   |
  |   +- (3rd)
  |       |
  |       +- name = "python"
  |       |
  |       +- size = "medium"
  |       |
  |       +- price = 4999
  |
  +- whatnot
      |
      +- fruits
          |
          +- (1st) = "orange"
          |
          +- (2nd) = "banana" 

如上述,只要在 [] 中用数字就可访问一个sequence 的子变量。这个数字可以称为下标,从 0 开始 (程序员的传统,0 总是第一个的),所以第一个子变量的下标为 0, 第二个为 1, 以此类推。所以访问第一个 animal 的表达式是这样的 animals[0].name。同样要想得到 whatnot.fruits 中的 "banana" scalars值只需要这样就好 whatnot.fruits[1]


Scalars 还可以进一步的划分为以下四个类别:

  • String         即文本,如同上边由 "m","o","u","s","e"组成的任意序列,上边的 name-S, size-S 同样是 string值
  • Number      这是种数值类型,如同 price-S的值。不过呢在 FreeMarker中的字符串 "50" 和数字的 50 是两种完全不同的值类型,其实这是和 Java 等语言有同等语法的。前者只是两个字符组成的序列罢了 (碰巧对人来说是可读的数而已),后者呢,从数学的计算上说就是一个可计算的数值
  • Date/time    一个日期或者时间,存在就是年月日和时分秒的区别,比如动物被捕获的日期,商店开门的时间
  • Boolean      一类能以 true/false(yes/no, on/off 等等) 表示的值。比如 animals 可以有个 protected 子变量来表示其是否被保护。
总结:

  • data-model 可以被视为一棵树
  • Scalars 存储单个值,它的值可以是 字符串、数值、日期/时间、boolean
  • Hashes 则是能存储别的变量的容器,可以通过唯一的名称来查询包含的变量值
  • Sequences 是存储那些存在顺序的变量的容器。里边的值可以通过以0开始的下标进行访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Freemarker是一个模板引擎,用于将模板与数据结合生成最终的输出。在Freemarker中,模板文件由四个部分构成。首先是HTML文本部分,它不会被Freemarker计算,而是直接由浏器解析并输出。其次是注释部分,使用Freemarker的注释语法进行注释。第三部分是插值部分,使用${}或#{}语法进行计算,将数据插入到模板中。最后是FTL指令,类似于HTML标记,以#开头,用于控制模板的逻辑。 在使用Freemarker时,我们可以通过在Controller中添加@ModelAttribute注解来将数据传递给视图层。在视图层中,我们可以使用${}语法来获取封装的属性值。 总结起来,Freemarker是一个功能强大的模板引擎,可以方便地将模板与数据结合生成最终的输出。它具有灵活的语法和丰富的功能,适用于各种Web开发场景。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [FreeMarker详细介绍](https://blog.csdn.net/weixin_44454512/article/details/109877418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [freemarker 详细介绍](https://blog.csdn.net/zhang_adrian/article/details/100973172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值