为模板引擎添加自定义的格式
原文地址
https://playframework.com/documentation/2.6.x/JavaCustomTemplateFormat
Twirl内建的模板引擎支持大多数常用的格式(HTML,XML等),如果有需要的话也可以添加自己的格式。
模板引擎处理过程
模板引擎通过添加模板中的静态、动态内容来构建最终结果,考虑以下的例子:
foo @bar baz
包含了两个静态部分(foo,baz)好一个动态内容(bar)。模板引擎将这三个结果连接起来产生最终的结果。实际上,为了抵御跨站攻击,bar
的值在与其他结果连接起来之前会被转义。每种格式的转义过程是不同的,利于在HTML中你想要将”<”转义为”<
”
模板引擎通过模板的扩展名来进行处理,利于.scala.html
会按照HTML的格式来处理。
为了支持你的模板格式,需要做到以下两步:
- 实现文本到格式的处理过程
- 将扩展名与格式联系起来
实现自己的格式
play.twirl.api.Format<A>
接口有两个方法,A raw(String text)
和A escape(String text)
分别用来处理静态内容和动态内容。
参数类型A代表了模板引擎的返回结果,e.g. Html代表了HTML模板。这个类型必须是play.twirl.api.Appendable<A>
特质(scala中的trait)的子类,该特质定义了如何将各部分连接起来。
为了方便起见,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格式的例子
public class Html extends BufferedContent<Html> {
public Html(StringBuilder buffer) {
super(buffer);
}
String contentType() {
return "text/html";
}
}
public class HtmlFormat implements Format<Html> {
Html raw(String text: String) { … }
Html escape(String text) { … }
public static final HtmlFormat instance = new HtmlFormat(); // The build process needs a static reference to the format (see the next section)
}
关联文件扩展名与格式
在编译整个应用之前,模板会被编译进.scala的文件中。TwirlKeys.templateFormats是sbt中的一个配置,用来定义文件扩展名与格式之间的关系,实际上是一个Map[String,String]。如果你想让Play使用你自己的HTML格式,可以添加以下配置:
TwirlKeys.templateFormats += ("html" -> "my.HtmlFormat.instance")
注意箭头右边需要使用play.twirl.api.Format<?>
类型的全名