PLAY2.6-SCALA(十) 模板引擎Twirl
一、语法
1.@
它是一个特殊的字符,表示动态声明的开始。对于简单的动态声明结尾可以从代码块中自动推断结尾,对于复杂的表达式通常加上()
Hello @(customer.firstName + customer.lastName)!
注意: 在关键字、动态声明和参数之间不能有空格,否则会编译错误

也可以使用大括号来编写多语句块:
Hello @{val name = customer.firstName + customer.lastName; name}!
因为@是一个特殊的字符,需要规避它,需要的情况下使用@@来转义
My email is bob@@example.com
2.参数
必须在模板的顶部,可以有默认参数,也可以有多个参数
@(customer: Customer, orders: List[Order])
@(title: String = "Home")
@(title: String)(body: Html)
3.构造器
Twirl支持构造器,可以通过模板顶部什么@this()字符(要在参数声明之前)来创建构造器。构造器的参数声明方式与模板参数一致。
@this(myComponent: MyComponent) @(customer: Customer, orders: List[Order])
4.for与if
for,if与{ 必须在同一行
<ul>
@for(p <- products) {
<li>@p.name ($@p.price)</li>
}
</ul>
@if(items.isEmpty) {
<h1>Nothing to display</h1>
} else {
<h1>@items.size items!</h1>
}
5.重复使用
@display(product: Product) = {
@product.name ($@product.price)
}
<ul>
@for(product <- products) {
@display(product)
}
</ul>
也可以声明可重复使用的纯函数
@title(text: String) = @{
text.split(' ').map(_.capitalize).mkString(" ")
}
<h1>@title("hello world")</h1>
通常的,以隐式开头的名称定义的可重用块将被标记为implicit
@implicitFieldConstructor = @{ MyFieldConstructor() }
声明可重用值时,可以通过defining定义域
@defining(user.firstName + " " + user.lastName) { fullName =>
<div>Hello @fullName</div>
}
6.import语句
可以在任何位置使用import语句
@import utils._
可以使用root前缀来使用绝对路径
@import _root_.company.product.core._
一些所有模板都会使用的通用引用,可以在buid.sbt文件中声明
TwirlKeys.templateImports += "org.abc.backend._"
7.注释
@* *@
在第一行注释时可以生成Scala API文档
@*************************************
* Home page. *
* *
* @param msg The message to display *
*************************************@
@(msg: String) <h1>@msg</h1>
8.转义
默认情况下,动态内容根据模板类型(例如HTML或XML)规则进行转义。如果要输出原始内容片段,请将其包装在模板内容类型中
<p>@Html(article.content)</p>
9.字符串插值
模板引擎可以用作字符串插值器。把“@”换成“$”即可
import play.twirl.api.StringInterpolation val name = "Martin"
val p = html"<p>Hello $name</p>"
10.可直接解析被包裹在Option或集合(Seq,Array,TraversableOnce)里的值

二、依赖注入
通过使用构造器,模板可以被生成为一个class而不是一个静态对象。这就意味着模板可以被直接注入到Controller中,并且可以自己管理依赖。而不是controller既管理自己的依赖又管理模板的依赖
假设模板依赖于组件Summarizer,而这个组件不会被Controller使用
trait Summarizer {
/** Provide short form of string if over a certain length */
def summarize(item: String)
}
创建一个模板文件 app/views/IndexTemplate.scala.html
@this(summarizer: Summarizer)
@(item: String) @{summarizer.summarize(item)}
And finally define the controller in Play by injecting the template in the constructor: public MyController @Inject()(template: views.html.IndexTemplate,
cc: ControllerComponents)
extends AbstractController(cc) { def index = Action { implicit request =>
val item = "some extremely long text"
Ok(template(item))
}
}
通过这种方式,Controller不用得知Summarizer的存在,模版可以自己管理依赖信息。
如果在Play以外的框架中使用Twirl,需要用以下方式添加注解
TwirlKeys.constructorAnnotations += "@javax.inject.Inject()"
PLAY2.6-SCALA(十) 模板引擎Twirl的更多相关文章
- Express全系列教程之(十):jade模板引擎
一.前言 随着前端业务的不断发展,页面交互逻辑的不断提高,让数据和界面实现分离渐渐被提了出来.JavaScript的MVC思想也流行了起来,在这种背景下,基于node.js的模板引擎也随之出现. 什么 ...
- vue系列---Mustache.js模板引擎介绍及源码解析(十)
mustache.js(3.0.0版本) 是一个javascript前端模板引擎.官方文档(https://github.com/janl/mustache.js) 根据官方介绍:Mustache可以 ...
- 最简单的JavaScript模板引擎
在小公司待久了感觉自己的知识面很小,最近逛博客园和一些技术网站看大家在说JavaScript模版引擎的事儿,完全没有概念,网上一搜这是08年开始流行起来的...本来以为这是很高深的知识,后来在网上看到 ...
- Velocity模板引擎语法
Velocity 模板引擎介绍 Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java ...
- js 模板引擎 jade使用语法
Jade是一款高性能简洁易懂的模板引擎,Jade是Haml的Javascript实现,在服务端(NodeJS)及客户端均有支持. 功能 · 客户端支持 · 超强的可读性 · 灵活易用的缩进 · 块扩展 ...
- Java 前端模板引擎学习:thymeleaf 模板引擎
模板引擎接口 ITemplateEngine 一.后台数据与外部数据 1.处理后台数据 $表达式是个变量表达式,用于处理在 request parameters and the request, s ...
- Jade —— 源于 Node.js 的 HTML 模板引擎
2013-12-11 发布 Jade —— 源于 Node.js 的 HTML 模板引擎 开源项目介绍 web 模板引擎 node.js jade 207.8k 次阅读 · 读完需要 69 分钟 ...
- SpringBoot日记——Thymeleaf模板引擎篇
开发通常我们都会使用模板引擎,比如:JSP.Velocity.Freemarker.Thymeleaf等等很多,那么模板引擎是干嘛用的? 模板引擎,顾名思义,是一款模板,模板中可以动态的写入一些参数, ...
- SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆
在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...
随机推荐
- [群晖] DSM6.2用winscp通过root权限登录
http://www.nas1.cn/thread-86048-1-1.html 以前DSM6.0的时候可以通过改root密码的方式,来通过winscp来登录nas,这样可以获得最高权限可以任意修改文 ...
- 粗浅看 Tomcat系统架构分析
原文出处: 吴士龙 http://www.importnew.com/21112.html Tomcat的结构很复杂,但是Tomcat也非常的模块化,找到了Tomcat最核心的模块,就抓住了Tomca ...
- 扫描线矩形周长的并 POJ1177
//扫描线矩形周长的并 POJ1177 // 我是按x轴 #include <iostream> #include <cstdio> #include <cstdlib& ...
- LA3882 And Then There Was One
And Then There Was One https://vjudge.net/problem/UVALive-3882 题目大意:n个数编号1..n排成一圈,第一次删除m,后来每k个删除一个(下 ...
- 八大 IoT 安全关键技术解析
IoT 设备的增长也伴随着网络攻击的风险的增长,因此在设计产品时就必须考虑到系统的安全. 高德纳咨询公司最近的报告预测,到 2020 年,全世界将有 200.4 亿的物联网设备相互连接,且平均每天约还 ...
- 备忘 ubuntu ip 及 dns 的坑
以前都用 ubuntu 16.04 现在用 18.04 遇到几个恶心的事,现在解决了,记录下来. 1. 设置 DNS , DNS 设置老是不对,最后发现问题老版本 ubuntu 17.10以下 ...
- tesseract ocr训练 pt验证码
识别率有问题A大概率识别为n,因此需要训练,这里讲一下 如何训练 参考 java代码里边直接使用tess4j,是对tesseract的封装,但是如果要训练,还是需要在进行安装tesseract-ocr ...
- jframe 设置左上角和任务栏的图标
默认就是 改成有意义的,一眼就能看出来功能的,比如一个小蜘蛛 第一个最简单的做法,把图片扔到工程的根目录,但是这样会相当乱,不便于文件管理 ImageIcon icon = new ImageIcon ...
- html转换成pdf
指定html转换成pdf 安装插件: npm install --save html2canvas npm install jspdf --save 引入 plugins/ htmlToPdf.js ...
- jedis与spring整合及简单的使用RedisTemplate操作
整理一下redis与spring的整合.以及使用redisTemplate.首先是要导入spring所需要的jar.当然还有 jedis-2.1.0.jar,commons-pool-1.5.4.ja ...