Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2013-01-01) 1. 创建工程

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

(本文译者是CQS)

引言

通过这个教程,你将学会如何使用Play框架去构建一个实实在在的web 应用。在这个应用中,我们将使用一切实际项目中可能会用到的技术,同时介绍一些好的且有效的Play应用程序开发实践。

我们把这个教程分成若干个独立的模块。每个模块将介绍不少复杂的Play应用特征,并提供一切实际项目所需的技术需求:如验证,错误处理,完整的安全框架,自动化的测试组件,一个新颖的Web前端,一个管理模块等等

教程里的所有代码都可以在你的项目中使用。我们鼓励你复制/粘贴部分代码或者拿走所有你所喜闻乐见的代码块


关于项目

我们选择去创建一个博客引擎.这虽然不是一个极具想象力的应用,但是它却允许我们的开发涵盖了大部分现代Web应用所需要用到的功能。

为了使这个应用变得有趣一些,我们将管理多个用户并给予不同的角色(可编辑者,管理员)

我们叫这个博客引擎(项目)为yabe.

这个教程同时被分发为一个例子应用。你可以在Play的安装目录的samples-and-tests/yabe/目录下找到完整的代码.


先决条件

第一点,你必须确定你有一个可以工作的Java环境。Play需要JDK5 或之后版本

因为我们可能会较多的使用命令行,建议最好选择使用一个类Unix的操作系统。当然,你如果使用Windows系统,Play一样也能工作的很好;你只需在windows的命令提示符下输入少量的几行Play指令。

我们假定你已经有Java和web开发(例如HTML,CSS和JavaScript)的经验,但你不需要深入了解Java 企业级开发组件(Java Enterprise Edition)。Play是一个“全栈式”的Java框架,它提供并封装了所有你需要Java API.同时也不需要去知道如何去配置一个JPA 对象管理或部署一个JEE 组件.

在编码之前,你需要一个编辑器。如果你习惯了使用一个功能齐全的Java IDE,例如Eclipse或NetBeans,毋庸置疑,你可以使用它们进行Play编码。但是如果你更乐意使用一些简单的编辑器例如Textmate,Emacs,VI,由于Play框架可以自己控制编译和部署,在不久后支持这些编辑器.

在这个教程的后面,我们将使用Lighttpd和Mysql去展示如何部署一个'产品模式'的Play应用.如果你不会装mysql和Lightted,Play同样可以好好的工作,这些都不是问题。

译者注:Play内置了内存数据库HSQL DB和内置服务器netty


安装Play框架

安装过程非常简单。从下载页下载最新的二进制包,解压到任何路径下。

如果你使用的是Windows,尽量的避开路径中万恶的空格,如:c:\play优于c:Documents And Settings\user\play.

为了更有效工作,你需要将Play安装目录添加到你的环境变量Path中。这样你只需要在命令提示符中输入play就能时候用Play工具包了。确认你的安装是否正确,只需打开终端,敲入play,正确安装的话,它会展示给你不少的Play的基本使用帮助。


创建项目

好的,现在Play已经正确安装了,是时候创建博客应用了。创建一个Play应用相当容易,由Play命令工具全权控制。这样就能保证所有的Play应有都有标准的项目布局。

新建命令行,然后输入:

~$ play new yabe

它会提示你输入应用全名。输入:Yet Another Blog Engine.

image

play new 命令创建了一个目录yabe/,同时生成一系列文件和目录,重要的几个文件如下:

app/ 包含了应用程序的核心,由模型(models),控制器(controllers)和视图(views) 3个目录组成。当然,这里可包含其他Java包.这里是.java文件正确的放置目录.

conf/ 包含了应用程序的所有配置文件,其中三个特殊的文件,主配置文件application.conf,routes路由定义文件,用于国际化的messages文件。

lib/包含了其它Java库(标准.jar包).

public/包含了公共可用的资源,例如JavaScript文件,Css文件,图片目录文件等.

test/包含了应用测试.测试可能是Java Junit测试 或者Selenium测试.

由于Play使用UTF-8编码,所以请保证在这些目录中的文件使用了UTF-8编码,确认你的编辑器相应地设置了UTF-8编码。

如果你是一个老练的Java开发人员,你会疑惑.class文件跑哪去了?答案是没有:Play没有使用任何的class文件.它只是直接读取Java源文件.在这种情况下,我们使用Eclipse编译器实时的编译Java源码.

这样就允许下述的两个重要特性在开发过程中出现。第一,Play将监测源码的变化,并自动将它在运行阶段重新载入.第二,当一个Java异常发生,Play可以创建一个更好的错误报告,并告知你发生错误的源码位置。

事实上,Play保留一份bytecode缓存在你的tem/目录下,但这仅仅是为了提高在重启大型应用时的速度。如果你需要,你可以使用play clean命令行去清理缓存。


运行程序

我们现在测试一下刚才刚创建的Play应用.跳到命令行,进入到刚创建的yabe/目录下,并输入play run。Play将载入这个应用,并启动一个端口为9000的web服务器.

现在你可以在浏览器中输入http://localhost:9000查看这个应用.一个新的Play应用会有一个标准的欢迎界面去告诉你,你的应用创建成功了.

image

现在让我们看看这个新的应用是如何做到展示这个页面的.

这个应用的主要入口在conf/routes文件中定义,包括了所有可以被访问的URLs.打开这个自动生成的routes文件,你可以看到第一个'route':

GET        /            Application.index

这个的意思即当服务器收到一个/ 路径的**GET**请求,则调用**Application.index**这个Java方法.其实,**Application.index**是**controllers.Application.index**的快捷方式,因为**controllers**包是默认的.

当你创建一个独立的Java应用,你可以看到看到程序单一的入口即main函数如:

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

一个Play应用有相对于每个URL都有个切入口.我们叫这些方法为**action**方法.Action方法所在类被称为控制器(controllers).

让我们看看**controller.Application**这个控制器里有什么?打开**yabe/app/controllers/Application.java**这个源文件:

package controllers;
import play.mvc.*;

public class Application extends Controller {
    public static void index() {
        render();
    }
}

我们可以发现控制类都继承了**play.mvc.Controller**.这个类提供了许多有用的方法,例如index action中的使用到**render()**方法。

这个index方法被定义为**public static void**,这是一个action方法的标准定义.你可以发现action方法是static的,因为这个控制类永远不会被实例化.同时action方法被标记为public是为了授权play框架去调用(call)它们去相应一个URL请求.通常action方法是返回void.

这个默认的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 tags.Play tags是和JSP tags相似的.**#{welcome/}** tag就是用来生成你在浏览器看到欢迎信息的.

**#{extends 'main.html'/}** tag 告诉Play这个模板继承了一个叫**main.html**的模板.模板继承是一个很强大的感念,它允许你通过重用公用部分,创建一个相当复杂的网页。

打开**/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没?**Application/index.html**的内容就是插入到这的.

我们现在尝试去编辑这个控制器文件,去探究下Play是如何自动重新载入的.打开**yabe/app/controllers/Application.java**文件,故意去掉**render()**后面的分号.

然后在浏览器中重新刷新页面.你可以发现Play已经检测到变化并重新载入了程序控制器.因为你制造了一个错误,所以你得到一个编译错误.

[![image](/user_images/1294-5.png "image")](/user_images/1294-5.png)



好,现在我们修正这个错误,做一个真正的修改.

public static void index() {
    System.out.println("Yop");
    render();
}

这次,Play正确的重载了控制器,并替代JVM里旧的代码.这样,每次/地址请求都会打印一个'Yop'到控制台.

你可以去掉这行没用的代码,并编辑**yabe/app/views/Application/index.html**文件,替换掉这个欢迎Tag.

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

<h1>A blog will be there</h1>

Java代码变化了,只需刷新浏览器就可以看见这个页面的变化了.

> 现在我们开始这个Blog应用的编码.你可以继续使用一个文本编辑器或者在Java IDE中打开这个项目.如果你要设置一个Java IDE环境用于Play编程,请看[Setting-up your preferred IDE](http://play-framework.herokuapp.com/zh/ide).

* * *

#### 设置数据库

在开始编码之前,我们需要为这个Blog引擎设置一个数据库.为了开发方便的目的,Play设置了一个独立的SQL数据库(H2).在切换到其它更为强壮的数据库钱,使用H2是一个很好的方式去起始一个项目.你可以选择一个基于内存的数据库或者为了保存重启应用后仍存在的数据而使用的文件数据库。

在应用的初始,我们将对应用的模型做比较多的测试和更改,所以我们选择了基于内存的数据库,以便于每次都有一个新鲜的数据集.

打开**yabe/conf/application.conf**文件,取消注释这行:

db=men

正如你注释中看到的,你可以很容易的配置任何JDBC兼容的数据库,甚至配置连接池.

现在,我们返回浏览器刷新页面.Play会自动启动这个H2数据库.你会在应用日志中看到这个消息:

INFO  ~ Connected to jdbc:h2:mem:play

Using a version control system to track changes

译者注:由于这里使用了非主流控制系统(Bazaar)进行版本控制,表示不乐意翻译,有兴趣请看英文,谢谢.

When you work on a project, it’s highly recommended to store your source code in a version control system (VCS). It allows you to revert to a previous version if a change breaks something, work with several people and give access to all the successive versions of the application. Of course you can use any VCS to store your project, but here we will use Bazaar as an example. Bazaar is a distributed source version control system.

Installing Bazaar is beyond the scope of this tutorial but it is very easy on any system. Once you have a working installation of Bazaar, go to the blog directory and init the application versioning by typing:

$ bzr init

When storing a Play application in a VCS, it’s important to exclude the tmp/ and logs/ directories.

$ bzr ignore tmp

$ bzr ignore logs

Now we can commit our first blog engine version:

$ bzr add

$ bzr commit -m “YABE inital version”

Version 1 is committed and we now have a solid foundation for our project.

comments powered by Disqus