一、语法

1.@

它是一个特殊的字符,表示动态声明的开始。对于简单的动态声明结尾可以从代码块中自动推断结尾,对于复杂的表达式通常加上()

  1. Hello @(customer.firstName + customer.lastName)!

注意: 在关键字、动态声明和参数之间不能有空格,否则会编译错误

也可以使用大括号来编写多语句块:

Hello @{val name = customer.firstName + customer.lastName; name}!

因为@是一个特殊的字符,需要规避它,需要的情况下使用@@来转义

My email is bob@@example.com

2.参数

必须在模板的顶部,可以有默认参数,也可以有多个参数

  1. @(customer: Customer, orders: List[Order])
  2. @(title: String = "Home")
  3. @(title: String)(body: Html)

3.构造器

Twirl支持构造器,可以通过模板顶部什么@this()字符(要在参数声明之前)来创建构造器。构造器的参数声明方式与模板参数一致。

  1. @this(myComponent: MyComponent)
  2.  
  3. @(customer: Customer, orders: List[Order])

4.for与if

for,if与{ 必须在同一行

  1. <ul>
  2. @for(p <- products) {
  3. <li>@p.name ($@p.price)</li>
  4. }
  5. </ul>
  1. @if(items.isEmpty) {
  2. <h1>Nothing to display</h1>
  3. } else {
  4. <h1>@items.size items!</h1>
  5. }

5.重复使用

  1. @display(product: Product) = {
  2. @product.name ($@product.price)
  3. }
  4.  
  5. <ul>
  6. @for(product <- products) {
  7. @display(product)
  8. }
  9. </ul>

也可以声明可重复使用的纯函数

  1. @title(text: String) = @{
  2. text.split(' ').map(_.capitalize).mkString(" ")
  3. }
  4.  
  5. <h1>@title("hello world")</h1>

通常的,以隐式开头的名称定义的可重用块将被标记为implicit

  1. @implicitFieldConstructor = @{ MyFieldConstructor() }

声明可重用值时,可以通过defining定义域

  1. @defining(user.firstName + " " + user.lastName) { fullName =>
  2. <div>Hello @fullName</div>
  3. }

6.import语句

可以在任何位置使用import语句

  1. @import utils._

可以使用root前缀来使用绝对路径

  1. @import _root_.company.product.core._

一些所有模板都会使用的通用引用,可以在buid.sbt文件中声明

  1. TwirlKeys.templateImports += "org.abc.backend._"

7.注释

@* *@

在第一行注释时可以生成Scala API文档

  1. @*************************************
  2. * Home page. *
  3. * *
  4. * @param msg The message to display *
  5. *************************************@
  6. @(msg: String)
  7.  
  8. <h1>@msg</h1>

8.转义

默认情况下,动态内容根据模板类型(例如HTML或XML)规则进行转义。如果要输出原始内容片段,请将其包装在模板内容类型中

  1. <p>@Html(article.content)</p>

9.字符串插值

模板引擎可以用作字符串插值器。把“@”换成“$”即可

  1. import play.twirl.api.StringInterpolation
  2.  
  3. val name = "Martin"
  4. val p = html"<p>Hello $name</p>"

10.可直接解析被包裹在Option或集合(SeqArrayTraversableOnce)里的值

  

二、依赖注入

通过使用构造器,模板可以被生成为一个class而不是一个静态对象。这就意味着模板可以被直接注入到Controller中,并且可以自己管理依赖。而不是controller既管理自己的依赖又管理模板的依赖

假设模板依赖于组件Summarizer,而这个组件不会被Controller使用

  1. trait Summarizer {
  2. /** Provide short form of string if over a certain length */
  3. def summarize(item: String)
  4. }

创建一个模板文件 app/views/IndexTemplate.scala.html

  1. @this(summarizer: Summarizer)
  2. @(item: String)
  3.  
  4. @{summarizer.summarize(item)}
  5. And finally define the controller in Play by injecting the template in the constructor:
  6.  
  7. public MyController @Inject()(template: views.html.IndexTemplate,
  8. cc: ControllerComponents)
  9. extends AbstractController(cc) {
  10.  
  11. def index = Action { implicit request =>
  12. val item = "some extremely long text"
  13. Ok(template(item))
  14. }
  15. }

通过这种方式,Controller不用得知Summarizer的存在,模版可以自己管理依赖信息。

如果在Play以外的框架中使用Twirl,需要用以下方式添加注解

  1. TwirlKeys.constructorAnnotations += "@javax.inject.Inject()"

  

  

PLAY2.6-SCALA(十) 模板引擎Twirl的更多相关文章

  1. Express全系列教程之(十):jade模板引擎

    一.前言 随着前端业务的不断发展,页面交互逻辑的不断提高,让数据和界面实现分离渐渐被提了出来.JavaScript的MVC思想也流行了起来,在这种背景下,基于node.js的模板引擎也随之出现. 什么 ...

  2. vue系列---Mustache.js模板引擎介绍及源码解析(十)

    mustache.js(3.0.0版本) 是一个javascript前端模板引擎.官方文档(https://github.com/janl/mustache.js) 根据官方介绍:Mustache可以 ...

  3. 最简单的JavaScript模板引擎

    在小公司待久了感觉自己的知识面很小,最近逛博客园和一些技术网站看大家在说JavaScript模版引擎的事儿,完全没有概念,网上一搜这是08年开始流行起来的...本来以为这是很高深的知识,后来在网上看到 ...

  4. Velocity模板引擎语法

    Velocity 模板引擎介绍 Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java ...

  5. js 模板引擎 jade使用语法

    Jade是一款高性能简洁易懂的模板引擎,Jade是Haml的Javascript实现,在服务端(NodeJS)及客户端均有支持. 功能 · 客户端支持 · 超强的可读性 · 灵活易用的缩进 · 块扩展 ...

  6. Java 前端模板引擎学习:thymeleaf 模板引擎

    模板引擎接口 ITemplateEngine 一.后台数据与外部数据 1.处理后台数据 $表达式是个变量表达式,用于处理在  request parameters and the request, s ...

  7. Jade —— 源于 Node.js 的 HTML 模板引擎

    2013-12-11 发布 Jade —— 源于 Node.js 的 HTML 模板引擎 开源项目介绍 web 模板引擎 node.js jade 207.8k 次阅读  ·  读完需要 69 分钟 ...

  8. SpringBoot日记——Thymeleaf模板引擎篇

    开发通常我们都会使用模板引擎,比如:JSP.Velocity.Freemarker.Thymeleaf等等很多,那么模板引擎是干嘛用的? 模板引擎,顾名思义,是一款模板,模板中可以动态的写入一些参数, ...

  9. SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆

    在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...

随机推荐

  1. 44个 Javascript 变态题解析 (上)

    原题来自: javascript-puzzlers(http://javascript-puzzlers.herokuapp.com/) 读者可以先去做一下感受感受. 当初笔者的成绩是 21/44… ...

  2. 网络编程-基础篇03(I/O模型)

    好文传播,在此插个眼: 一文读懂高性能网络编程中的I/O模型

  3. 使用video.js支持flv格式

    html5的video标签只支持mp4.webm.ogg三种格式,不支持flv格式,在使用video.js时,如果使用html5是会报错不支持. 修改了一下代码 js部分 videojs.option ...

  4. Leetcode113. Path Sum II路径总和2

    给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 ...

  5. leetcode 352 & leetcode 239 & leetcode 295 & leetcode 53 & leetcode 209

    lc352 Data Stream as Disjoint Intervals 可以用treemap解 key保存interval的start,value保存interval的end.分别找出当前va ...

  6. rabbitmq实现单发送单接收

    1.创建两个项目.都使其支持rabbitmq (1)在pom.xml文件中添加支持rabbitmq的jar包 <dependency> <groupId>org.springf ...

  7. 抓取B站小视频

    抓取B站小视频的代码如下: #请求库import requests #请求头部信息(用户代理)headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; ...

  8. Lowest Common Ancestor (LCA)

    题目链接 In a rooted tree, the lowest common ancestor (or LCA for short) of two vertices u and v is defi ...

  9. poj 3304 Segments(计算直线与线段之间的关系)

    Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10921   Accepted: 3422 Descrip ...

  10. poj 2398 Toy Storage(计算几何 点线关系)

    Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4588   Accepted: 2718 Descr ...