Play的魔板引擎本人认为可以说是为full stack Developers量身打造的功能。在原有的html页面基础上,只需要在html文件名后缀名前面加上”.scala“,就可以在页面上写Scala代码,而且页面之间可以像函数一样被”调用“。例如:index.html本身这个文件中不能够写scala代码,但是如果index.html后缀名前加上”.scala“变为”index.scala.html“,就可以在其中写scala代码了,”index.html“变为”index.scala.html“后,就会被看成一个scala文件,编译的时候会当做一个object来编译;是不是有点JSP的感觉?但是比JSP更爽,JSP必须是一个完整的html文件,而play 的魔板引擎可以”拼凑“,就是可以一个功能模块写一个文件,或者共同的模块儿抽象出来,写成一个公共的模块文件,然后被其他文件调用。有了play魔板引擎,写页面变的如此简单!

下面我们对play的页面魔板引擎做一个简单的介绍:

其实play的页面魔板引擎并不是为play而生的,它本身就是一个简单框架,有自己的名字,叫:”Twirl“,Twirl并不是依赖着play而存在的,它是一个单独的项目,具体请关注https://github.com/playframework/twirl/blob/master/README.md。

一个play 的页面魔板 是一个包含少量scala代码块的简单的text文件。页面魔板可以在任何文本格式的文件中触发,例如:HTML、XML或者CSV等。

页面魔板将会被编译成标准的Scala函数,假如你创建了一个views/Application/index.html页面魔板文件,它会生成一个包含applay()方法的views.html.Application.index类。

好了,正式开始:

play的页面模板是从神奇”@“字符开始的。在页面模板中,加入”@“后,就可以写Scala代码了,可以是变量、函数、对象、代码块…任何Scala相关的东西。

例如:

1、 Hello  @customer.name     !   在这里,”customer“代表的就是一个对象,name是customer的属性

2、Hello @{customer.firstName +customer.lastName}!看见了没有加了”@“后可以直接写Scala的代码,这样为动态的赋值增加了便利

3、Hello @{val name=customer.firstName +customer.lastName;name}  注意:这样输出的是”name“的值,很像Scala函数返回值的写法有木有?

加一个”@“有神奇的效果,但是两个”@“:”@@“就是脱离这种效果了,大家要注意。

页面模板就像一个函数,函数当然可以有参数,如果你想加参数,就得在文件的上面 定义:@(customer:Customer,order:List[Order]),完全是Scala函数的定义方法 有木有?也可以这样:@(title:String=”Home“) 还可以柯里化的形式,像这样:@(title:String)(body:Html),总之就是Scala函数的定义方法基本都可以。

循环:play 页面模板推荐使用增强for循环

例: <ul>

@for(p <-products){

<li>@p.name ($@p.price)</li>

}

</ul>

这里有个需要注意的地方:”{“必须和”for“字段在同一行

if语句:

例:@if(items.isEmpty){

<h1>Nothing to display</h1>

}else{

<h1>@items.size.items!</h1>

}

声明可以再度使用的代码块:(函数)

例1:     @display(product:Product)={

@product.name($@product.price)

}

<ul>

@for(product <- products){

@display(product)

}

例2:

@title(text:String)=@{

text.split(' ').map(_.capitalize).mkString(" ")

}

<h1>@title("hello world")</h1>

这个·用法非常的常用,可以在这个语法块中处理相关的逻辑,然后得出一个返回值,然后再别处调用。

顺便说一下:如果你想定义一个隐士的变量,必须在@之后以”implicit“开头命名就可以,例如:

@implicitFieldConstructor=@{MyFieldConstructor()}

注意:implicit和名字必须是连起来的,@implicit FiledConstructor这样写是不行的。

声明可以使用的值

@defining(user.firstName+" "+user.lastName){ fullName =>

<div>Hello @fullName </div>

}

注意:fullName的作用范围仅仅是”{}“之内,出了”{}“就不好用了

引入声明:

你可以引入任何你先引入的东西,类、包等等

例子:

@(customer:Customer,orders:List[Order])

@import utils._

注释:

play 页面模板的注释:@* *@

例子:

@*********************
* This is a comment *
*********************@

你可以放一条注释在模板的首页,作为Scala API的文档:

@*************************************
* Home page. *
* *
* @param msg The message to display *
*************************************@
@(msg: String) <h1>@msg</h1>

输出真实的HTML:

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

PlayFramework 一步一步来 之 页面模板引擎的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

  3. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  4. 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文

    阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...

  5. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  6. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  7. 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户

    阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...

  8. 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

    一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...

  9. 一步一步使用ABP框架搭建正式项目系列教程

    研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...

  10. 一步一步使用ABP框架搭建正式项目系列教程之本地化详解

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...

随机推荐

  1. 网络协议,socket模块

    """网络通讯要素:1.物理介质2.通讯协议 osi五层模型 应用层 传输层 网络层 数据链路层 物理层 物理层能传输010101二进制单纯的二进制是没有意义的,必须得知 ...

  2. 自定义编写js格式化数字的函数

    在处理网页的时候,有时候会需要显示很长的数字,但是当数字的长度比较长的时候,就很难看一个数字到底是多大.这种情况下,一些网站在处理数字的时候,当数字的长度大于3个时,就用逗号把他们分开,这是一个比较常 ...

  3. jquery中添加元素append,prepend,before和after方法的区别

    append:在元素内部的最后面添加元素,作为子元素. prepend:在元素内部的最前面添加元素,作为子元素. before:在元素的前边,作为兄弟元素添加. after:在元素的后边,作为兄弟元素 ...

  4. windows下vmware配置nat网络

    linux学习需要配置网络,可以选择桥接网络,nat网络地址转换. 由于linux的服务,众多需要配置一个固定的ip,因此可以选择静态ip配置. 因此在这里自定义nat网络地址转换,可以固定一台lin ...

  5. python基础与docker

    创建虚拟环境python3 -m venv venv (说明:python 2.X 并不支持) 激活虚拟环境macOS/Linux: source venv/bin/activateWindows: ...

  6. mysql,查询时间戳

    1.查询当前时间1天前的时间点   select date_sub(now() ,interval 1 day)   2.查询当前时间的时间1天之后的时间点   select data_sub(now ...

  7. angularJS+KindEditor无法获取或清空textarea的值

    在html页面中初始化KindEditor: <script type="text/javascript"> var editor; KindEditor.ready( ...

  8. Tensorflow学习笔记2019.01.22

    tensorflow学习笔记2 edit by Strangewx 2019.01.04 4.1 机器学习基础 4.1.1 一般结构: 初始化模型参数:通常随机赋值,简单模型赋值0 训练数据:一般打乱 ...

  9. Debian 9 Stretch国内常用镜像源

     随着Debian 9的普及,但由于伟大的墙的存在,那就有必要整理一下国内的镜像站点. 1.使用说明 一般情况下,修改/etc/apt/sources.list文件,将Debian的默认源地址改成新的 ...

  10. Golang学习---常用库

    1. 路由库:github.com/julienschmidt/httprouter 2. mysql驱动:github.com/go-sql-driver/mysql