`

【playframework2笔记整理】3、template

 
阅读更多

本文来自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/main.scala.html -> views.html.main
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){
  … …

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics