Unmi 注:因为是 Web 框架,所以展示层必不可少,也就是接下来两章,我们进入到 Play2.0 中的模板引擎的世界,不同与Play 1.x 让你眼花缭乱的 ${}, #{}, @{}, @@{}, &{}, %{}% 和 *{}* 如此众多的标签样式,而在 Play 2.0 中只有一个魔幻的 @ 符号。这就叫化繁为简,Play 1.x 的模板是基于 Groovy 的,而 Play 2.0 是基于 Scala 的,它在效率上也改善不少。
基于 Scala 的类型安全的模板引擎
Play 2.0 带来了崭新而真正强大的基于 Scala 的模板引擎. 这一新引擎的设计灵感来自于 ASP.NET 的 Razor. 具体表现在:
- 简洁, 富有表现力, 且流畅: 它最小化了一个文件所需的字符和按键的数量, 并且开启了一个快速而流畅的代码流. 不像多数的模板语法, 你不必中断你的代码去显式的告诉你的 HTML 说这儿有一个服务端代码块. 解析器足够的聪明,能依据你的代码进行推断(Unmi 注: 推断出哪块代码应该由服务端来执行). 这使得简洁而富有表现力的语法显得更干净, 并且输入变得快速而有乐趣.
- 易学: 源于其最小化的概念,而让你快速而富有成效的掌握它. 只需用到你现有的 Scala 语言和 HTML 知识.
- 并非新的语言: 我们尽量选择不去创建一门新语言. 相应的,我们希望能让开发者使用它们现有的 Scala 语言技能。也就是要在选择你自己语言的情况下,提供一套模板标记语法,从而让你书写出令人敬畏的 HTML 结构流.
- 可用任何文本编辑器: 无须特别的工具,在任何纯文本编辑器中都能保持高效.
模板是需要经过编译的, 因此将你会在浏览器中看到任何的错误:
概述
Play 的 Scala 模板是一个简单的文本文件, 它包含都着小块的 Scala 代码. 它们能产生出任何的文本格式的内容, 如 HTML, XML 或 CSV.
模板系统设计的让你选择它处理起 HTML 来感觉很舒适, 也让 Web 设计人员很容易用它.
模板会被遵循一个简单的命名约定而编译为标准的 Scala 函数: 假如你创建一个 views/Application/index.scala.html
模板文件, 它将生成一个 views.html.Application.index
函数.
例如, 这儿是一个简单的模板:
1
2
3
4
5
6
7
8
9
|
@ (customer : Customer, orders : Seq[Order])
<h 1 >Welcome @ customer.name!</h 1 >
<ul> @ orders.map { order = >
<li> @ order.title</li>
} </ul> |
然后你可以在任何 Scala 代码中像调用一个函数那样调用它:
1
|
val html = views.html.Application.index(customer, orders)
|
语法: 神奇的 ‘@’ 字符
Scala 模板仅使用 @
作为单一的特殊字符. 每次遇到这个字符时, 它就标示着一个 Scala 表达式的开始. 它无须你显式的关闭代码块 - 这会从你的代码进行推断:
1
2
3
|
Hello @ customer.name!
^^^^^^^^^^^^^
Scala code
|
Unmi 注: 看到上面的 ^^^^^^^^^^^^^,可别认为是有些语言编译器在告诉你这行的语法错误,这里只是用来圈划出是一行 Scala 代码。
因为模板引擎能通过分析你的代码来侦测出你的代码块会在哪里结束, 所以这样只能写简单的表达式. 如果你想插入一个有多个 token (multi-token Unmi 注: token 是编译原理里的概念,没有一个合适的翻译,只要理解到下面表达式如果不加括号,只会解析出 @customer.firstName 的值,其他原样输出) 的表达式, 那么需要显式的加括号来标记:
1
2
3
|
Hello @ (customer.firstName + customer.lastName)!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Scala Code
|
你也可以使用花括号, 就像在 Scala 代码中那样来写多个表达式的语句块:
1
2
3
|
Hello @ { val name = customer.firstName + customer.lastName; name}!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Scala Code
|
由于 @
是一个特殊字符, 你有时候需要转译它. 这就要用到 @@
:
1
|
My email is bob @@ example.com
|
模板参数
模板就是个函数, 所以它会有参数, 模板参数必须声明在模板文件的第一行:
1
|
@ (customer : models.Customer, orders : Seq[models.Order])
|
Unmi 注: 在 Play 1.x 中自定义的标签中,所使用的以下划线开头的变量(如 _name) 即是要传入的参数。
你还能为参数指定默认值:
1
|
@ (title : String = "Home" )
|
或甚至可以多个参数组:
1
|
@ (title : String)(body : Html)
|
Unmi 注: 看到上面的写法就是柯里化的参数。
而且还能用隐式参数:
1
|
@ (title : String)(body : Html)( implicit request : RequestHeader)
|
迭代
你可以使用 Scala 的 for 语句, 依循标准的方式. 但需加说明的是模板编译器会在你的语句块结束前添加一个 yield
关键字:
1
2
3
4
5
|
<ul> @ for (p <- products) {
<li> @ p.name ($ @ p.price)</li>
} </ul> |
你大约知道, 下面这种 for 语句的用法只是遍历传统 Map 的语法糖:
1
2
3
4
5
|
<ul> @ products.map { p = >
<li> @ p.name ($ @ p.price)</li>
} </ul> |
If 块
If 块没什么特别的. 使用 Scala 的 if 语句标语的方式就行:
1
2
3
4
5
|
@ if (items.isEmpty) {
<h 1 >Nothing to display</h 1 >
} else {
<h 1 > @ items.size items!</h 1 >
} |
模式匹配
你还能在模板中使用模式匹配:
01
02
03
04
05
06
07
08
09
10
11
|
@ connected match {
case models.Admin(name) = > {
<span class = "admin" >Connected as admin ( @ name)</span>
}
case models.User(name) = > {
<span>Connected as @ name</span>
}
} |
Unmi 注: 模式匹配在语法上当然也是和 Scala 代码一致的,模式匹配在 Scala 是一个比较不容易理解的内容,可能是因为在 Java 中找不到相对应的功能吧。
声明可重要块
你可以创建可重用的代码块: Unmi 注: 其实就是在模板中定义的函数。
1
2
3
4
5
6
7
8
9
|
@ display(product : models.Product) = {
@ product.name ($ @ product.price)
} <ul> @ products.map { p = >
@ display(product = p)
} </ul> |
注: 你还可以声明可重用的纯 Scala 块: Unmi 注: 区别是在方法体前面是否用 “@” 符号,纯 Scala 块中可写纯粹的 Scala 代码,无须再用 "@" 符号了。
1
2
3
4
5
|
@ title(text : String) = @ {
text.split( ' ' ).map( _ .capitalize).mkString( " " )
} <h 1 > @ title( "hello world" )</h 1 >
|
注: 声明 Scala 块这种方式在模板中有时候很有用, 但是请记住,模板不是一个写复杂逻辑代码的好地方. 通常更好的方式是把这些代码写在一个 Scala 源文件中去(如果你愿意的话,可把这类 Scala 源文件存在
views/
包下).
依据约定, 一个可重用的块名定义是以 implicit 开始的,它就会被标记为隐式的 (implicit
):
1
|
@ implicitFieldConstructor = @ { MyFieldConstructor() }
|
Unmi 注: 这样上面的 @implicitFieldConstructor 就可以应用到隐式参数上去。
声明可重用的值
你可用 defining
帮助方法来定义作用域内的值:
1
2
3
|
@ defining(user.firstName + " " + user.lastName) { fullName = >
<div>Hello @ fullName</div>
} |
Unmi 注: 上面 fullName 就是用 @defining() 定义的 user.firstName +" " + user.lastName 的值,以后用 fullName 变量就行。
Import 语句
你可以在模板(或子模板)开始处引入你想要内容:
1
2
3
4
5
|
@ (customer : models.Customer, orders : Seq[models.Order])
@ import utils. _
... |
注释
你可以用 @* *@
来写服务端的注释块:
1
2
3
|
@ *********************
* This is a comment *
********************* @
|
你在第一行加上的注释会把当前模板记录到 Scala API 文档中去:
1
2
3
4
5
6
7
8
|
@ *************************************
* Home page. *
* *
* @ param msg The message to display *
************************************* @
@ (msg : String)
<h 1 > @ msg</h 1 >
|
转义(Escaping)
默认时, 动态内容会按照模板类型(如 HTML 或 XML) 规则进行转义. 假如你想输出为原始内容, 就用模板的内容类型包裹一下.
例如要输出原始的 HTML:
1
2
3
|
<p> @ Html(article.content)
</p> |
Unmi 注: 比如说,如果 article.content 的内容为 "<div style="color:red">Hello</div>",直接写成 @article.content 将直接输出为:
<div style="color:red">Hello</div>, 也就是它内部把 < 转义成了 < > 变成了 >,即 HTML 源文件是 "< style="color:red">Hello</div>
而写成 @Html(article.content),输出的 HTML 源文件中还是 <div style="color:red">Hello</div>,页面中看到的效果将是:
Hello
相关推荐
- **模板引擎**:介绍了 Play 2.0 内置的模板引擎,用于动态生成 HTML 页面。 - **HTTP 表单提交与验证**:讲解了如何处理用户提交的数据,包括数据验证的最佳实践。 - **JSON 处理**:详细说明了 Play 2.0 如何处理...
- **模板语法** - 定义了如何在HTML中嵌入动态数据。 - **常见用例** - 包括循环、条件判断等逻辑结构。 ##### 4. HTTP表单提交与验证 - **表单定义** - 描述表单的结构以及验证规则。 - **使用表单模板助手** ...
用户安装了KMRE后,可以从Google Play或其他安卓应用商店下载apk文件,并在银河麒麟系统内直接安装和运行,享受与原生安卓设备相似的体验。 其次,KMRE的安装和使用过程相当便捷。在提供的压缩包“kmre_2.0-6_arm64...
《Play Framework 2.0 - 创建你的第一个应用程序》 Play Framework 2.0 是一个开源的Web应用框架,它基于Scala和Java语言,遵循“模式-动作”(Action)架构,提供了一种轻量级、敏捷开发的方式。本篇文章将引导你...
之前写了一篇《 vue2.0+vue-video-player实现hls播放》,里边有提到在用vue-video-player之前,我尝试着使用vue-dplayer实现hls播放,但是当时时间紧迫,还没有完成,就换方案了。现在抽时间把它补齐吧。 开始 安装...
NULL 博文链接:https://tomorrow009.iteye.com/blog/1546253
Playframework 2.3.1 (Java) 和 MongoDb (Jackson) 的第一步 不要忘记启动mongodb守护进程! 它应该使用默认主机 (localhost) 和默认端口。 运行应用程序: sbt run 如果运行本教程有任何问题,请报告,谢谢!
总之,ONVIF2.0中文协议是网络视频监控领域的重要参考资料,对于那些想要构建或接入ONVIF兼容系统的开发者来说,它是不可或缺的学习资料。通过深入学习和实践,开发者可以构建出高效、稳定且具有高度互操作性的视频...
更新播放 2.4.0添加测试规范Playframework 2.2.1 (Scala) 和 MongoDb (Salat) 的第一步使用 MongoDb 而不是 Anorm 的待办事项应用程序我们将为 MongoDb 使用 Salat 库( )。 Play 2 有一个替代的“mongo-jackson-...
google play service最新版本,基于firebase的sdk,9.2.0.包含了 全部需要的jar,另外还有aar版本 play-services-ads-9.2.0.jar play-services-analytics-9.2.0.jar play-services-analytics-impl-9.2.0.jar play-...
解决: Could not find play-services-basement.aar (com.google.android.gms:play-services-basement:15.0.1). Searched in the following locations: ...
【初中英语语法大全复习】 在初中英语学习中,语法是一个重要的组成部分,对于理解和表达英语至关重要。本课件主要聚焦于冠词的使用,分为定冠词(the)和不定冠词(a, an)两大类别。 1. **定冠词(the)的用法**...
google-play-services版本15.0.1,依赖工程可直接引用到项目中,适用Eclipse及AndroidStudio开发环境,快捷方便,本人亲自整理,后续资源有问题可咨询。若后续google-play-services如需其他版本迭代,也可让我更进。
play20-spring-demo, 在播放 2.0应用程序中使用 spring 在播放 2.0应用程序中使用 spring的这是一个简单的应用程序演示如何将播放 2.0应用程序组件与 Spring Framework 应用程序集成。请注意,同样的技术可以应用到...
airplay协议,编译工具 VS2017 苹果手机投屏源码。 开源项目来源:https://github.com/fingergit/airplay2-win。我只是进行了一些简单的修改: 1)删除了一个工程,2)删除了一些文件,3)修改一些目录结构 4)初始...
Japid-Play 是一个拥有与Java硬编码相同性能和...模板语法与Play! Web开发框架模板语言相似。 Japid是一个通用的模板引擎,适用于任何Java应用程序来渲染任意Java对象。此外它还提供一个专门用于Play! 框架的适配器。
模板语法 - 43 - Expressions: ${…} - 44 - Template decorators : #{extends /} and #{doLayout /} - 44 - Tags: #{tagName /} - 45 - Actions: @{…} or @@{…} - 46 - Messages: &{…} - 46 - Comment: *{…}* -...
play-services-base.properties
play-services-ads-lite-18.3.0是2019-11-23为止,最新的安卓admob sdk,用于原生安卓介入 加入工程后: import com.google.android.gms.ads.AdListener; import com.google.android.gms.ads.AdRequest; import ...