Play是一个Java Web敏捷开发的框架
http://www.playframework.com/documentation/1.2.7/homejavascript
之因此要翻译这个教程,是由于实训的时候敲定用这个做为框架,因而我把相关教程翻译给小伙伴学习学习。如今就干脆放上来给你们分享分享css
在这个教程中,你将经过从头至尾开发一个真正的Web应用来学习Play框架,在这个应用中,咱们将尝试用上你将在真实项目中须要的每样技术,同时介绍Play应用开发的最佳实践。html
咱们把教程分割成相互独立的各部分。每一个部分将介绍更为复杂的特性,并提供真实项目须要的每样东西:验证,错误处理,框架安全,自动化测试组件,一个高大上的用户界面,一个管理面板,等等。java
在本教程中的全部代码都能被用于你的项目。咱们鼓励你复制粘贴代码片断,整份搬去用也没所谓。jquery
咱们将开发(又一个)博客引擎。这不是一个很是有想象力的选择,可是它将容许咱们探索开发一个现代Web应用的大多数技术。git
为了让过程更加燃一点,咱们将对不一样的角色(编辑者,管理员)设置不一样的权限。数据库
这个博客引擎将以yabe为名。segmentfault
这个教程也已做为范例随下载包赠送。你能够在samples-and-tests/yabe/文件夹下找到成品代码。浏览器
首先,确保你已经安装了Java平台。Play须要Java 5或以上的版本。缓存
因为咱们将须要频繁使用命令行,最好仍是使用类Unix的操做系统。若是你用的是Windows,那也没问题;就是打命令的时候须要打多一点。
咱们将假定你已经有Java和Web开发(特别是HTML,CSS和Javascript)经验。不过,你不须要熟悉JavaEE全部组件。Play是一个全栈Java框架,它提供了或者封装了你将须要的所有Java API。没用必要知道如何配置JPA实体管理器或部署一个JavaEE组件。
你将须要一个文本编辑器。若是更喜欢使用大而全的Java IDE,好比Eclipse或NetBeans,你固然能够用它。不过即便使用简单的文本编辑器,好比Textmate,Emacs或Vim,你也能够玩转Play。由于框架自己会处理好编译和部署的过程。咱们很快就会看到这一点了……
在教程的后面,咱们将使用Lighttpd和MySQL来展现如何在生产环境部署一个Play应用。但即便你没用安装这些,play也能够运行,这不是个问题。
安装过程如丝般顺滑。从下载页面下载最新的二进制包,而后在你喜欢的地方解压它。
若是你用的是Windows,最好避免在路径中混入空格。好比c:\play就是个比c:\Documents And Settings\user\play更好的选择。
为了方便操做,你须要添加Play文件夹到你的系统路径中。这样你就不须要在play命令前面敲一大通路径名了。要想检查安装是否成功,打开一个新的命令行窗口,敲下play
;应该会出来play的基本使用帮助。
如今Play已经安好了,是时候开始写博客应用。建立一个Play应用很是简单,仅须要play命令行工具。以后会生成Play应用的基本架构。
打开一个新的命令行并敲入:
~$ play new yabe
它会提醒输入应用的全名。输入Yet Another Blog Engine。
play new
命令建立了一个新的文件夹yabe/外加一系列文件和文件夹。其中包括下面各部分:
app/ 包括应用的核心,划分为models,controllers和views文件夹。它也能够包括其余Java的包。这是.java
源代码文件所在之处。
conf/ 包括全部的应用配置文件,特别是主application.conf文件,路由定义文件和用于国际化的信息文件。
lib/ 包括全部可选的Java库,好比标准的.jar
。
public/ 包括全部能够公开的资源,好比Javascript文件,样式表和图片。
test/ 包括全部的应用测试。测试能够是Java的JUnit测试或者Selenium测试。
由于Play只使用UTF-8编码,故全部的文本文件都须要使用UTF-8编码。确保你的文本编辑器已经作了相应的配置。
若是你开发过Java应用,你可能会奇怪.class
文件到哪儿去了。答案是……没有.class
文件了:Play并不使用任何class
文件;相反它直接处理Java源代码。实际上咱们使用Eclipse的编译器来即时编译Java源代码。
这致使了开发过程当中的两点重要的改进。第一个,Play会自动监测Java源代码的改变并在运行时自动重载。第二个,当一个Java异常发生时,Play能向你展现更好的错误报告 - 带对应的源代码的哦~
事实上Play在应用的tmp/文件夹下有字节码的缓存,但只用于加速从新启动项目的过程。若是须要,你能够用
play clean
清空缓存。
如今看一下新建立的应用。回到命令行,切换到新建立的yabe/文件夹并输入play run
。Play将加载应用,并在localhost:9000
启动一个服务器。
用浏览器打开http://localhost:9000,你将看到新的应用。一个新的应用用一个标准的欢迎页面,告诉你一切安好。
下面看看一个新应用是如何展现这个页面的。
你的应用的主入口是conf/routes
文件。这个文件定义了应用中全部合法的URL。若是你打开这个文件,就会看到第一个'route':
GET / Application.index
这里简单地告诉Play,当服务器收到对/
路径的一个GET请求,它要调用Java方法Application.index
。在这个例子中,Application.index
是controllers.Application.index
的缩写,由于controllers
包是默认在内的。
当你建立单个Java应用时,你一般用main方法定义一个单一入口:
public static void main(String[] args) { ... }
Play应用有多个入口,每一个URL对应一个。咱们称之为action
方法。action
方法定义于被称为controllers
的类中。
让咱们看一下controllers.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 action被定义为public static void
方法。action方法都须要这样定义。你能够看到这些方法都是static的,由于控制器类永远不会实例化。它们同时也是public的,这样框架才能调用它们来响应URL请求。它们老是返回void。
这个index action很简单:它调用render()
方法来渲染模板。使用模板是大多数状况下生成HTTP响应的方式。(但不是惟一的方式)
模板是位于/app/views
的文本文件。由于咱们没有指定一个模板,这个action就会使用默认的Application/index.html
。
打开/yabe/app/views/Application/index.html
看看模板长啥样:
#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}
模板的内容简单明了。事实上,你看到的所有是Play标签。Play标签就像是JSP标签。#{welcome /}标签生成了你看到的欢迎信息。
#{extends /}标签告诉Play,这个模板是继承自另外一个叫main.html
的模板。模板继承是强大的特性,它容许你经过重用组件来建立复杂的Web页面。
打开/yabe/app/views/main.html
:
<!DOCTYPE html> <html> <head> <title>#{get 'title' /}</title> <meta charset="${_response_encoding}"> <link rel="stylesheet" media="screen" href="@{'/public/stylesheets/main.css'}"> #{get 'moreStyles' /} <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}"> <script type="text/javascript" charset="${_response_encoding}" src="@{'/public/javascripts/jquery-1.5.2.min.js'}"></script> #{get 'moreScripts' /} </head> <body> #{doLayout /} </body> </html>
你看到靠近底部的#{doLayout /}标签了吗?这是插入Application/index.html
的内容的地方。
咱们来看看Play如何自动从新加载控制器文件。打开yabe/app/controllers/Application.java
,删掉render()
后面的分号(来制造一个错误)
public static void index() { render() }
在浏览器刷新页面。你能够看到Play监测到文件的变化,并重载了应用控制器。但由于制造了错误,你将看到一个编译错误。
Ok,如今更正错误,作一个真正的修改:
public static void index() { System.out.println("Yop"); render(); }
此次,Play正确地重载了控制器,替换掉JVM中的旧代码。每次请求/
都会在控制台输出'Yop'信息。
你能够移开那行输出代码,如今修改yabe/app/views/Application/index.html
模板,替换掉欢迎信息:
#{extends 'main.html' /} #{set title:'Home' /} <h1>A blog will be here</h1>
若是Java代码改变了,只需刷新页面,就能看到修改结果。
咱们尚未开始写博客应用呢。你能够选择使用文本编辑器或者IDE,好比Eclipse或NetBeans。若是你想使用IDE,参阅配置你喜欢的IDE。
在开始码代码以前还要作多一件事。做为博客引擎,咱们须要一个数据库。为了便于开发,Play内置了一个叫H2的数据库。固然若是须要,咱们也能够切换到一个更加健壮的数据库。你能够选择设置数据是存储在内存中,仍是在文件系统中(这样即便应用从新启动,你的数据也会保留)。
在一开始,咱们将对应用模型作许多测试和改动。所以,最好选择存储在内存中,这样每次启动,都不会跟旧数据有任何牵连。
打开yabe/conf/application.conf
,解除这一行的注释:
db=mem
正如你在注释中看到的同样,你能够容易地配置任何JDBC数据库,甚至配置链接池。
这个教程是按照纯内存数据库撰写的;如何在其余数据库使用JPA的内容超出了本教程的范畴。
如今,回到浏览器并刷新欢迎页面。Play将自动启动数据库。检查下面的一行是否出如今应用日志中:
INFO ~ Connected to jdbc:h2:mem:play
当你开发一个项目时,最好使用版本控制系统(VCS)来存储你的源代码。若是发生什么问题,它容许你还原到上一个版本。同时它使得多人协做变得更方便,而且容许签出应用的各个版本。
当在VCS中存储Play应用代码时,记住把tmp/
,modules/
,lib/
,test-result/
和logs
文件夹排除在外。
若是你正在使用Eclipse,和play eclipsify
命令,那么你也应该把.classpath
和eclipse/
排除在外。
这里咱们将用Bazaar做为例子。Bazaar是一个分布式版本控制系统。
如何安装Bazaar超出了本教程的范畴,但不管是何种系统,安装都很简单。一旦你安装好了,切到博客文件夹,并输入命令初始化应用版本:
$ bzr init $ bzr ignore tmp $ bzr ignore modules $ bzr ignore lib $ bzr ignore test-result $ bzr ignore logs
如今咱们能够提交咱们的博客引擎的第一个版本:
$ bzr add $ bzr commit -m "YABE initial version"
Git是另外一个分布式版本控制系统,查看它的文档来获取更多信息。
在应用的根目录下建立一个git版本库:
$ git init
建立包括下面各项的.gitignore
:
/tmp /modules /lib /test-result /logs
加入应用的代码,而后提交:
$ git add . $ git commit -m "YABE initial version"
版本1已经提交上去,如今咱们的应用已经有了个坚实的基础。