模板标签#
模板语法#
语法 | 描述 |
---|---|
${...} | 用来对表达式进行求值。如 ${note.title} 的值是域对象note的属性title的值。 |
@{...} 和@@{...} | 用来生成调用控制器中动作方法的URL,可以用在页面的链接中。@{...} 和 @@{...} 生成的分别是相对URL和绝对URL。 <a href="@{Application.index()}">首页</a>:生成指向首页的链接。 @{'/public/stylesheets/main.css'}:引入CSS静态资源文件。 |
&{...} | 用来显示经过国际化处理后的消息内容。 |
*{...}* | 用来添加注释。如*{ 这是注释 }*。 |
%{...}% | 用来添加复杂的 Groovy 脚本,可以声明变量和添加语句。 |
#{...} | 用来调用Play框架内置的或是开发人员自定义的标签。如#{get 'title' /}:获取变量 title 的值,该值仅在模板页面中有效。 |
模板标签参考#
a
用来生成指向控制器中动作方法的HTML链接元素。如:
#{a @Application.index()} 首页 #{/a}
会被解析为:
<a href="/application/index ">首页</a>
authenticityToken
在表单内插入一个隐藏的input输入域,值为一个随机生成的令牌。
#{authenticityToken /}
解析为:
<input type="hidden" name="authenticityToken" value="1c6d92fed96200347f06b7c5e1a3a28fa258ef7c">
cache
缓存标签体内的值,如:
#{cache 'startTime'} ${new java.util.Date()} #{/cache}
通过 for 参数,我们可以设置缓存的过期时间。
#{cache 'currentTime', for:'3s'} ${new java.util.Date()} #{/cache}
doLayout
使用模板继承机制,在标签处插入子模板的内容。
<!-- common header here --> <div id="content"> #{doLayout /} </div> <!-- common footer here -->
extends
模板继承,指定模板中需要有 #{doLayout /}标签声明。
#{extends 'main.html' /}
if
if条件判断。
#{if user.countryCode == 'en"' } Connected user is ${user} #{/if}
支持复杂条件判断:
#{if ( request.actionMethod == 'administer' && user.isAdmin() ) } You are admin, allowed to administer. #{/if}
ifnot
与 #{if !condition} 等价。
#{ifnot tasks} No tasks today #{/ifnot}
else
else条件判断,通常只与if标签一起使用,如:
#{if user} Connected user is ${user} #{/if} #{else} Please log in #{/else}
在Play中也可以与 list 标签一起使用,当 list 为空时则执行 else 标签内容。
#{list items:task, as:'task'} <li>${task}</li> #{/list} #{else} Nothing to do… #{/else}
elseif
elseif 条件判断。
#{if tasks.size() > 1} Busy tasklist #{/if} #{elseif tasks} One task on the list #{/elseif} #{else} Nothing to do #{/else}
与else 标签一样,elseif也可以与 list 标签一起使用。
error
输出验证错误消息,如果存在错误消息,显示指定字段的错误消息。
#{error 'user.name'/}
errorClass
如果存在指定的验证错误信息则标签将被替换为文本“hasError”,用来设置出现错误后的样式信息。
<input name="name" class="#{errorClass 'name'/}">
相当于:
<input name="name" class="${errors.forKey('name') ? 'hasError' : ''}">
errors
遍历当前的验证错误对象集合。使用方式与 list 类似,循环体中使用的对象变量名称是 error。
<ul> #{errors} <li>${error}</li> #{/errors} </ul>
标签体内默认已定义的变量:
- error:表示error对象。
- error_index:表示当前错误在集合中的序号。
- error_isLast:表示是否是集合中的最后一个错误。
- error_isFirst:表示是否是集合中的第一个错误。
- error_parity:表示当前错误在集合中序号的奇偶值,可能是 even 或 odd。
<table> <tr> <th>#</th> <th>Error</th> </tr> #{errors} <tr class="${error_parity}"> <td>${error_index}</td> <td>${error}</td> </tr> #{/errors} </table>
ifError
判断指定的字段是否有验证错误。
#{ifError 'user.name'} <p> User name is invalid: #{error 'user.name' /} <p> #{/ifError}
ifErrors
判断当前是否有验证错误。
#{ifErrors} <p>Error(s) found!</p> #{/ifErrors}
field
field 标签用来帮助我们减少重复使用同一变量名。
<p> <label>&{'user.name'}</label> <input type="text" id="user_name" name="user.name" value="${user.name}" class="${errors.forKey('user.name') ? 'has_error' : ''}"> <span class="error">${errors.forKey('user.name')}</span> </p>
使用field方式:
#{field 'user.name'} <p> <label>&{field.name}</label> <input type="text" id="${field.id}" name="${field.name}" value="${field.value}" class="${field.errorClass}"> <span class="error">${field.error}</span> </p> #{/}
所以尽量使用field而不要重复编写user.name。
form
插入一个 form 标签。Play会从路由配置中自动匹配定义的 HTTP 方法,如果没有在路由配置中定义HTTP方法类型,则默认以POST方式请求。如果在路由配置中GET与POST都定义了,则Play默认会选择以最先定义的HTTP方法。
- method(可选), POST或 GET。
- id(可选), 设置表单的id属性。
- enctype(可选), 设置表单数据编码方式,默认为application/x-www-form-urlencoded。
但字符编码方式只能是utf-8。
#{form @Client.create(), method:'POST', id:'creationForm', enctype:'multipart/form-data' } ... #{/form}
解析为:
<form action="/client/create" id="creationForm" method="POST" accept-charset="utf-8" enctype="multipart/form-data"> ... </form>
我们也可以只指定form标签中的请求目标实体:
#{form @Client.update(client.id)} ... #{/form}
其中HTTP请求参数的名称会从声明的行为方法中匹配。
public static void update(String clientId){ // ... }
Play会自动生成带clientId 参数的URL地址:
<form action="/client/update?clientId=3442" method="POST" accept-charset="utf-8" enctype="multipart/form-data"> ... </form>
i18n
用来使得支持国际化的消息文件可以用JavaScript来访问。在JavaScript代码中可以i18n()方法来访问。如i18n('app_title')。
在conf/messages 中定义:
hello_world=Hello, World ! hello_someone=Hello %s !
在模板中包含插入 #{i18n /} 标签用来开启国际化支持,然后通过conf/messages中的key获取当前key的国际化值:
alert(i18n('hello_world')); alert(i18n('hello_someone', 'John'));
我们还可以通过设置key的值来限制允许使用的国际化值,并且允许使用通配符来设置范围。
#{i18n keys:['title', 'menu.*'] /}
include
在当前模板中导入另一个模板, 并且当前模板中的所有变量对导入的模板透明。
<div id="tree"> #{include 'tree.html' /} </div>
render
渲染指定的模板。可以是绝对路径,也可以相对 /app/views 的路径地址。
#{render 'Application/other.html'/}
jsAction
本标签会生成一个返回服务端Action的URL地址的JavaScript函数,它不会自动执行Ajax请求,需要通过返回的URL地址手动执行。 如下面例子,首先定义路由:
GET /users/{id} Users.show
然后在客户端导入定义的路由:
<script type="text/javascript"> var showUserAction = #{jsAction @Users.show(':id') /} var displayUserDetail = function(userId){ $('userDetail').load( showUserAction({id: userId}) ) } </script>
list
用来遍历一个对象集合。如:
<ul> #{list items: notes, as:'node'} <li>${node}</li> #{/list} </ul>
其中 #{list items:notes, as:'note'} 用来遍历对象集合 notes。循环体中的每个对象用变量 note来引用。在循环体的代码中可以引用一些预定义的变量。这些变量有固定的名称,但是会以循环体中的对象变量名作为前缀。在上面的例子中是 note_。 note_index 表示当前对象在集合中的序号; note_isFirst 表示是否是集合中的第一个对象; note_isLast 表示是否是集合中的最后一个对象; note_parity 表示当前对象在集合中序号的奇偶值,可能是 even 和 odd。
<ul> #{list items:nodes, as:'node'} <span class="${ node_parity}"> ${ node_index}. ${ node } </span> ${ node_isLast ? '' : '-'} #{/list} </ul>
其中items 参数是可选的,我们可以无需声明参数类型直接写参数。如:
#{list items:users, as:'user'} <li>${user}</li> #{/list}
也可以:
#{list users, as:'user'} <li>${user}</li> #{/list}
for循环可以通过使用Groovy中的range对象创建:
#{list items:0..10, as:'i'} ${i} #{/list} #{list items:'a'..'z', as:'letter'} ${letter} ${letter_isLast ? '' : '|' } #{/list}
其中as参数也不是必须的,我们可以用约定的下划线符“ _ ”作为默认的变量名:
#{list users} <li>${_}</li> #{/list}
option
当前模板位置中插入一个 option 标签。
- value – 选项的值。
#{option user.id} ${user.name} #{/option}
输出:
<option value="42">jto</option>
select
当前模板位置中插入一个 select 标签。
- name (必须) – 设置select元素的name属性。
- value (可选) - 默认选中项。
#{select 'booking.beds', value:2, id:'select1'} #{option 1}One king-size bed#{/option} #{option 2}Two double beds#{/option} #{option 3}Three beds#{/option} #{/select}
输出:
<select name="booking.beds" size="1" id="select1" > <option value="1">One king-size bed</option> <option value="2" selected="selected">Two double beds</option> <option value="3">Three beds</option> </select>
通过指定 items 属性生成选择项:
- items (可选) – 设置集合对象。
- value (可选) – 设置默认选中项。
- labelProperty (可选) – 设置每一项的lable值对应对象的哪个属性。
- valueProperty (可选) – 设置每一项的value值对应对象的哪个属性,默认为对象的id 属性。
labelProperty和valueProperty属性值不支持Java基本类型。需使用封装类型如Integer或Long来代替int或long类型 。 如:给定用户的集合,且每一个用户都有name属性:
#{select 'users', items:users, valueProperty:'id', labelProperty:'name', value:5, class:'test', id:'select2' /}
输出:
<select name="users" size="1" class="test" id="select2" > <option value="0" >User-0</option> <option value="1" >User-1</option> <option value="2" >User-2</option> <option value="3" >User-3</option> <option value="4" >User-4</option> <option value="5" selected="selected">User-5</option> </select>
set
用来设置和获取可以在模板中使用的变量。如#{set email:'china@oopsplay.org'} 设置了变量email的值,可以通过 #{get 'email'} 来获取。 我们可以在定义中引用其他变量:
#{set title:'Profile of ' + user.login /}
我们可以在标签体内定义变量的值:
#{set 'title'} Profile of ${user.login} #{/set}
get
获取由 set标签定义的值,通过 get/set 机制,可以使templates, layouts和sub-templates间进行通信。
<head> <title>#{get 'title' /} </head>
我们可以在get标签体内设置当变量不存在时的缺省值,如下面当‘title’不存在时则会显示“Homepage”。
<head> <title>#{get 'title'}Homepage #{/} </head>
script
用来生成一个<script>元素引用/public/javascripts目录下的JavaScript文件。如 #{script 'jquery.js'} 引用/public/javascripts/jquery.js 文件。
#{script src:'jquery-1.5.1.min.js ', id:'jquery' , charset:'utf-8' /}
- src (必须) – 设置脚本文件的地址, 无需在地址前加上默认父目录 /public/javascripts。
- id (可选) – 设置生成的 script 标签的id。
- charset (可选) – 设置脚本文件的字符编码 – 默认为 UTF-8。
如果只设置src 的参数值,则可以省略 src 参数直接写参数值:
#{script 'jquery-1.5.1.min.js' /}
stylesheet
作用与 script 类似,不同的是使用 <link> 元素来引用/public/stylesheets 目录下的 CSS 文件。如#{stylesheet id:'main', media:'print', src:'print.css', title:'Print stylesheet' /}。
- src (必须) –设置样式文件的地址, 无需在地址前加上默认父目录 /public/stylesheets。
- id (可选) –设置生成的 link 标签的id。
- media (可选) – 设置 media 属性: screen, print, aural, projection……
- title (可选) – 设置标签 title 属性。
如果只设置src 的参数值,则可以省略 src 参数直接写参数值:
#{stylesheet 'default.css' /}
verbatim
禁用模板中的HTML转义功能。如:
${'&'}
会默认转义输出&,而:
#{verbatim}${'&'}#{/verbatim}
将会直接输出&。