【问题标题】:Why use template engine in playframework 2 (scala) if we may stay with pure scala如果我们可以使用纯 scala,为什么要在 playframework 2 (scala) 中使用模板引擎
【发布时间】:2013-07-05 04:32:24
【问题描述】:

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

使用模板引擎是:

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

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

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

【问题讨论】:

    标签: scala playframework-2.0 template-engine


    【解决方案1】:

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

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

    回答你的最后一个问题,AFAIK 官方有 Groovy engine available 作为一个模块,它提供从 Play 1.x 已知的模板引擎,但是请记住,它只是人们从 Play 1.x 迁移到 Play 的桥梁2.x,因为它比 Play 2 的 native 引擎慢。

    【讨论】:

    • 很好的总结,可能会补充一点,Scala 的 XML 文字对于创建复杂的程序并不是很有用,而 Martin Odersky 自己事后认为它们是一个错误。
    • @MariusSoutier 也很好,你能把这个添加到我的答案中吗?
    • 我有一个建议:github.com/lihaoyi/scalatags(我会使用 google 组 [有时我会使用/转发那里的问题],但它不像 stackoverflow 那样酷。)
    • @ses:我试图说服 Play 社区为 Play 建立新的 StackExchange 站点,但没有成功,可惜 ;)
    • @MariusSoutier 看看 Martin Odersky 关于它的帖子很有趣。你有吗?为什么他认为复杂的事情不好,什么是“复杂”。模板机制是否考虑复杂的东西来应用 XML 文字? (请参阅我的答案中的示例)
    【解决方案2】:

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

    这只是斯卡拉。只是 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()
    
        );
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      相关资源
      最近更新 更多