Play 2.6 为Twirl添加自定义的格式

为模板引擎添加自定义的格式

原文地址
https://playframework.com/documentation/2.6.x/JavaCustomTemplateFormat

Twirl内建的模板引擎支持大多数常用的格式(HTML,XML等),如果有需要的话也可以添加自己的格式。

模板引擎处理过程

模板引擎通过添加模板中的静态、动态内容来构建最终结果,考虑以下的例子:

foo @bar baz

包含了两个静态部分(foo,baz)好一个动态内容(bar)。模板引擎将这三个结果连接起来产生最终的结果。实际上,为了抵御跨站攻击,bar的值在与其他结果连接起来之前会被转义。每种格式的转义过程是不同的,利于在HTML中你想要将”<”转义为”&lt;

模板引擎通过模板的扩展名来进行处理,利于.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<?>类型的全名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值