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))

转载于:https://www.cnblogs.com/feiyumo/p/9150497.html

PLAY2.6-SCALA(十一) 模板常用场景相关推荐

  1. Helm模板常用语法介绍与简单应用场景

    Helm模板常用语法介绍与简单应用场景 文章目录 Helm模板常用语法介绍与简单应用场景 什么是Helm _help.tpl子模版 应用场景 预定义对象 关于变量 关键字及应用 函数 流程与控制 什么 ...

  2. C1认证学习十一(常用网络命令以及端口)

    C1认证学习十一(常用网络命令以及端口) 任务背景 工程师们天天在使用计算机做软件开发,有时候出了问题需要来确定到底是自己的问题,还是网络的问题,所以需要学习并且了解一些常见的计算机的命令以及开发中常 ...

  3. 深度优先算法与广度优先算法的理解与常用场景

    深度优先算法: 我的理解 就像走迷宫,每次遇到岔道口就要选一条路来走,每次遇到死胡同就要原路返回找到上一个路口选择其他的路,直到找到出口,显然最坏的情况是遍历完所有的道路后才找到出路,适用于在一个大整 ...

  4. jQuery学习(十一)— 常用的删除方法

    jQuery学习(十一)- 常用的删除方法 一.empty方法 作用:删除jQuery对象所有的子节点 格式:jQuery对象.empty() 二.remove方法 作用:删除元素 格式:元素.rem ...

  5. WP模板常用调用函数

    很多人都想拥有一个独一无二的wordpress博客,但对模板制作却一窍不通,这篇文章将会给你带来必要的帮助. WordPress基本模板文件 一套完整的WordPress模板应至少具有如下文件: st ...

  6. JavaSE_第十一章:常用类

    JavaSE学习历程 第一章:Java初识 第二章:Java语言基础 第三章:选择结构与分支结构 第四章:循环结构 第五章:方法/函数 第六章:数组 第七章:面向对象 第八章:三大特性 第九章:三个修 ...

  7. Windows下bat批处理脚本常用场景整理,持续更新中。。。

    Windows下bat批处理脚本常用场景整理,持续更新中... 一.Winodws下使用bat脚本对结果进行筛选 例如:在筛选出来的结果中,筛选是否有"$G"字段 adb shel ...

  8. php wordpress 代码模板,WordPress 主题模板常用基本代码与函数

    平时在WordPress 主题模板文件里常遇到的基本代码与函数,简单的跟大家分享. 一:WordPress主题中基本模板文件 一套完整的WordPress主题应至少具有如下模板文件: style.cs ...

  9. dedecms标签三 : 文章模板常用标签

    文章模板常用标签 1:title标签,单行标签 指:文章模板使用时,调取文章的标题 {dede:field.title/} 结果为:如:我是测试文章 2:keywords标签,单行标签 指:调取文章的 ...

最新文章

  1. SAP PM纠正维护
  2. linux命令0424
  3. 交互式计算机图形学总结:第四章 观察
  4. Cpp / 右值、纯右值、将亡值
  5. 判断一个字符串是否为数字
  6. Sharepoint 2010 隐藏基本搜索中心搜索结果左侧的分类条件
  7. Java 锁之 CAS
  8. Google Earth 和MS Virtual Earth:虚拟地球简介
  9. 学成在线--26.课程图片管理(图片删除)
  10. 初识设计模式(装饰者模式)
  11. 23个Python爬虫开源项目代码Python爬虫开源项目代码
  12. RedHat 5.4+ Postfix +Extmail实现基于虚拟用户的邮件系统(三)
  13. Hadoop之分布式存储HDFS和离线计算MapReduce
  14. ie8下a标签中的图片出现边框
  15. taobao API open淘宝 错误码一览表
  16. solidworks迈迪插件_迈迪工具集V55特别PJ版_打包下载
  17. ps将psd等比缩放、等份切片、psd转为jpg、Cutterman、切片方法、旋转方法(编辑)
  18. 巧用CSS,愚人节极客式恶搞
  19. oracle18c安装教程6,Oracle 18c rpm 安装及解析安装过程
  20. javase(8)_集合框架_List、Set、Map

热门文章

  1. java ejb3.0_初识EJB3.0 ---配置与运行篇
  2. 黑马java教程是什么_Java教程:揭秘什么是面向接口编程
  3. python导包顺序_2019-03-21 python导入包以及Python程序执行顺序理解
  4. 字段对应数组_字段不同的多个工作薄汇总? 还要固定字段位置 !难不倒我!...
  5. linux定时执行python脚本_linux定时执行python脚本的方法以及失败不执行的处理方法...
  6. 网络推广方法中浅谈网站中的内容如何优化好?
  7. 网络推广外包专员浅析网络推广外包优化当中的那些细枝末节!
  8. 网络营销——网络营销专员浅析不同企业之间的营销推广各有差异
  9. 企业日常选择网站制作公司大多从这三方面着手
  10. 网站收录上不去估计是这几个方面出了问题