Play 框架有自己的模板引擎来生成HTML页面,该引擎使用 Groovy 做为表达式语言。你可以直接使用 Groovy 语言来创建动态的网页,但并无需学习 Groovy 所有的知识,你需要了解的只是跟 Java 非常相近的一部分。Play 将所有的模板文件都放在 app/views 目录下,所有页面都是在请求时即时解析的。

接下来我们创建一个简单应用:

oschina@oschina.net:~/dev/play$ /usr/share/play/play new views
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/
~
~ play! 1.0.3, http://www.playframework.org
~
~ The new application will be created in /home/wichtounet/dev/play/views
~ What is the application name? Views
~
~ OK, the application is created.
~ Start it with : play run views
~ Have fun!
~

接下来检查生成的文件,进入 app/views 目录,我们可以看到下面这些内容:

  • Application : 存放应用主 controller 程序的模板
  • errors : 存放错误页面模板,例如 404、500等
  • main.html : 主页面模板

打开  Application/index.html ,代码如下:

#{extends 'main.html' /}
#{set title:'Home' /}
 
#{welcome /}

第一行表明此模板扩展自 main.html,接下来使用了 Play 框架的 set 指令来设置页面的标题,这些指令都要进行关闭,最后一行打印一行欢迎信息。

然后我们再来看看 main.html 模板:

<!DOCTYPE html>
 
<html>
    <head>
        <title>#{get 'title' /}</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">
        #{get 'moreStyles' /}
        <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">
        <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script>
        #{get 'moreScripts' /}
    </head>
    <body>
        #{doLayout /}
    </body>
</html>

这个模板中包含一些特殊的指令:

  • #{get ‘title’ /} : 获取变量 title 的值,该值仅在模板页面中有效
  • @{‘/public/stylesheets/main.css’} : 引入某个静态资源
  • #{doLayout /} : 此处插入子模板的内容,在本例中就是前面提到的 index.html 页面,index.html 扩展自 main.html

如何在模板间传递参数呢?

传递参数很重要,例如我们在 controller 中读取一些数据,并将这些数据传递到 view 中进行显示。在 Play 框架中可以使用 render 方法来处理,例如:

package controllers;
 
import play.mvc.*;
 
public class Application extends Controller {
    public static void index() {
        String hello = "Hello World from Controller !";
 
        render(hello);
    }
}

index 方法中向模板传递了一个名为 hello 的变量,要在模板中获取这个变量的值,只需 ${hello} 即可:

#{extends 'main.html' /}
#{set title:'Home' /}
 
Hello from the view
<br />
${hello}

怎样,很简单吧?

来个更复杂点的类吧

package models;
 
public class Book {
    private final String title;
 
    public Book(String title) {
        super();
 
        this.title = title;
    }
 
    public String getTitle() {
        return title;
    }
}

然后在 controller 传递此类的实例:

public static void index() {
    Book book = new Book("Hello Play !");
    render(book);
}

接下来在模板中获取该对象

#{extends 'main.html' /}
#{set title:'Home' /}
 
Hello from the view
<br />
I've a book for you "${book.title}".

这里使用了 JavaBean 的 getting 方法,因此我们的Bean 必须有 getTitle 方法。

所有动态内容的输出,Play 框架都做了转码处理,以防止XSS跨站点攻击,如果你不想这样做,那么可使用 raw() 方法,例如

${book.title.raw()}

但这不是一个好习惯,仅在你确认会带来什么后果时才使用。

模板的注释方式如下:

*{Will not be evaluated by the template engine}*

数组和列表

在实际使用过程中,列表和数组是经常要用到的,下面是一个传递列表的实例:

public static void index() {
        List<Book> books = new ArrayList<Book>(3);
        books.add(new Book("Hello Play !"));
        books.add(new Book("Hello Template !"));
        books.add(new Book("Hello Engine !"));
        render(books);
}

模板中使用该列表对象的代码如下:

#{extends 'main.html' /}
#{set title:'Home' /}
I've some books for your :
<ul>
    #{list items:books, as:'book'}
        <li>${book.title}</li>
    #{/list}
</ul>

不是很复杂吧:)

使用脚本

如果你需要做更复杂的操作,我们可以在 Groovy 中使用脚本,在脚本中可以定义变量并可直接使用其他变量,例如:

#{extends 'main.html' /}
#{set title:'Home' /}
I've some books for your :
<ul>
    #{list items:books, as:'book'}
        %{
           bookTitle = book.title.toUpperCase();
        }%
        <li>${bookTitle}</li>
    #{/list}
</ul>

你可以做包括迭代、条件等一大堆复杂的事情,但记住,不要在模板中做过于复杂的功能,将这些业务逻辑放在 controller 或者是 models 中,模板应该越简单越好。

定义标签

Play 框架自带很多的标签,但你可以自己创建一些,为了创建标签,我们必须在views目录下创建名为 tags的子目录,例如我们创建一个 booklist.html 文件,存放在 views/tags 目录下,booklist.html 的代码如下:

<ul>
    #{list items:_items, as:'book'}
        %{
            bookTitle = book.title.toUpperCase();
        }%
        <li>${bookTitle}</li>
    #{/list}
</ul>

使用 '_' 来获取参数,本例中是 _items

有了这个自定义的tag,我们就可以将上面那个模板修改为:

#{extends 'main.html' /}
#{set title:'Home' /}
I've some books for your : 
#{booklist items:books /}

尽量利用参数来使得 tag 更加灵活。

到此我们就介绍了 Play 模板的一些基本的要素,更多关于Play 框架的模板请看官方文档。

Play Framework 的模板引擎相关推荐

  1. 理解模板引擎Razor 的原理

    Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.简洁的语法与.NET Framework 结合,广泛应用于ASP.NET MVC 项目.Razor Pad是一 ...

  2. 由浅入深:自己动手开发模板引擎——置换型模板引擎(四)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  3. Spring Boot (四)模板引擎Thymeleaf集成

    一.Thymeleaf介绍 Thymeleaf是一种Java XML / XHTML / HTML5模板引擎,可以在Web和非Web环境中使用.它更适合在基于MVC的Web应用程序的视图层提供XHTM ...

  4. 使用 .NET Core模板引擎创建自定义的模板和项目

    本文要点 .NET CLI 包含了一个模板引擎,它可以直接利用命令行创建新项目和项目项.这就是"dotnet new"命令. 默认模板集涵盖了默认控制台和基于 ASP.NET 的应 ...

  5. DotLiquid模板引擎简介

    DotLiquid是一个在.Net Framework上运行的模板引擎,采用Ruby的Liquid语法,这个语法广泛的用在Ruby on rails和Django等网页框架中. DotLiquid相比 ...

  6. Spring Boot 最佳实践(四)模板引擎Thymeleaf集成

    ## 一.Thymeleaf介绍 Thymeleaf是一种Java XML / XHTML / HTML5模板引擎,可以在Web和非Web环境中使用.它更适合在基于MVC的Web应用程序的视图层提供X ...

  7. Springboot视图解析与模板引擎

    1.视图解析 视图解析:SpringBoot默认不支持 JSP,需要引入第三方模板引擎技术实现页面渲染. 视图解析原理流程 1.目标方法处理的过程中,所有数据都会被放在 ModelAndViewCon ...

  8. Node 简介、模块、模板引擎、NPM、文件操作、缓冲区、文件流、网络操作、Express框架

    一.Node简介 1.1 客户端的JavaScript是怎样的 问题 答 什么是 JavaScript 脚本语言 运行在浏览器中 一般用来做客户端页面的交互(Interactive) JavaScri ...

  9. spring boot 中用到的thymeleaf (模板引擎)

      thymeleaf 一.          简要: thymeleaf 支持html5标准:是一种模板引擎框架(TemplateEngine Framework):thymeleaf 页面无须部署 ...

最新文章

  1. pypypy python_聊聊Python中的pypy
  2. (转载)python多行注释
  3. Play Framework介绍:主要概念(转)
  4. Problem01 不死神兔
  5. jquery.dataTables.min.js:62 Uncaught TypeError: Cannot read property ‘style‘ of undefined原因
  6. netflix 开源_手工3D打印机,Netflix上的开源等
  7. 枚举类型 实现一个enumeration对于类的加工的函数
  8. 这可不是一般的便宜哦!
  9. python批量运行cmd_python 批量ssh并执行命令
  10. OC中给我们提供的一个技术:谓词(NSPredicate).note
  11. android tab之间滑动切换界面功能
  12. 性能优化总结(三):聚合SQL在GIX4中的应用
  13. 《强化学习》-读书笔记-第三章 有限马尔科夫决策过程
  14. 普通用户添加systemctl 自定义服务的开机启动项
  15. 微信小程序:人生重开模拟器
  16. 入门计算机的粗略学习-Day13
  17. python抢红包 无需电脑_Python助你秒抢红包,拼手速?不存在!
  18. 信创引领丨呼叫中心加速适配国产化
  19. 自学 9个月 Java 找到了一份 12K 的工作,前辈的方式值得分享给大伙
  20. 车身控制器BCM系统功能规范

热门文章

  1. 最全金蝶KIS记账王使用问题汇总
  2. HTTP协议中你必须知道的三种数据格式
  3. Codeforces 527C Glass Carving
  4. bubbleSort 冒泡排序
  5. 深入理解PHP之源码目录结构
  6. zookeeper专题:zookeeper集群搭建和客户端连接
  7. 二倍图三倍图什么意思_香港读研,图什么?
  8. linux设备驱动中的并发控制
  9. localhost 就一定是 localhost 么?
  10. Redis的应用场景汇总