Play Framework中的Groovy模板引擎

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33067361/article/details/80385718

啊啊啊啊啊啊终于找到了他是怎么写的了,先让我哭一会。。。。顺便感谢下大佬 http://weblove.iteye.com/blog/2042990
Play这个东西用了自己的模板引擎生成HTML 页面,这个引擎使用了Groovy作为表达式语言。可以直接使用Groovy语言来创建动态的页面,但是不需要学习Groovy的所有知识,只需要了解跟Java非常相近的一部分。Play将所有的模板文件都放在app/views目录下面,所有页面都是在请求的时候即时解析的。
按照之前写的play framework简介创建一个简单的项目,生成的文件中进入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 Bool("Hello Play!");
  render(book);
}

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

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

Hello from the view
<br/>
I've a book of you "${book.title}".

这里使用了JavaBean的getting方法,因此我们的Book必须有getTitle方法
所有动态内容的输出,Play框架都做了转码处理,以防止XSS跨站点攻击,如果你不想这样做,那么可以使用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>

使用脚本

#{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中,模板应该越简单越好。

调用controller

<a href="@{Application.show(book.id)}">show book</a> 

猜你喜欢

转载自blog.csdn.net/qq_33067361/article/details/80385718