本文来自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>
在模板中@是个特殊的符号 想显示@的话可以写成@@
注释写成@* *@(不会生成html注释)
所有的scala表达式都是被转义的 也就是如果String含有HTML标签不会被解析而是会显示出来(显示Raw Html)
但如果想要被渲染 要用@Html(content) 来显示
@{
<b>hello</b>
}
这样页面显示会被渲染的 因为:scala.xml.NodeSeq会被渲染
@{
"<b>hello</b>"
}
这样还是显示<b>hello</b>
变量的作用域仅限在当前的表达式(也就是一个@) 不想反复写可以用@defining:
@defining(article.countReview()) { total =>
<h3>This article has been reviewed @total times</h3>
<p>@(article.countPositiveReviews()) out of these
@total reviews were positive!</p>
}
这样就不用在@total的地方重复写article.countReview()了
对应关系 :
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){
… …
}