`

Play Framework 的模板引擎

阅读更多
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 框架的模板请看官方文档。
分享到:
评论

相关推荐

    Java Web框架Play Framework v2.1.0.zip

    Play Framework是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应用所需的所有东西。   Play Framework的...

    play framework 框架手册 word 版

    04.模板引擎 - 43 - 模板语法 - 43 - Expressions: ${…} - 44 - Template decorators : #{extends /} and #{doLayout /} - 44 - Tags: #{tagName /} - 45 - Actions: @{…} or @@{…} - 46 - Messages: &{…} - 46 ...

    Java Web框架Play Framework v2.1.0

    Play Framework是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应用所需的所有东西。 Play Framework的关键...

    Java Web框架Play Framework源代码

    Play Framework是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应用所需的所有东西。 Play Framework的关键...

    play框架手册

    04.模板引擎 - 43 - 模板语法 - 43 - Expressions: ${…} - 44 - Template decorators : #{extends /} and #{doLayout /} - 44 - Tags: #{tagName /} - 45 - Actions: @{…} or @@{…} - 46 - Messages: &{…} - 46 ...

    Play框架教程

    Play!是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应用所需的所有东西。

    旋转:旋转是Play的默认模板引擎

    有关模板语法的更多信息,请参见的Play。 sbt旋转 旋转也可以在Play之外使用。 提供了一个sbt插件,以便与Scala或Java项目轻松集成。 sbt-twirl需要sbt 1.3.0或更高版本。 要将sbt插件添加到您的项目中,请在...

    playframework-appengine:调整 Play 框架的 CoreMVCRouting 以在 Google App Engine 上工作

    playframework-appengine 调整 Play 框架的 Core/MVC/Routing 以在 Google App Engine 上工作 样品 2048 游戏 2048 的简单多人游戏后端。 证明: App Engine 渠道 API 播放模板 基本路由 证明: App Engine ...

    rythmengine:像“剃刀”一样,功能丰富,高性能且易于使用的Java模板引擎

    节奏模板引擎 像“剃刀”一样,功能丰富,高性能且易于使用的Java模板引擎 节奏引擎项目 我们正在寻找人们加入我们的项目。 请通过与Green Luo联系。 链接 该 网站 整合方式 Play!Framework 1.x的。 和播放节奏 ...

    play-scala.g8:默认情况下与 Play 2.x + TypeScript + Webpack + Scalariform + Scalastyle + 配置的安全选项捆绑在一起的 Scala 项目模板

    :用于 nodejs 的健壮、优雅、功能丰富的模板引擎 代码质量: :TypeScript 的静态分析 。 构建工具: :为浏览器打包 CommonJs/AMD 模块。 Webpack + Play 集成: 资产由activator run自动重新加载。 资产在...

    使用 JDK8 的 JavaScript 引擎在 Play 框架中渲染 React 组件

    Play Framework JDK8 上的 React.js 附带一个 JavaScript 运行时:Nashorn React 通过 React.renderToString 支持服务器端渲染。 Play 框架是一个在 JVM 上运行的 Web 框架。结合这些功能,Play 可以使用发送到...

    MyBot:with使用Bot Framework轻松创建聊天机器人! :robot:

    :sign_of_the_horns:简报:安装 :play_or_pause_button: 您想看到这个模板的实际效果吗? :laptop: 在下载代码要运行项目,请执行以下命令: npm installnpm start并记住安装以下工具在本地调试您的机器人: (需要...

    SHAFT_ENGINE:SHAFT_ENGINE是一个测试自动化引擎,可为任何基础测试自动化框架提供统一的高级界面

    如果希望将SHAFT_Engine与IntelliJ一起使用,请应用以下设置: 运行/调试配置&gt;编辑配置...&gt;模板&gt; TestNG&gt;配置&gt;侦听器&gt;添加所有SHAFT_Engine侦听器[AlterSuite,InvokedMethod,套件] 重要链接: 配置管理器 :gear_...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

Global site tag (gtag.js) - Google Analytics