本文来自fair-jm.iteye.com 转截请注明出处
?
这一章内容比较少:
?
模板的写法类似于jsp的写法 这里记得笔记就相对少了很多
?
第一行是参数列表 可以通过action传参
一个简单的例子:
@(title: String)(content: Html)(implicit lang:Lang,flash:Flash,request:Request[_])<!DOCTYPE html><html> <head> <title>@title</title> <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")"> <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/bootstrap.css")"> <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")"> <link type="image/png" href="@routes.Assets.at("images/glyphicons-halflings-white.png")"> <link type="image/png" href="@routes.Assets.at("images/glyphicons-halflings.png")"> <script src="@routes.Assets.at("javascripts/jquery.min.js")" type="text/javascript"></script> <script src="@routes.Assets.at("javascripts/bootstrap.js")" type="text/javascript"></script> </head> <body> <div class="navbar navbar-inverse"> <div class="navbar-inner"> <div class="container"> <a class="brand" href="@routes.Application.index()">@Messages("application.name")</a> <div class="nav-collapse collapse"> <ul class="nav"> <li @if(request.path==routes.Application.index().toString){class="active"}><a href="@routes.Application.index()">@Messages("application.home")</a></li> <li><a href="/thread/">talk</a></li> <li><a href="/user/">rate</a></li> </ul> <ul class="nav pull-right"> @if(!request.session.get(Users.user).nonEmpty){ <li @if(request.path==routes.Users.register().toString){class="active"}><a href="@routes.Users.register()">@Messages("user.register")</a></li> <li @if(request.path==routes.Users.login().toString){class="active"}><a href="@routes.Users.login()">@Messages("user.login")</a></li> }else{ <li><a href="@routes.Users.show(request.session.get(Users.user).getOrElse("-1").toLong)">@request.session.get(Users.username).getOrElse("")</a></li> <li><a href="@routes.Users.logout()">@Messages("user.logout")</a></li> } </ul> </div> </div> </div> </div> <div class="container"> @content </div> </body></html>
?
[email protected] [email protected]@@
注释写成@* *@(不会生成html注释)
所有的scala表达式都是被转义的 也就是如果String含有HTML标签不会被解析而是会显示出来(显示Raw Html)
但如果想要被渲染 [email protected](content) 来显示
?
@{<b>hello</b>}
这样页面显示会被渲染的 因为:scala.xml.NodeSeq会被渲染
@{ "<b>hello</b>"}
?
这样还是显示<b>hello</b>
变量的作用域仅限在当前的表达式(也就是一个@) [email protected]:
@defining(article.countReview()) { total =><h3>This article has been reviewed @total times</h3><p>@(article.countPositiveReviews()) out of these@total reviews were positive!</p>}
??
?
对应关系 :
views/robots.scala.txt -> views.txt.robots
views/users/profilepage/avatar.scala.html -> views.html.users.profilepage.avatar.
?这边的对应关系指的是在action渲染模板时用的位置 例如模板文件放在了 views/user/下名字为 login.scala.html 那么在action中的写法是:
def login = Action{ implicit request => if(!request.session.get(Users.user).isDefined){ val form = loginForm Ok(views.html.user.login(form)) }else{ Ok("login,"+request.session.get(Users.user)) } }
国际化:
国际化移除和地区相关的代码 本土化用地区相关版本的文件来作为app的内容 在应用程序中两者都是要用到的
在conf下放置messages.LANG的文件
代码中使用:Messages("users.login")(Lang("en")) 第二个参数的Lang是implicit的 在controller中的Action 用implicit request 就可以了 locale的信息在Accept-Language中
?
message文件中使用的是java.text.MessageFormat的格式
?
?
?
一些我遇到过的较为复杂的操作:
<div class="col-md-9"> @{ articles collect { case (title,time,shortcontent) => { Html(s""" <div class="blog-post"> <h2 class="blog-post-title"> $title </h2> <p class="blog-post-meta"> $time </p> <p> $shortcontent </p> <hr/> </div> """) } } } </div>
?直接用字符串的形式构造出内容 在通过Html函数转化为html标签
?
在main中传入多个Html:
注意了参数的Html不能用()包围 不然不会被转成HTML 而是会被转成 scala.xml.Elem
?
main的参数可以:
@(title: String,moreScript:Html = Html(""))(content: Html)
接着在要导入的模板中用:
@moreScript = { <script src="@routes.Assets.at("javascript/bootstrap-markdown.js")"></script> }@main(Messages("article.new.blog"),moreScript){ … …}