学无止境

书山有路勤为径,
学海无涯苦作舟!

0%

Play Framework的模板引擎实例-适应于2.0版本以下

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

优势:

  1. 动态编译,无论你修改Entity,Controller或者view,都无需重启服务器。
  2. 视图采用了Groovy作为模板引擎,让表示层真正做到了开发高效简洁。
    Play的页面模版有一套非常简单易用的tag机制,复用view非常的方便。
  3. Play可以方便的组织测试数据,而这些数据是一个文本结构,不依赖于特定数据库。也就是说即使用的是一个内存数据库,也可以很方便的组织测试数据。
  4. Play有很多的静态方法,在Controller和Model中都有,静态方法带来的最大麻烦就是难以继承。
  5. 拥有精确的错误定位机制,当错误发生的时候,可以精确的定位到错误代码的位置。
  6. 速度很快,启动快,运行的速度也十分快。

创建运行生成eclipse项目的命令

  1. 创建一个工程
    打开DOS。 输入 play new webplay
    意思是创建一个 名字叫 webplay 的工程。但是该工程暂时无法导入ECLIPSE
  2. 测试过工程是否成功
    打开DOS 输入 play run webplay
    意思是 测试工程是否运行成功。下面会提示测试路径。表示启动成功.
    3. 创建Eclipse 部署文件
    运行 play eclipsify webplay
    意思是创建 eclipse 部署文件
    4.工程导入到Eclipse
    跟普通项目导入一样

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 ,代码如下:
    1
    2
    3
    #{extends 'main.html' /}
    #{set title:'Home' /}
    #{welcome /}
    第一行表明此模板扩展自 main.html,接下来使用了 Play 框架的 set 指令来设置页面的标题,这些指令都要进行关闭,最后一行打印一行欢迎信息。然后我们再来看看 main.html 模板:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!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 方法来处理,例如:
    1
    2
    3
    4
    5
    6
    7
    8
    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


${hello}
‘’’
来个更复杂点的类
‘’’
package models;
public class Book {
private final String title;
public Book(String title) {
super();
this.title = title;
}
public String getTitle() {
return title;
}
}

1
2
3
4
5
6
7
8
然后在 controller 传递此类的实例:
'''
public static void index() {
Book book = new Book("Hello Play !");
render(book);
}
'''
接下来在模板中获取该对象

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

Hello from the view


I’ve a book for you “${book.title}”.

1
2
这里使用了 JavaBean 的 getting 方法,因此我们的Bean 必须有 getTitle 方法。
所有动态内容的输出,Play 框架都做了转码处理,以防止XSS跨站点攻击,如果你不想这样做,那么可使用 raw() 方法,例如

${book.title.raw()}

1
2
但这不是一个好习惯,仅在你确认会带来什么后果时才使用。
模板的注释方式如下:

{Will not be evaluated by the template engine}

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

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

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

#{extends ‘main.html’ /}
#{set title:’Home’ /}
I’ve some books for your :

    #{list items:books, as:'book'}
  • ${book.title}
  • #{/list}
1
2
## 使用脚本
如果你需要做更复杂的操作,我们可以在 Groovy 中使用脚本,在脚本中可以定义变量并可直接使用其他变量,例如:
#{extends 'main.html' /} #{set title:'Home' /} I've some books for your :
    #{list items:books, as:'book'} %{ bookTitle = book.title.toUpperCase(); }%
  • ${bookTitle}
  • #{/list}
1
2
3
可以做包括迭代、条件等一大堆复杂的事情,但记住,不要在模板中做过于复杂的功能,将这些业务逻辑放在 controller 或者是 models 中,模板应该越简单越好。
## 定义标签
Play 框架自带很多的标签,但你可以自己创建一些,为了创建标签,我们必须在views目录下创建名为 tags的子目录,例如我们创建一个 booklist.html 文件,存放在 views/tags 目录下,booklist.html 的代码如下:
    #{list items:_items, as:'book'} %{ bookTitle = book.title.toUpperCase(); }%
  • ${bookTitle}
  • #{/list}
1
使用 '_' 来获取参数,本例中是 _items,有了这个自定义的tag,我们就可以将上面那个模板修改为:
#{extends 'main.html' /} #{set title:'Home' /} I've some books for your : #{booklist items:books /} ``` 尽量利用参数来使得 tag 更加灵活。 到此我们就介绍了 Play 模板的一些基本的要素,更多关于Play 框架的模板请看官方文档。