2

我正在尝试创建一个 Play 自定义模板以使用 Twirl 返回 json,但我无法找到任何可靠的示例。如果不是旋转模板,还有其他方法可以使用 JSON 渲染视图并在视图上实现死锁吗?

4

1 回答 1

2

您可以在 Twirl 中毫无问题地执行此操作。你看过自定义格式指南吗?另外,请查看play.twirl.api.Formats以了解 XML 等是如何实现的。

例如,下面是 Play 的内置 XML Twirl 格式的实现。

class Xml private (elements: immutable.Seq[Xml], text: String) extends BufferedContent[Xml](elements, text) {
  def this(text: String) = this(Nil, Formats.safe(text))
  def this(elements: immutable.Seq[Xml]) = this(elements, "")

  /**
   * Content type of XML (`application/xml`).
   */
  def contentType = MimeTypes.XML
}

/**
 * Helper for XML utility methods.
 */
object Xml {

  /**
   * Creates an XML fragment with initial content specified.
   */
  def apply(text: String): Xml = {
    new Xml(text)
  }

}

/**
 * Formatter for XML content.
 */
object XmlFormat extends Format[Xml] {

  /**
   * Creates an XML fragment.
   */
  def raw(text: String) = Xml(text)

  /**
   * Creates an escaped XML fragment.
   */
  def escape(text: String) = Xml(StringEscapeUtils.escapeXml11(text))

  /**
   * Generate an empty XML fragment
   */
  val empty: Xml = new Xml("")

  /**
   * Create an XML Fragment that holds other fragments.
   */
  def fill(elements: immutable.Seq[Xml]): Xml = new Xml(elements)
}

因为您可以在 Twirl 中执行此操作,所以您可以按原样使用现有的 Deadbolt 模板。如果您选择使用非 Twirl 实现,您只需重新实现所需的 Deadbolt 模板,因为所有逻辑实际上都是在模板之外处理的。看一下be.objectify.deadbolt.java.ViewSupportbe.objectify.deadbolt.scala.ViewSupport - 例如,dynamic模板只接受一些参数并将它们直接传递给ViewSupport.

@if(viewSupport.dynamic(name, meta, handler, timeout(), request)) {
   @body
}
于 2017-06-16T07:49:30.957 回答