啊啊啊啊啊啊终于找到了他是怎么写的了,先让我哭一会。。。。顺便感谢下大佬 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>