如果我们可以使用纯scala,为什么在play框架2(scala)中使用模板引擎

时间:2013-06-29 01:23:04

标签: scala playframework-2.0 template-engine

如果我们只使用template-engine,可以在playframework 2(scala)中使用scala scala

使用模板引擎是:

  • 额外的处理器时间将模板语法转换为scala代码
  • 然后编译这段代码(如果用手写的话就不那么简洁 - 然后编译得更慢)
  • 此外,如果模板尚未转换为scala,您可以从主代码中看到代码不一致(IDE中的红色突出显示) - 所以你应该每次都想一想..

为什么不使用核心xml / html支持scala提供的内容,如:http://www.scala-lang.org/node/131

是否有任何纯scala模板(您可以推荐)我可以在play-framework或单独使用?

2 个答案:

答案 0 :(得分:3)

实际上你应该向开发团队提出这个问题,但是要考虑几点:

  • 实际上您根本不需要使用Play的模板引擎,您可以使用Ok()方法轻松返回任何字符串,因此根据您的链接,您可以执行Ok(theDate("John Doe").toString())
  • Play使用的方法对于其他MVC Web框架非常典型,其中视图是基于HTML的文件,因为......它是Web专用框架。我没有看到任何错误,有时候我正在使用其他语言/框架,并且可以看到它们之间的视图差异只是语言特定的语法,这就是目标!
  • 不要忘记,Play是双语系统,有人可能会问'为什么不使用某些Java lib来处理视图?'
  • 内置的Scala XML文字不适合创建复杂的程序,很容易遇到问题(这也是为什么有一个名为anti-xml的库的原因); Martin Odersky自己后悔将此作为语言特色
  • 最后,有一些IDE支持Play 2视图,我正在使用支持Play2的Idea 12,虽然它不完美(它很新,所以有时会出现小问题)在大多数情况下它工作正常。它了解Play视图的语法,提供自动完成功能,甚至可以使用选项+单击视图中的某个对象直接跳转到方法/模型的声明等。

回答你的上一个问题,AFAIK正式有Groovy engine available作为模块,它提供Play 1.x中已知的模板引擎,但请记住,它只是人们从Play 1.x迁移的桥梁播放2.x,因为它比Play 2的原生引擎慢。

答案 1 :(得分:2)

对我来说这很合适 作为答案,至少是最后一个问题。

这只是scala。只是XML内置魔法。

http://www.alvarocarrasco.com/2011/03/play-framework-and-templating-with.html?m=1

样品:

这是一个模板:Templates.scala文件

package templates

import play.api.templates.Html
import scala.xml.Xhtml
import controllers.routes

object Main {

  def page (title:String="Default title")(content: => scala.xml.Elem) = Html {
    "<!DOCTYPE html>" +
      Xhtml.toXhtml(
        <html>
          <head>
            <title>{title}</title>
            <link rel="stylesheet" media="screen" href={routes.Assets.at("stylesheets/main.css").toString()} />
            <link rel="shortcut icon" type="image/png" href={routes.Assets.at("images/favicon.png").toString()} />
            <script src={routes.Assets.at("javascripts/jquery-1.9.0.min.js").toString()} type="text/javascript" />
          </head>
          <body>
            {content}
          </body>
        </html>
      )
  }

  // a panel template, just as an example
  def panel (label:String="Some label")(content: => scala.xml.Elem) = {
    <div class="panel">
      <div class="panel-label">{label}</div>
      <div>{content}</div>
    </div>
  }
}

这是一个索引页 index.scala文件

package views

import templates.Main._

object IndexPage {

  def apply() = {

    page(title="Welcome to my Page!") {

      <div>
        <h1>Hello</h1>

        <p>Some template markup</p>

        {
          panel(label="Dashboard panel")(
            <div>
              Panel content
            </div>
          )
        }

      </div>
    }
  }

}

这是一个控制器: Application.scala文件

package controllers

import play.api.mvc._

object Application extends Controller {

  def index = Action {
    Ok(

      views.IndexPage()

    );
  }

}