playframework 1.2.7.2 模板标签#

模板标签#


模板语法#

 

语法描述
${...}用来对表达式进行求值。如 ${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转义功能。如:

${'&amp;'} 

会默认转义输出&amp,而:

#{verbatim}${'&amp;'}#{/verbatim}

将会直接输出&。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值