PLAY2.6-SCALA(十一) 模板常用场景
1.布局
声明一个views/main.scala.html
模板作为主布局模板
@(title: String)(content: Html)
<!DOCTYPE html>
<html>
<head>
<title>@title</title>
</head>
<body>
<section class="content">@content</section>
</body>
</html>
有两个参数,一个标题,一个html格式的内容,在 views/Application/index.scala.html模板中调用它
@main(title = "Home") { <h1>Home page</h1> }
有时你需要第二个特殊页面的侧边栏或者浏览路径,可以通过添加一个参数做到
@(title: String)(sidebar: Html)(content: Html)
<!DOCTYPE html>
<html>
<head>
<title>@title</title>
</head>
<body>
<section class="sidebar">@sidebar</section>
<section class="content">@content</section>
</body>
</html>
可以从‘index’模板使用它
@main("Home") {
<h1>Sidebar</h1> } {
<h1>Home page</h1> }
也可以单独声明一个工具栏
@sidebar = {
<h1>Sidebar</h1>
} @main("Home")(sidebar) {
<h1>Home page</h1> }
2.标签
views/tags/notice.scala.html
显示HTML通知的简单标签
@(level: String = "error")(body: (String) => Html) @level match { case "success" => {
<p class="success">
@body("green")
</p>
} case "warning" => {
<p class="warning">
@body("orange")
</p>
} case "error" => {
<p class="error">
@body("red")
</p>
} }
在另一个模板中调用它
@import tags._ @notice("error") { color =>
Oops, something is <span style="color:@color">wrong</span>
}
3.moreScripts and moreStyles equivalents
在main模板中定义一个变量
@(title: String, scripts: Html = Html(""))(content: Html) <!DOCTYPE html> <html>
<head>
<title>@title</title>
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
<link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
<script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
@scripts
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="brand" href="#">Movies</a>
</div>
</div>
</div>
<div class="container">
@content
</div>
</body>
</html>
在一个需要使用额外脚本的模板中
@scripts = {
<script type="text/javascript">alert("hello !");</script>
} @main("Title",scripts){ Html content here ... }
不需要的
@main("Title"){ Html content here ... }
4.添加自定义的模板格式
play.twirl.api.Format[A]
接口有两个方法,raw(text: String): A
和 escape(text: String): A分别用来处理静态内容和动态内容
参数类型A代表了模板引擎的返回结果,e.g. Html代表了HTML模板。这个类型必须是play.twirl.api.Appendable<A>
特质的子类,该特质定义了如何将各部分连接起来
为了方便起见,Play提供了抽象类play.twirl.api.BufferedContent<A>
,该类实现了play.twirl.api.Appendable<A>
,使用StringBuilder来构建结果,并且实现了play.twirl.api.Content
接口,所以Play知道如何将结果转换为HTTP相应体。
简单地说,你需要两个类:一个用来定义结果(实现play.twirl.api.Appendable),另一个用来处理文本(实现lay.twirl.api.Format),下面给出一个HTML格式的例子
// The `Html` result type. We extend `BufferedContent[Html]` rather than just `Appendable[Html]` so
// Play knows how to make an HTTP result from a `Html` value
class Html(buffer: StringBuilder) extends BufferedContent[Html](buffer) {
val contentType = MimeTypes.HTML
} object HtmlFormat extends Format[Html] {
def raw(text: String): Html = …
def escape(text: String): Html = …
}
关联文件扩展名与格式
在编译整个应用之前,模板会被编译进.scala的文件中。TwirlKeys.templateFormats是sbt中的一个配置,用来定义文件扩展名与格式之间的关系,实际上是一个Map[String,String]。如果你想让Play使用你自己的HTML格式,可以添加以下配置:
TwirlKeys.templateFormats += ("html" -> "my.HtmlFormat.instance")
注意箭头右边需要使用play.twirl.api.Format<?>
类型的全名
5.告诉Play如何根据模板结果类型生成http结果
Play可以为任何A
存在隐式play.api.http.Writeable[A]
值的类型值编写HTTP响应主体。所以你所需要的就是为你的模板结果类型定义一个这样的值。例如,下面是如何为HTTP定义这样一个值:
implicit def writableHttp(implicit codec: Codec): Writeable[Http] =
Writeable[Http](result => codec.encode(result.body), Some(ContentTypes.HTTP))
如果你的模型类型继承自play.twirl.api.BufferedContent,你可以只定义一个
play.api.http.ContentTypeOf值
implicit def contentTypeHttp(implicit codec: Codec): ContentTypeOf[Http] =
ContentTypeOf[Http](Some(ContentTypes.HTTP))
PLAY2.6-SCALA(十一) 模板常用场景的更多相关文章
- WordPress模板常用函数
基本条件判断Tag is_home() : 是否为主页 is_single() : 是否为内容页(Post) is_page() : 是否为内容页(Page) is_category() : 是否为C ...
- play for scala 在模板中格式化Date
在play模板中格式化Date非常简单,只要编写一个静态函数,然后在模板中直接使用就可以了.如编写Html.scala package utils import java.text.SimpleDat ...
- WordPress 模板常用函数
WordPress 基本模板文件 一套完整的 WordPress 模板应至少具有如下文件: style.css : CSS(样式表)文件 index.php : 主页模板 archive.php : ...
- Git——常用场景解析
总结:本篇文章从初识GitHub.Git,实践GitHub的五种常用场景,分别是:git for windows安装,git配置,克隆远程代码到本地,上传本地代码到远程以及Git的常用指令.相信Jam ...
- git常用命令常用场景
在使用git之前,一直用的是svn版本管理:与svn最大不同的是,git有两个仓库,一个是本地仓库,一个是服务器上共享的仓库:本地仓库是每个开发者自己独有的,即使commit提交也只是提交到本地仓库: ...
- Intent 常用场景 FileProvider 拍照 裁剪 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Django笔记&教程 3-3 模板常用语法
Django 自学笔记兼学习教程第3章第3节--模板常用语法 点击查看教程总目录 本文主要参考:https://docs.djangoproject.com/en/2.2/ref/templates/ ...
- 模板:DOM常用场景【表单提交】——javascript结合HTML DOM(或者JQuery)运用
一.删除行为前的提示 首先要有一个onclick的DOM(点击)事件,和一个JavaScript弹出框:confirm()确认框 <script> function del(){ var ...
- SpringBoot常用场景
SpringBoot-常见场景 1.热部署 SpringBoot为我们提供了一个方便我们开发测试的工具dev-tools.使用后可以实现热部署的效果.当我们运行了程序后对程序进行了修改,程序会自动 ...
随机推荐
- Leetcode962. Maximum Width最大宽度坡 Ramp
给定一个整数数组 A,坡是元组 (i, j),其中 i < j 且 A[i] <= A[j].这样的坡的宽度为 j - i. 找出 A 中的坡的最大宽度,如果不存在,返回 0 . 示例 ...
- MySQL的高可用实现方案之mysql-mmm
一.环境简述 1.工作逻辑图 2.MySQL-MMM优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性. 缺点:Monitor节点是 ...
- LUOGU P3047 [USACO12FEB]附近的牛Nearby Cows
传送门 解题思路 树形dp,看到数据范围应该能想到是O(nk)级别的算法,进而就可以设出dp状态,dp[x][j]表示以x为根的子树,距离它为i的点的总和,第一遍dp首先自底向上,dp出每个节点的子树 ...
- LUOGU P2280 [HNOI2003]激光炸弹
传送门 解题思路 二维前缀和. 代码 #include<iostream> #include<cstdio> #include<cstring> using nam ...
- inode学习笔记
在学习文件描述符时会看到有个inode概念,今天学习了一下. 在操作系统里,一个文件对应一个inode,inode存储了该文件相关信息,作用有一点点像内存的指针,通过他可以找到对应位置上的数据,但是i ...
- Error-SQLServer:【失败】win7装SQL server2017
ylbtech-Error-SQLServer:[失败]win7装SQL server2017 1.返回顶部 1. 2018年08月15日 22:06:38 USCWIFI 阅读数:5433 版 ...
- name和value的简单js用法
name和value: 例如: <input type="text" name="txt"/> name用于定义这个input收到的值的变量名,在上 ...
- hibernate一对多关系 在一方查询会获得重复数据,重复数量就是多端数据数量用@Fetch(FetchMode.SUBSELECT)解决
先来看数据表 版块表只有两个数据 板块1是推荐,下边没有子栏目 板块2下边有14个子栏目 在1的一端来查询,发现结果有16条 也就是板块1+版块2+版块2和他的14个子集都列出来了,这明显不对 板块对 ...
- Spring Boot入门样例-001-Java和Maven安装配置
Spring Boot入门样例-001-Java和Maven安装配置 本文说明Java和Maven在windows下的安装和配置 前言 本Spring Boot入门样例准备工作参考: Spring B ...
- jQuery Validate扩展验证方法 (zhangxiaobin)
/***************************************************************** jQuery Validate扩展验证方法 (zhangxiaob ...