【翻译】Play框架入门教程一:建立项目

简介

在这个教程中你会学到用Play框架从头到尾的开发一个真实的Web程序。在这个程序中,我们将使用在一个真实项目中需要的所有技术,来介绍Play框架开发Web程序的实战技巧。

这个教程分为几个独立的部分。每个部分将介绍更多复杂的特性,并且提供真实项目的需求,包括数据验证、错误处理、权限框架、自动测试框架、Web界面接口、国际化等内容。

项目

我们决定创建一个blog项目。这不是一个有想象力的决定,但是这个项目能让我们学习到目前Web程序大多数的功能性需求。为了更有趣点,我们要处理不同角色的用户(editor,admin)。这个项目的名字称为yabe。

guide1-0_thumb

这个教程的源代码在Play安装目录下的samples-and-tests/yabe/目录。

先决条件

首先,确保计算机安装了Java,Play框架需要Java 5或以上版本。还有我们要使用命令行,最好使用类Unix操作系统。当然如果你使用Windows操作系统,Play框架也会工作得很好。要有Java和Web开发技术(比如:HTML, CSS and JavaScript)的知识,然而不必深入了解JEE的知识。Play框架是一个“全栈式”Java框架,提供和封装了你所需要的所有Java API,你不必知道怎样配置JPA实体或者部署JEE组件。当然还需要文本编辑器。如果你习惯用诸如Eclipse和NetBeans等Java IDE开发Play框架的Web程序是非常好的。然而使用一些诸如Textmate、Emacs或VI简便的文本编辑器来开发Play框架的Web程序也是非常愉快的。

安装Play框架

安装非常简单,下载最近的版本然后解压到任何路径。如果使用Windows,应避免在安装路径中有空格。比如c:\play ,而不能是c:\Documents And Settings\user\play。最好是把Play主目录加入到工作路径path,这样只需要在命令行输入play就可以使用Play框架的功能了。为了检测Play框架是否安装好,可以在命令行中输入play,然后命令行窗口中会出现基本帮助信息。

创建项目

Play框架安装好后,就可以blog项目了。创建Play程序非常容易,仅仅只需要Play框架命令行的命令。

打开命令行窗口,输入:

~$ play new yabe

执行后会提示输入这个项目的全名:Yet Another Blog Engine

1_thumb5

play new命令创建了一个yabe/目录,这个目录中包含一些文件和文件夹。重要的有:

app/存放项目的核心文件,分别有models、controllers和views三个文件夹。它也可以包含其他Java包,这是java源文件存放的地方。

conf/存放项目的配置文件,有项目主配置文件application.conf,路由配置文件routes,国际化配置文件messages。

lib/存放项目所需的Java二进制包。即.jar文件。

public/存放公用资源,比如JavaScript文件,CSS样式和图片资源。

test/存放项目的测试程序,测试程序基于JUnit或Selenium。

注意:Play框架的字符编码是UTF-8。要保证上面这些文件夹中的文本文件也要是UTF-8编码。

如果你是一个经验丰富的Java程序员,你也许想知道.class文件存放在哪里。实际上Play框架不使用.class文件,而是直接读取Java源文件,并使用Eclipse来编译他们。

这导致在开发过程中的两件重要事情。首先,Play框架运行时会检测Java源文件的变更并自动重新加载它们。其次,当异常发生时,Play将创建更好的错误报告来显示给你确切的源代码。

事实上Play框架把字节码缓存在tmp/目录里。你可以使用play clean命令来释放缓存。

运行程序

现在可以测试一下新建立的程序了。回到命令行窗口,在yabe/目录下输入play run命令。Play框架将载入程序,启动Web服务器并监听9000端口。

2_thumb3

打开浏览器键入http://localhost:9000,程序显示了一个缺省的欢迎页。

3_thumb2

现在我们来看看这个页面是怎样显示的。

程序的主入口配置在conf/routes文件里。这个文件定义了程序所有可访问的URL。打开routes文件,会看到第一个“route”:

GET / Application.index

它告诉Play,当服务器收到来自于/路径的GET请求时要调用Application.index的方法。在这个程序中,Application.index是controllers.Application.index简写,因为controllers包是隐式附加的。

在创建一个标准Java程序时,通常会定义一个入口方法,比如:

public static void main(String[] args) {
  ... 
}

Play程序则有多个入口方法,每个URL就有一个。这些方法称为action方法。定义Action方法的类称为controller。

看看什么是controller。打开yabe/app/controllers/Application.java源文件:

package controllers;
 
import play.mvc.*;
 
public class Application extends Controller {
 
	public static void index() {
		render();
	}
 
}

controller 类继承于play.mvc.Controller类,这个类提供了许多controller需要的方法,比如在index action中的render方法。

index action定义为public static void,因为controller类不需要实例化和返回值。

index action很简单,只是调用了render()方法来通知Play渲染模板。使用模板是返回HTTP响应的一个最通用的方式。

模板是在/app/views 目录下的简单文本文件。因为这里没有指定一个模板,index action会使用一个默认的模板:Application/index.html。

打开/yabe/app/views/Application/index.html:

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

在这个模板中,只有Play tag,与JSP tag类似,#{welcome /} tag会在浏览器中生成欢迎信息。#{extends /} tag 表示这个模板继承于main.html这个模板。模板继承可用来创建复杂的web也并重用公共部分。

打开/yabe/app/views/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'}" />
        <link rel="shortcut icon" type="image/png" 
            href="@{'/public/images/favicon.png'}" />
    </head>
    <body>
        #{doLayout /} 
    </body>
</html>

#{doLayout /}tag表示index.html插入内容的地方。

试着编辑controller类来看看Play怎么自动加载它。打开yabe/app/controllers/Application.java,删除render()后的分号,让它出错,就像这样:

public static void index() {
    render()
}

然后到浏览器刷新这个页面,Play会检测源文件变更并试着加载程序controller,但是因为controller有错误,所以在浏览器中显示一个编译错误。

4_thumb1

把刚才的错误修改正确,在编辑模板,打开yabe/app/views/Application/index.html覆盖欢迎消息。

#{extends 'main.html' /}
#{set title:'Home' /}
 
<h1>A blog will be here</h1>

在浏览器刷新这个页面。

5_thumb1

设置数据库

对于这个blog程序,在编代码之前还有一件更重要的事情就是设置数据库。Paly附带有一个称为H2的标准的SQL数据库管理系统,你可以选择一个内存数据库或文件系统数据库来保存数据。

在这个程序开始,我们要做大量的测试和改变,由于这个原因,最好使用内存数据库以便总是有新的数据集。

设置数据库,打开yabe/conf/application.conf文件去掉下面这行的注释:

db=mem

回到浏览器刷新页面,Play会自动启动数据库,在程序日志里会有:

INFO ~ Connected to jdbc:h2:mem:play

本文章英文原文:http://www.playframework.org/documentation/1.2.3/guide1

posted @ 2011-10-01 18:01  FigoYu  阅读(3672)  评论(0编辑  收藏  举报