当前位置: 代码迷 >> .NET Framework >> 【playframework2札记整理】3、template
  详细解决方案

【playframework2札记整理】3、template

热度:269   发布时间:2016-05-01 23:34:46.0
【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>

?

[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>}

??

?

[email protected]()了


对应关系 :

写道
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){  … …}
  相关解决方案