`
billma
  • 浏览: 4728 次
  • 性别: Icon_minigender_1
  • 来自: 东营
最近访客 更多访客>>
社区版块
存档分类
最新评论

翻译:Play scala模板系统

阅读更多

Scala templates

Play Scala comes with a new and really poweful Scala based template engine. The design of this new template engine is really inspired by ASP.NET Razor, especially:

Play Scala提供了一个新的、强劲的基于scala的模版引擎。新模版引擎的设计灵感来自于asp.net razor,特别是:

Compact, Expressive, and Fluid : Minimizes the number of characters and keystrokes required in a file, and enables a fast, fluid coding workflow. Unlike most template syntaxes, you do not need to interrupt your coding to explicitly denote server blocks within your HTML. The parser is smart enough to infer this from your code. This enables a really compact and expressive syntax which is clean, fast and fun to type.

简洁、有表现力、灵活:在文件中需要尽可能少的字符数和输入,取得更快的、更灵活的工作流程。不像大多数模板的语法,你不需要中断你的代码来明确指出html中的服务器blocks。解析器能够从你的代码中自动判断服务器blocks。从而得到真正简洁、有表现力的干净、快速、有趣的语法。

Easy to Learn : Enables you to quickly be productive with a minimum of concepts. You use all your existing Scala language and HTML skills.

好学:只有很少的概念,使你能很快用它进行工作。你只要用已有的scala语言和html技巧就可以了。

Is not a new language : We consciously chose not to create a new language. Instead we wanted to enable developers to use their existing Scala language skills, and deliver a template markup syntax that enables an awesome HTML construction workflow with your language of choice.

不是一门新语言:我们有意不去创造一门新的语言,而是想要开发者能够使用他们已有的scala语言、技巧,来实现一套能用你选择的语言完成漂亮的html流程的模板标记语法

Works with any Text Editor : Razor doesn’t require a specific tool and enables you to be productive in any plain old text editor.

可用任何编辑器工作:razor不需要一个特殊的工具,你能用任何普通的、原始的文字编辑器来工作。

Overview

概述

A Play Scala template is a simple text file text file, that contains small blocks of Scala code. It can generate any text-based format (HTML, XML, CSV, etc.).

一个play scala模板是一个简单的文本文件,包含小的scala代码块。它能生成任何基于文本的格式:html、xml、csv等等。

It’s particularely designed to feel comfortable to those used to working with HTML, allowing Web designers to work with.

它被专门设计成方便使用html来工作的。

They are compiled as standard Scala functions, following a simple naming convention:

模板被编译成标准的scala函数,下面是一个简单的命名惯例

If you create a views/Application/index.scala.html template file, it will generate a views.Application.html.index function.

如果你创建了 views/Application/index.scala.html 模板文件,它将生成一个views.Application.html.index 函数

Here is for example, a classic template content:

下面是一个模板内容的示例:

@(customer:models.Customer, orders:Seq[models.Order])
 
<h1>Welcome @customer.name!</h1>
 
@if(orders) {
     
    <h2>Here is a list of your current orders:</h2>
     
    <ul>
    @orders.map { order =>
        <li>@order.title</li>
    }
    </ul>
     
} else {
     
    <h2>You don't have any order yet...</h2>
     
}






And you can easily use it from any Scala code:

你能够轻松的在任何scala代码中使用它

val page:play.template.Html = views.Application.html.index(
    customer, orders
)






Syntax: the magic ‘@’ character

语法:神奇的@字符

 

The Scala template uses '@' as single special character. Each time this character is encountered, it indicates the begining of a Scala statement. It does not require you to explicitly close the code-block, and will infer it from your code:

scala模板用@作为唯一的特定字符。每当@出现,说明scala语句开始。你不需要专门支持代码块在哪里结束,模板将自动从你的代码中推断:

Hello @customer.name!
      ^^^^^^^^^^^^^^
        Scala code






Because the template engine will automatically detect the end of your code block by analysing your code, it only allow for simple statements. If you want to insert a multi-token statement, just make it more explicit using brackets:

因为模板引擎能自动分析你的代码来推测代码块结束的地方,所以只被允许使用一些简单的语句。如果你想插入一个多元运算的语句,可以使用括号来使它更明确

Hello @(customer.firstName + customer.lastName)!
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
                    Scala Code






You can also use curly bracket, like in plain Scala code, to write a multi-statements block:

你也可以用花括号,就像普通的scala代码一样,来写一个有多个语句的代码块

Hello @{val name = customer.firstName + customer.lastName; name}!
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                             Scala Code






Because '@' is the only special character, if you want to escape it, just use '@@'

因为@是唯一的特定字符,如果你想表示@,你要用"@@"

Template parameters

模板参数

Because a template is a function, it needs parameters. Template parameters must be declared on the first template line:

因为一个模板是一个函数,它需要参数。模板的参数必须在模板的第一行被声明

@(customer:models.Customer, orders:Seq[models.Order])






You can also use default values for parameters:

你也能给参数赋默认值:

@(title:String = "Home")






Or even several parameter groups:

或者有多个参数组:

@(title:String)(body: => Html)






And even implicit parameters:

甚至是隐式参数:

@(title:String)(body: => Html)(implicit session:play.mvc.Scope.Session)






Note that all parameter type names must be fully qualified.

注意:所有的参数类型都必须是完整的

Looping

循环

You can use the Scala for comprehension , is a pretty standard way. Just note that the template compiler will just add a yield keyword before your block:

你能用scala的for推导语句,这是一个相当标准的方法。只是要注意模板编译器会在你的代码块前加一个yield关键字

<ul>
@for(p <- products) {
    <li>@p.name ($@p.price)</li>
} 
</ul>






But as you probably know, here the for comprehension is just syntaxic sugar for a classic map:

但你可能知道,下面的这个for comprehension不过是个语法糖

<ul>
@products.map { p =>
    <li>@p.name ($@p.price)</li>
} 
</ul>






If-Blocks

Nothing special here. Just use the if instruction from Scala:

没有什么特别的,只是用scala里的if语句

@if(items.isEmpty) {
    <h1>Nothing to display</h1>
} else {
    <h1>@items.size items!</h1>
}






Pattern matching

模式匹配

You can also use pattern matching in templates:

你也能在模板中使用模式匹配

@connected match {
    
    case Admin(name) => {
        <span class="admin">Connected as admin (@name)</span>
    }
    
    case User(name) => {
        <span>Connected as @name</span>
    }
    
}






Declaring reusable blocks

声明重用模块

You can create reusable code block (or sub template):

你能创建重用模块(子模板)

@display(product:models.Product) = {
    @product.name ($@product.price)
}
 
<ul>
@products.map { p =>
    @display(product = p)
} 
</ul>






Note that you can also declare reusable pure Scala blocks:

你也可以声明纯scala的重用模块

@title(text:String) = @{
    text.split(' ').map(_.capitalize).mkString(" ")
}
 
<h1>@title("hello world")</h1>






Import statements

Import 语句

You can import whatever you want at the begining of your template (or of a sub template):

你可以在模板或子模板开头import库

@(customer:models.Customer, orders:Seq[models.Order])
 
@import utils._
 
…






Composing templates (tags, layouts, includes, etc.)

Templates being simple functions you can compose them in any way you want. Below are a few examples of other common scenarios:

模板是简单的函数,你能用任何任何你想的方式编写它们。下面是一些常见的写法的例子

Layout

Let’s declare a views/main.scala.html template that will act as main layout:

我们来定义一个views/main.scala.html模板作为主layout

@(title:String)(content: => Html)
 
<h1>@title</h1>
 
<hr>
 
<div id="main">
    @content
</div>
 
<hr>
 
<div id="footer">
    ...
</div>






As you see this template takes 2 parameters: a title and an HTML block.

这个模板有2个参数,一个标题,一个html块。

Now we can use it from another views/Application/index.scala.html template:

现在我们在另一个叫views/Application/index.scala.html的模板中使用它:

@main(title = "Home") {
    
    <h1>Home page</h1>
    
}






Tags

Let’s write a simple views/tags/notice.scala.html tag that display an HTML notice:

我们来写一个简单的views/tags/notice.scala.html tag显示一个html的提醒:

@(level:String = "error")(body: (String) => Html)
 
@level match {
    
    case "success" => {
        <p class="success">
            @body("green")
        </p>
    }
    
    case "warning" => {
        <p class="warning">
            @body("orange")
        </p>
    }
    
    case "error" => {
        <p class="error">
            @body("red")
        </p>
    }
    
}






And let’s use it from any template:

我们可以在任意的模板中使用它

@import views.tags.html._
 
@notice("error") { color =>
    Oops, something is <span style="color:@color">wrong</span>
}






Includes

Nothing special, you can just call any other templates:

没什么特别的,你能在一个模板中使用其它的模板

<h1>Home</h1>
 
<div id="side">
    @views.common.html.sideBar()
</div>






0
0
分享到:
评论

相关推荐

    毕业设计:基于scala的小型超市管理系统的设计与实现.zip

    1. **数据库设计**:系统可能使用关系型数据库如MySQL,进行商品信息、库存、订单等数据的存储和管理,需要设计合理的数据库表结构。 2. **RESTful API设计**:通过HTTP协议提供API接口,使得前端可以通过发送GET、...

    twirl, Play Scala 模板编译器.zip

    twirl, Play Scala 模板编译器 旋转 旋转是播放 模板引擎。在播放项目中,旋转是自动可以用的,也可以以独立使用,无需任何依赖。有关模板语法的更多信息,请参见模板引擎的Play 文档。 sbt旋转也可以在游戏外使用。...

    thera:Scala的模板引擎

    尽管可能不如某些主流模板引擎那样广泛,但Scala的生态系统提供了一定的扩展性和灵活性。 9. **与其他框架的集成**:Thera可以轻松地与Scala的Web框架,如Play Framework、Finatra等集成,提供视图层的支持。 10. ...

    play-scala-starter-example:播放Scala入门模板(适合新用户!)

    【标题】"play-scala-starter-example:播放Scala入门模板(适合新用户!)" 提供了一个基于Scala和Play Framework的初始项目结构,是初学者踏入Scala Web开发的理想起点。Play Framework是一个开源的Web应用程序...

    scala PLAY 框架 sbt仓库

    - **模板引擎**:Play支持Erb-like的模板语言,如Twirl,用于生成HTML,同时支持Scala的语法特性,使得模板更加动态和强大。 - **Akka集成**:Play框架基于Akka,提供了强大的异步处理能力,可以处理高并发场景。 - ...

    Scala.in.Action

    - **视图渲染**:介绍模板引擎的使用方法,包括HTML模板和Scala模板。 7. **数据库连接** - **JDBC访问**:讲解如何使用JDBC来访问关系型数据库。 - **ORM框架**:介绍Scala中常用的ORM框架,如Slick和Quill,...

    play-scala-seed.g8:播放Scala种子模板:运行“ sbt new playframeworkplay-scala-seed.g8”

    `play-scala-seed.g8` 是一个基于 Scala 的 Play 框架的项目模板,它为开发者提供了一个快速启动新 Play 应用程序的起点。这个模板是通过 Giter8(G8)工具创建的,G8 是一个用于创建项目骨架的 Scala 脚本工具,它...

    play-scalajs.g8:Giter8模板,开始使用Play和Scala.js

    `play-scalajs.g8`就是这样一个模板,专为搭建结合了Play Framework和Scala.js的新项目而设计。 **使用play-scalajs.g8模板** 1. **安装Giter8和依赖** 在使用`play-scalajs.g8`模板前,你需要确保已经安装了...

    play2+scala+mongodb demo示例

    在Scala中使用Play,你可以享受到函数式编程的优势,同时利用其强大的类型系统和并发模型。Play Framework 2的核心特性包括: 1. **模块化**: Play支持模块化架构,允许开发者选择和组合不同的服务,如模板引擎、...

    Scala 框架

    4. **模板引擎**:Play支持多种模板引擎,如Twirl,这是一种Scala内置的模板语言,它使得HTML代码可以与Scala代码无缝结合,提高了视图层的开发效率和代码质量。 5. **测试支持**:Play框架提供了全面的测试工具和...

    play-scala-chatroom-example:使用Scala API播放聊天室

    【标题】"使用Scala API构建聊天室示例——play-scala-chatroom-example" 【描述】在现代Web开发中,Play Framework是一个广泛使用的开源框架,它为构建高效、反应式的Web应用程序提供了强大的支持。这个名为"play-...

    play-slick3步:使用scala Play Framework和Slick的示例应用程序

    Play Framework是一款基于Java和Scala的开源Web应用框架,它遵循MVC(模型-视图-控制器)设计模式,提供快速、反应式和模块化的开发体验。Play以其简洁的API、热重载能力以及对TDD(测试驱动开发)的支持而受到...

    play-scala-hello-world-tutorial:在Scala中播放的Hello World教程

    【Play Scala Hello World 教程】是初学者进入Scala编程和Play Framework开发的绝佳起点。Play Framework是一个开源的Web应用框架,它基于JVM(Java虚拟机)并以Scala和Java语言为中心,提供了构建现代、反应式Web...

    Play开发资源+scala+akka

    在IT行业中,Play框架是一个非常流行的开源Web应用框架,它基于Scala和Java语言,采用Model-View-Controller(MVC)架构模式。Play框架以其简洁、高性能和开发效率高而受到开发者们的喜爱。本资源包涵盖了Play开发的...

    play2-blog:使用Scala和Play框架的博客引擎

    在“play2-blog”项目中,开发人员利用Scala语言和Play框架创建了一个高效的博客引擎,提供了一个灵活且可扩展的平台来构建和管理个人或组织的博客系统。 **一、Scala语言介绍** Scala是一种多范式的编程语言,结合...

    scala-intellij-bin-1.8.0.zip

    - **类型系统**:Scala拥有强类型系统,支持类型推断,可以避免很多类型错误。 - **函数式编程**:Scala支持高阶函数、柯里化、闭包和不可变数据结构等函数式特性。 - **面向对象编程**:Scala是面向对象的,类、...

    Play2模板引擎Japid42.zip

    Play1使用groovy模板作为渲染引擎,而Play2使用Scala模板。在Play1时期,Japid作为groovy的替代品,非常受欢迎。而在Play官方使用Scala替换groovy后,性能虽然有所提高,但是限于Scala编译器的性能,仍然远不如Play2...

    mastering play framework for scala

    《精通Scala的Play框架》是一本专为Scala开发者设计的深度学习指南,旨在帮助读者全面理解和熟练运用Play框架。Play框架是构建Web应用程序的一个强大工具,尤其在Scala语言的支持下,它提供了高度的灵活性和效率。这...

Global site tag (gtag.js) - Google Analytics