本博文将介绍如何使用playframework 创建一个真实的Web 应用程序,通过这个Demo 介绍Play应用开发中的最佳实践。
1. 下载安装 playframework ,配置环境变量
playframework1.2.7 要求JDK5及以上版本,推荐使用JDK7,推荐中UniX系系统下使用命令行进行开发。
2. 创建项目
play new app_1
转换成intellij idea项目,进入目录,play idealize
在ide中导入项目文件,app_1.ipr
在命令行中测试项目,play run ,默认绑定9000端口
3. 目录介绍
apps/ 包含应用的核心部份,用models,controllers,views三个目录组织不同功能的JAVA文件,这是java的源文件目录,手工创建时,需要将此目录作为源文件目录。
conf/ 包含应用所有的配置文件,特别要注意的是,主要配置文件application.conf ,路由配置文件routes 和消息配置文件messages,此文件一般用于国际化
lib/ 主要存放依赖jar 包
public/ 包含所有的公共静态资源,比如 js,css,image等
test/ 包含整个应用所有的用例测试,支持Junit测试和Selenium测试
- play使用UTF-8作为唯一的编码,所以所有文本文件都要使用UTF-8进行编码,在Unix系统不存在此类问题,但在window中需要注意
4. class文件放在哪里
如果你是一个经验丰富的Java程序员,你会很想知道.class文件的编译和加载时机,但是Play官方的答案是:Play没有使用类文件,而是直接读取Java文件源代码。
这样做在开发过程中有两个明显的好处,一个是Play会在运行时监测到Java源文件的改动和自动重新加载他们;第二个是当出现一个Java异常时,Play可以显示更好的报告,甚至是出错的行数和代码。
- 实际上,Play为了保证效率,会在应用的tmp/目录下缓存编译后的字节码文件,如果有需要,可以使用paly clean命令清理缓存。
5. 运行程序
使用play run 命令可以启动刚创建的程序。默认的端口是9000
看到此页即为启动成功。
- 为什么会显示这个页面?因为我们程序中 conf/routs文件配置了路由。
GET / Application.index
这行配置很明了地实现了,当服务器收到路径为/
的GET请求时,它会调用Application.index方法,这是controllers.Application.index的简写,因为处理请求的controllers包是默认的。
当你想创建独立的Java应用程序,可以使用单一入口的Main方法 。Play 服务器程序的入口是是一个URL,对应一个action
方法,这些action
方法被定义在指定的类里面,这些类被称为控制器controllers
上面例子的controller
的源代码是这样的:
package controllers;
import play.mvc.*;
public class Application extends Controller {
public static void index() {
render();
}
}
- controller 需要继承自
play.mvc.Controller
类,这个类提供很多有用的方法,比如这个例子中使用的render()
方法,使用一个模板成成HTTP响应。
模板templates
是在/app/views 目录下一个简单的文本文件,不指定特定的模板名,Application/index.html
作为默认模板被使用。
app_1/app/views/Aplication/index.html
:
#{extends 'main.html'/}
#{set title :'home'/}
#{welcome/}
这个模板内容看起来内容很少,实际上你看到的都是Play的标签,Play标签类似于JSP的tags。这里使用的#{welcome/}
Tag去生成你在浏览器里看到的welcome信息。
#{extends /}
tag告诉Play此模板继承自另一个名为main.html
的模板,模板的继承是允许你通过重用公共部份创建一个复杂Web页面的一个强大的概念。
打开/app_1/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/javascripts" charset="${_response_encoding}" src="@{'/public/javascrrpts/jquery.min.js}"></script>
#{get 'moreScripts'/}
</head>
<body>
#{doLayout /}
</body>
</html>
- 上面的
#{doLayout/}
标签将会被Application/index.html
替代