Custom format addition

    模板引擎通过将模板中的静态和动态内容组合到一起来构建最终结果。考虑如下模板:

    它由两个静态部分( 和 baz)和一个动态部分(bar)组成。模板引擎将这些拼接起来构建最终结果。事实上,为了避免跨站点脚本攻击,bar 的值在拼接到其它结果之前可以先进行转义。转义过程与具体的格式相关。例如,对于 HTML 格式,”<” 转义的结果是 “<”。

    模板引擎是如何知道一个模板的格式的呢?它会检查这个文件的扩展名,例如该文件的扩展名是 .scala.html,模板引擎就会把该文件与 HTML 格式关联起来。

    综上所述,如果想让 Play 支持你自己定义的模板格式,需要做以下几件事:

    • 为该格式实现文本整合过程
    • 最后,你需要告诉 Play 如何把模板渲染的结果作为 HTTP 响应体发送出去

    实现 play.twirl.api.Format[A] trait,该 trait 包含两个方法:raw(text: String): Aescape(text: String): A,分别用于整合模板的静态和动态部分。

    类型参数 A 定义了模板渲染后的结果类型,例如,对于 HTML 模板,该类型是 HTML。该类型必须是 trait 的子类,该 trait 定义了如何把各部分拼接在一起。

    简而言之,你需要写两个类:一个定义结果(实现 play.twirl.api.Appendable[A]),另一个定义文本整合过程(实现 play.twirl.api.Format[A])。例如,下面是对 HTML 格式的定义:

    在编译整个项目源码之前,模板文件会在构建过程中被编译成 .scala 文件。TwirlKeys.templateFormats 是一个类型为 Map[String, String] 的 sbt 配置项,定义了文件扩展名与模板格式之间的映射。例如,如果 Play 不支持 HTML 格式,你就需要在构建文件中写入下面的配置来关联 文件和 play.twirl.api.HtmlFormat 格式:

    注意,箭头右边包含了一个类型为 play.twirl.api.Format[_] 的值的全限定名。