说明: 这是本书的第八章内容,由于项目需要,提到前面来看啦~~~O(∩_∩)O
一、模板template的定义
Play中的模板是html代码和Scala代码的混合而成的,其中Scala代码以@开头,一个简单的模板如下:
@(product: List[Product], count: Integer) <dl>
@for(product <- products) { <!-- A Scala "for" loop -->
<dt>
<a href="@routes.Products.show(product.ean)"> <!-- A Scala function call -->
@product.ean - @product.name <!-- outputting Scala values -->
</a>
</dt>
<dd>@product.description</dd>
}
</dl>
注解: 如果想用HTML的方式输出变量或表达式的值,而表示为Scala代码,使用@Html(), 如:
// boldName = "<b>world</b> Hello @Html(boldName)!
二、表达式的范围Scope--in-line expression
1. 这里的"-"是文本,有两个Scala表达式
2. a multi-token statement
3. a multi-statement expression
4. 注解
和
- 应该尽量避免如1,2所示的复杂的表达式
- Scala代码格式参见: http://docs.scala-lang.org/style/scaladoc.html
三、模板的基本功能说明
1、模板参数
@* general template parameters*@ @(customer: models.Customer, orders: List[models.Order]) @* default values for parameters*@ @(title: String = "Home") @* several parameter groups *@ @(title:String)(body: Html)
模板参数应写在template的最开头
2. Iterating
- 一般List的循环结构见上(略)
- Map的循环
@(eanMap: Map[Long, Product]) ...... <dl> @for((ean, product) <- eanMap) { <dt> <a href="@routes.Products.show(ean)"> @ean - @product.name </a> </dt> <dd>@product.description</dd> } </dl> ......
- Set的循环
@(products: Set[Product]) ...... <dl> @for((product, i) <- products.zipWithIndex) { <dt> <a href="@routes.Products.show(product.ean)"> Product @i - @product.name </a> </dt> <dd>@product.description</dd> } </dl> ......
3. reusable blocks
@display(product: models.Product) = { @product.getName() ($@product.getPrice()) } <ul> @for(product <- products) { @display(product) <!--调用display --> } </ul>
还可以写成pure code blocks(不知道该如何翻译~~~)
@title(text: String) = @{ text.split(' ').map(_.capitalize).mkString(" ") } <h1>@title("hello world")</h1>
4. reusable values
@defining(user.getFirstName() + " " + user.getLastName()) { fullName => <div>Hello @fullName</div> }
使用@defining()
四、模板的模块化
main.scala.html
@(title: String = "Paperclips")(content: Html) <!-- New parameter 'content' --> <!DOCTYPE html> <html> <head> <title>paperclips.example.com</title> <link href="@routes.Assets.at("stylesheets/main.css")" rel="stylesheet"> </head> <body> <div id="header"> <h1>Products</h1> </div> @navigation <!--Navigation template --> <div id="content"> @content <!--Page content must be inserted here -->
</div> <footer> <p>Copyright ©2012 paperclips.example.com</p> </footer> </body> </html>
view.scala.html
@(products: Seq[Product]) @main("Products") { <!--call main template --> <h2>Products</h2> <ul class="products"> @for(product <- products) { <li> <h3>@product.name</h3> <p class="description">@product.description</p> </li> } </ul> }
调用: views.html.render(content)
navigation.scala.html
@() <nav class="navbar navbar-inverse navbar-fixed-top" id="navigation"> <div class="navbar-inner"> <div class="container"> <a class="brand" href="@routes.Products.index()">Products Catalog</a> <ul class="nav"> <li><a href="@routes.Products.index()">Home</a></li> <li><a href="@routes.Products.list()">Products</a></li> <li><a href="">Contact</a></li> </ul></div> </div> </nav>
五、Message的使用和国际化(internationalization)
1. 国际化(internationalization)
在conf/application.conf中设置
application.langs="en,en-US,fr"
2. Message
1)messages files文件所在位置——conf/messages.xxx
如果有不同的语言,其文件名分别为conf/messages.fr或conf/messages.en-US
2)定义Message——使用play.i18n.Messages object对象
String title = Messages.get("home.title")
也可以指定语言:
String title = Messages.get(new Lang(Lang.forCode("fr")), "home.title")
3)在模板templates文件中如何使用
@import play.i18n._
@Messages.get("key")
4)Message的格式化方法
conf/messages.en的格式化 | 调用 | 输出 |
files.summary=The disk {1} contains {0} file(s) | Messages.get("files.summary", d.files.length, d.name) | |
shop.basketcount=Your cart {0,choice,0#is empty|1#has one item|1< has {0} items} | <p>@Messages("shop.basketcount", 0)</p> <p>@Messages("shop.basketcount", 1)</p> <p>@Messages("shop.basketcount", 10)</p> |
Your cart is empty. Your cart has one item. Your cart has 10 items. |
5)Retrieving supported languages from an HTTP request
public static Result index() { return ok(request().acceptLanguages()); }
参考:http://www.playframework.com/documentation/2.2.x/JavaTemplates