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