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))
转载于:https://www.cnblogs.com/feiyumo/p/9150497.html
PLAY2.6-SCALA(十一) 模板常用场景相关推荐
- Helm模板常用语法介绍与简单应用场景
Helm模板常用语法介绍与简单应用场景 文章目录 Helm模板常用语法介绍与简单应用场景 什么是Helm _help.tpl子模版 应用场景 预定义对象 关于变量 关键字及应用 函数 流程与控制 什么 ...
- C1认证学习十一(常用网络命令以及端口)
C1认证学习十一(常用网络命令以及端口) 任务背景 工程师们天天在使用计算机做软件开发,有时候出了问题需要来确定到底是自己的问题,还是网络的问题,所以需要学习并且了解一些常见的计算机的命令以及开发中常 ...
- 深度优先算法与广度优先算法的理解与常用场景
深度优先算法: 我的理解 就像走迷宫,每次遇到岔道口就要选一条路来走,每次遇到死胡同就要原路返回找到上一个路口选择其他的路,直到找到出口,显然最坏的情况是遍历完所有的道路后才找到出路,适用于在一个大整 ...
- jQuery学习(十一)— 常用的删除方法
jQuery学习(十一)- 常用的删除方法 一.empty方法 作用:删除jQuery对象所有的子节点 格式:jQuery对象.empty() 二.remove方法 作用:删除元素 格式:元素.rem ...
- WP模板常用调用函数
很多人都想拥有一个独一无二的wordpress博客,但对模板制作却一窍不通,这篇文章将会给你带来必要的帮助. WordPress基本模板文件 一套完整的WordPress模板应至少具有如下文件: st ...
- JavaSE_第十一章:常用类
JavaSE学习历程 第一章:Java初识 第二章:Java语言基础 第三章:选择结构与分支结构 第四章:循环结构 第五章:方法/函数 第六章:数组 第七章:面向对象 第八章:三大特性 第九章:三个修 ...
- Windows下bat批处理脚本常用场景整理,持续更新中。。。
Windows下bat批处理脚本常用场景整理,持续更新中... 一.Winodws下使用bat脚本对结果进行筛选 例如:在筛选出来的结果中,筛选是否有"$G"字段 adb shel ...
- php wordpress 代码模板,WordPress 主题模板常用基本代码与函数
平时在WordPress 主题模板文件里常遇到的基本代码与函数,简单的跟大家分享. 一:WordPress主题中基本模板文件 一套完整的WordPress主题应至少具有如下模板文件: style.cs ...
- dedecms标签三 : 文章模板常用标签
文章模板常用标签 1:title标签,单行标签 指:文章模板使用时,调取文章的标题 {dede:field.title/} 结果为:如:我是测试文章 2:keywords标签,单行标签 指:调取文章的 ...
最新文章
- SAP PM纠正维护
- linux命令0424
- 交互式计算机图形学总结:第四章 观察
- Cpp / 右值、纯右值、将亡值
- 判断一个字符串是否为数字
- Sharepoint 2010 隐藏基本搜索中心搜索结果左侧的分类条件
- Java 锁之 CAS
- Google Earth 和MS Virtual Earth:虚拟地球简介
- 学成在线--26.课程图片管理(图片删除)
- 初识设计模式(装饰者模式)
- 23个Python爬虫开源项目代码Python爬虫开源项目代码
- RedHat 5.4+ Postfix +Extmail实现基于虚拟用户的邮件系统(三)
- Hadoop之分布式存储HDFS和离线计算MapReduce
- ie8下a标签中的图片出现边框
- taobao API open淘宝 错误码一览表
- solidworks迈迪插件_迈迪工具集V55特别PJ版_打包下载
- ps将psd等比缩放、等份切片、psd转为jpg、Cutterman、切片方法、旋转方法(编辑)
- 巧用CSS,愚人节极客式恶搞
- oracle18c安装教程6,Oracle 18c rpm 安装及解析安装过程
- javase(8)_集合框架_List、Set、Map
热门文章
- java ejb3.0_初识EJB3.0 ---配置与运行篇
- 黑马java教程是什么_Java教程:揭秘什么是面向接口编程
- python导包顺序_2019-03-21 python导入包以及Python程序执行顺序理解
- 字段对应数组_字段不同的多个工作薄汇总? 还要固定字段位置 !难不倒我!...
- linux定时执行python脚本_linux定时执行python脚本的方法以及失败不执行的处理方法...
- 网络推广方法中浅谈网站中的内容如何优化好?
- 网络推广外包专员浅析网络推广外包优化当中的那些细枝末节!
- 网络营销——网络营销专员浅析不同企业之间的营销推广各有差异
- 企业日常选择网站制作公司大多从这三方面着手
- 网站收录上不去估计是这几个方面出了问题