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>
不是很复杂吧:)
使用JAVA脚本,%{…}%
如果你需要做更复杂的操作,我们可以在 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 更加灵活。
接收标签参数:
标签参数是曝露的模板变量,变量名以下划线开始。如
Hello ${_name} !
使用的时候就可以如下传递标签参数
#{hello name:'Bob' /}
如果你的标签只有一个参数,你可以直接使用_arg作为默认参数,它的名字是隐含的。
Hello ${_arg}!
调用的时候,也可以同时省略参数名
#{hello 'Bob' /}
多语言消息:&{…}用来做国际化
譬如在conf/messages文件中设置下面的值
bookName=The book title is %s
在模板中如下使用:
<h1>&{'bookName', book.title}</h1>
注释:*{…}* 注释语法,会被模板引擎自动忽略。
*{**** Display the book title ****}*
调用Controller:@{…}
<a href="@{Application.show(book.id)}">show book</a>
到此我们就介绍了 Play 模板的一些基本的要素,更多关于Play 框架的模板请看官方文档。
相关推荐
4. **模板引擎**:Play Framework支持多种模板引擎,如JSP、Groovy模板(GSP)以及默认的Ebean模板语言。这些模板引擎使得视图层的开发更加简洁,同时支持动态语言的语法特性。 5. **内置数据库支持**:Play ...
Play Framework是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应用所需的所有东西。 Play Framework的...
Play Framework是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应用所需的所有东西。 Play Framework的关键...
- Play的模板引擎基于Groovy,具有多层继承和自定义标签功能,简化了模板设计,避免了JSP和EL的复杂配置。 8. **模板特性** - 强大的表达能力:模板可以包含逻辑控制和变量操作。 - 自定义标签:允许开发者创建...
- **模板和视图**:学习使用模板引擎创建动态视图。 - **测试**:了解Play提供的测试工具和测试策略,编写单元测试和集成测试。 - **部署**:掌握如何将应用程序部署到不同的服务器或云平台。 #### Play框架与其它...
Play Framework是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应用所需的所有东西。 Play Framework的关键...
Play!是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应用所需的所有东西。
4. **模板引擎**:Play支持多种模板引擎,如Java-based Twirl和Groovy-based Mustache。这些模板引擎使得开发者能够编写出整洁、结构化的HTML代码,并能方便地与后端数据进行交互。 5. **内置开发服务器**:Play...
4. **强大的模板引擎**:Play框架采用了基于Groovy的模板引擎,支持多层继承和自定义标签。相比JSP和EL,Play的模板更加简洁,降低了配置需求。 5. **出色的错误报告**:当应用程序出现异常时,Play会直接显示详细...
使用基于 Groovy 的模板引擎,不仅支持动态数据的展示,还提供了丰富的语法特性来增强可读性和灵活性。 - **JPA 持久化支持**:集成 JPA (Java Persistence API),方便进行数据库操作。 - **测试驱动开发**:支持...
6. Play Framework:一个轻量级、敏捷的框架,强调开发速度和代码的简洁性,支持多种模板引擎,如Freemarker和Groovy模板。 7. GWT (Google Web Toolkit):允许开发者使用Java编写客户端代码,然后编译成高效的...
它支持TDD(Test-Driven Development)和敏捷开发,提供了一个简洁的API和强大的模板引擎。 5. **Apache Maven**:虽然Maven不是一个应用框架,但它是一个项目管理和综合工具,用于构建、依赖管理和文档生成。许多...
3. **Play Framework**:一个全栈式框架,强调开发速度和可读性,支持TDD(测试驱动开发)并内置了模板引擎。 4. **Spark Java**:极简的微服务框架,适合快速构建RESTful API,其API简洁明了,易于学习。 5. **...
7. **模板引擎**:支持多种模板引擎,如Mustache和FreeMarker,用于动态生成HTML页面。 在2015年的背景下,这个演讲可能探讨了Ratpack相对于其他框架的优势,如Spring Boot或Play Framework,以及如何利用Ratpack...
这些框架提供了处理HTTP请求、路由、模板引擎等功能。 7. **测试**:Java项目通常包含测试代码,可能在`src/test/java`目录下。JUnit是常用的单元测试框架,而Mockito用于模拟对象进行测试。集成测试可能使用Spring...