Play是Java Web敏捷开发的框架 http://www.playframework.com/documentation/1.2.7/home
开始项目
项目
我们将开发一个博客引擎。这不是一个非常有想象力的选择,但是它将允许我们探索开发一个现代Web应用的大多数技术。为了让过程更加燃一点,我们将对不同的角色(编辑者,管理员)设置不用的权限。 这个博客引擎将以yabe为名。
前提
首先,确保你已经安装了Java平台。Play需要Java 5或以上的版本。
安装Play
安装过程如丝般顺滑。从下载页面下载最新的二进制包,然后在你喜欢的地方解压它。
如果你用的是Windows,最好避免在路径中混入空格。比如c:\play就是个比c:\Documents And Settings\user\play更好的选择。
为了方便操作,你需要添加Play文件夹到你的系统路径中。这样你就不需要在play命令前面敲一大通路径名了。要想检查安装是否成功,打开一个新的命令行窗口,敲下play;应该会出来play的基本使用帮助。
创建项目
现在Play已经安好了,是时候开始写博客应用。创建一个Play应用非常简单,仅需要play命令行工具。之后会生成Play应用的基本架构。
打开一个新的命令行并敲入:
~$ play new yabe
它会提醒输入应用的全名。输入yabe。 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方法定义于被称为controller的类中。 让我们看一下controllers.Application控制器张什么样子。打开yabe/app/controllers/Application.java
package controllers;
import play.mvc.*;
public class Application extends Controllers {
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/stylesheet/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("yoyoyoyo");
render();
}
这侧,Play正确的重载了控制器,替换掉JVM中的旧代码。每次请求/都会在控制器输出台“yoyoyoyo”信息。 你可以移开那行代码,现在修改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/app/application.conf,解除这一行的注释:
db=em
正如你在注释中看到的一样,你可以冗余的配置任何JDBC数据库,甚至配置链接池。
现在回到浏览器并刷新欢迎页面。Play将自动启动数据库。检查下面一行是否出现在应用日志中:
INFO ~ Connected to jdbc:h2:mem:play
补充
如果运行play run 命令出现下面提示:
解决办法:
找到play\framework\build.bat 修改
java -Xms512M -Xmx1024M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M %DEBUG_PARAM% %JAVA_OPTS% -Dfile.encoding=UTF-8 -Dinput.encoding=Cp1252 -Dplay.version="%PLAY_VERSION%" -Dsbt.ivy.home="%~dp0..\repository" -Dplay.home="%~dp0." -Dsbt.boot.properties="%fp%sbt/sbt.boot.properties" %PLAY_OPTS% -jar "%~dp0sbt\sbt-launch.jar" %*
为
java -XX:+CMSClassUnloadingEnabled %DEBUG_PARAM% -Dfile.encoding=UTF8 -Dplay.version="%PLAY_VERSION%" -Dsbt.ivy.home="%~dp0..\repository" -Dplay.home="%~dp0." -Dsbt.boot.properties="file:///%p%sbt/sbt.boot.properties" -jar "%~dp0sbt\sbt-launch.jar" %*
今天到此为止。。。