标签:
Play framework框架学习文档 1
一、什么是Playframework 3
二、playframework框架的优点 4
三、Play FrameWork开发入门 5
1、准备工作 5
2、新建项目 5
3、环境变量配置 7
4、MVC模型 8
app/controllers 9
app/models 9
app/views 9
5、应用程序布局 9
app目录 9
.class文件在哪儿? 9
public目录 10
conf目录 10
lib目录 10
6、创建简单的helloworld程序 10
运行应用 11
创建FORM 15
提供更好的URL 18
自定义布局 19
添加验证 19
自动化测试 21
Play Framework是一个功能完整的Java Web开发框架。采用RESTful架构设计,简便灵活。Play Framework使用MVC模式作为Web层,集成Hibernate管理持久层,Play Framework还使用一个基于Groovy的模板引擎。
· Play Framework让开发者无须重新编译打包发布应用,即可看到修改后的效果,方便开发人员调试应用。
· Play Framework采用了无状态模型,是一个真正意义上的“无共享”系统,能够在多个服务器上部署多个Play Framework的实例,所有实例都不会互相干扰。
· Play Framework采用了Groovy作为模板引擎,让表示层真正做到了开发高效简洁
· Play Framework拥有精确的错误定位机制,当错误发生的时候,可以精确的定位到错误代码的位置。
· Play Framework的速度很快,启动快,运行的速度也十分快。
注:RESTful架构:REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。
REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful
Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。
另一个重要的 REST 原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。
当 REST 架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST 简化了客户端和服务器的实现。
详细介绍:http://baike.baidu.com/view/5798116.htm
Groovy模块引擎:Groovy是一种新兴的 Java 2 平台语言。Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。目前的 Groovy 版本是 1.6.3,在 Java 1.4 和 Java 5 平台上都能使用,也能在 Java 6 上使用。
Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。注意:不是指Groovy替代java,而是指Groovy和java很好的结合编程
● 是一个基于 Java虚拟机的敏捷 动态语言。
● 构建在强大的Java语言之上 并 添加了从Python,Ruby和Smalltalk等语言中学到的 诸多特征。
● 为Java开发者提供了 现代最流行的编程语言特性,而且学习成本很低(几乎为零)。
● 支持DSL(Domain Specific Languages领域定义语言)和其它简洁的语法,让你的代码变得易于阅读和维护。
● Groovy拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变的非常简单。
● 在开发Web,GUI,数据库或控制台程序时 通过 减少框架性代码 大大提高了开发者的效率。
● 支持单元测试和模拟(对象),可以 简化测试。
● 无缝集成 所有已经存在的 Java对象和类库。
● 直接编译成Java字节码,这样可以在任何使用Java的地方 使用Groovy。
Groovy 的一个好处是,它的语法与 Java 语言的语法很相似。虽然 Groovy 的语法源于 Smalltalk 和 Ruby 这类语言的理念,但是可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。(在这点上,Ruby 与 Groovy 不同,因为它的语法与 Java 语法差异很大。)
许多 Java 开发人员非常喜欢 Groovy 代码和 Java 代码的相似性。从学习的角度看,如果知道如何编写 Java 代码,那就已经了解 Groovy 了。Groovy 和 Java 语言的主要区别是:完成同样的任务所需的 Groovy 代码比 Java 代码更少。(有时候会少很多!)
1) 修改代码及时生效!
编辑java文件,保存,刷新浏览器,即可看到效果!无须编译,部署,重启服务器。
2) 全栈式
集成Hibernate,OpenID,Memcached…还有强大的插件系统,提供了创建一个酷炫的web应用所需要的一切。
3) 无状态模式
4) Play是一个真正的“Share nothing”的系统。适合REST,通过在多台服务器运行同一个应用的多个实例,可以很容易地实现容量扩展。
5) 快速的解决错误
当发生错误时,Play会向你准确展示源代码中产生问题的那一行代码,即使是发生在模板中。
6) 高校的模块系统
一个简单的基于Groovy作为表达式语言的模块系统。它提供了模块的继承,包含和标签的功能。
7) 有趣&高校
帮助你节省等待java应用重启的时间,提高生产效率,更快地完成工程。
8) 异步
基于非阻塞IO模型,允许创建基于长轮询和WebSockets的现代WebSockets的现代Web应用。
9) 纯粹的Java
使用Java进行编码,可以使用任何的Java库,可以使用你喜欢的IDE,可以与eclipse或者netbeans优雅地结合。
官方网站:www.playframework.com下载最新版本的play-1.2.3.zip开发包。将下载的包解压,解压后的路径最好不要包括空格、中文之类的,会导致play命令执行不了的问题。
将下载的play-1.2.3.zip开发包解压并进行环境变量的配置(也可不需要配置环境变量,但要在运行时要完整绝对路径)
打开cmd命令窗口,键入cd play压缩目录,接着输入play new 新建项目名称,
运行项目输入play run 项目名称。
如果没有报错证明项目可以运行,接着输入 play eclipsify 项目名称,才可导入项目到eclipse,
这里的play eclipsify 可简化为 play ec
打开eclipse,导入刚才新建的项目即可。
Path: C:\Program Files\Java\jdk1.6.0_21\bin;
CLASSPATH: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
JAVA_HOME: C:\JDK(jdk安装路径)
Play应用遵循Web架构使用的MVC架构模式。
它将应用分离到不同的层中:表现层(Presentation)和模型层(Model)。表现层进一步分为视图(View)和控制器(Controller)。
· Model 是应用所处理信息的领域表述(Domain-Specific Representation)。绝大多数应用使用持久化机制如数据库存储数据。但是MVC并没有特别提到数据访问层,因为它属于下层,由模型封装。
· View 将模型渲染成适合交互的表单,通常是用户界面。一个模型可有多个不同目的视图。Web应用中,View通常以HTML,XML或JSON形式呈现,也可能是二进制的Chart。
· Controller处理事件(通常是用户动作),并对模型做相应改变。Web应用中,事件通常是HTTP请求:Controller监听HTTP请求,从其中提取数据,如查询字符串参数,请求头,然后改变下层模型对象。
Play将此三层分在app目录下的不同package中。
一个Controller就是一个Java 类,它的静态公共方法则是动作(Action)。动作是接收HTTP请求后的Java处理入口点。Controller类实际是面向过程的,非OO。Action从HTTP请求中提取数据,读或更新Model对象,然后返回一个包装成HTTP响应(HTTP Response)的结果。
Model是一组具有所有OO特性的Java类。包含数据结构和应用可使用的操作。(译注:即充血模型)。支持通过JPA持久化。
应用的视图由Play的模板系统生成。Controller从Model获取数据,然后使用模板呈现它。此package包含HTML,XML等模板文件,用作动态生成模型的表述(Representation)。
包含所有可执行的工件:Java源代码和视图模板。其下有三个标准package,每个代表MVC的一层。你也能添加你自己的包,如示例的utils包。
View pacakge可以在分子packages:
· tags 存储应用的ta。如可重用的模板片段。
· 一个Controller一个view目录,按惯例,每个Controller的相关模板存储在自己的子目录中。
Play在运行时编译Java源代码,并将编译的类缓存在tmp\bytecode目录下。Play应用的可执行工件时.java源文件,不是已编译的.class(译注:包括jar文件)。
存储静态的、由Web服务器直接处理的资源。分为三个子目录:images,stylesheets和javascripts,分别放图片,css和js。
包含应用的所有配置文件。两个必须文件为:
· application.conf: 应用主配置文件,包含所有标准的配置选项。
· routes:url路由规则定义文件。
此目录包含在Java ClassPath中。
存放应用依赖的标准Java类库。此目录自动添加到Java classpath中。
打开CMD,执行:
play new helloworld
Play new 命令在当前路径下创建了一个helloworld目录,其中包含一系列文件和目录,重要的如下:
app/ 包含应用核心,分为models,controllers和views目录。.java生活的地方^_^
conf/包含应用的所有配置。application.conf应用主配置.routes定义url路由规则,messages国际化用。
lib/ 包含应用依赖的标准.jar文件。
public/包含所有外部可访问的资源:js,css和image。
test/包含所有应用的测试程序。测试程序基于JUnit或Selenium。
注:Play要求所有文件必须是UTF-8编码。
等等应用的.class文件在哪儿。恩,Play不使用class文件而是直接读取Java源文件,并使用Eclipse compiler编译他们。
这导致两件重要的事情。首先运行时Play会检查你对源文件所作的变更并自动加载它们。其次,当发生异常时,Play将创建更好的错误报告并附加相关
在cmd中键入play run helloworld,play启动Web Server并监听9000端口
打开浏览器键入http://localhost:9000/,应用显示了一个缺省的欢迎页
现在,看下此页是如何显示的。
应用的主入口点配置在conf/routes文件中。它定义了应用所有可访问的URL。打开routes文件,会看到第一个route:
GET / Application.index
它告诉Play,当/路径收到GET请求后调用Application.indexJava方法。它是controllers.Application.index的缩写,因为controllers包是隐式的附加的。
创建标准Java应用时,通常使用一个入口点即main方法。Play应用则有多个,一个URL一个。这些方法称为action方法。定义action方法的类称为controller。
打开helloworld/app/controllers/Application.java:
package controllers;
import play.*;
import play.mvc.*;
import java.util.*;
import models.*;
public class Application extends Controller {
public static void index() {
render();
}
}
看到Application扩展了play.mvcController类。它提供了所有Controller需要使用的方法,如index动作中使用的render方法。
index方法定义成public static void,因为Controller永远无需实例化和返回值。(译注:为了防止被使用者引入状态,并让Controller自然、干净而如此设计。但副作用是render只能通过throw扔出结果,用异常当GOTO,可谓兵行诡道)。
缺省的index动作调用render方法,通知Play渲染一个模板。模板是app/views目录下一个简单的text文件。此处使用Application/index.html
打开helloworld/app/views/Application/index.html文件:
#{extends ‘main.html‘ /}
#{set title:‘Home‘ /}
#{welcome /}
其中的内容是Play tag,类似JSP taglib.#{welcome/}tag生成了之前看到的欢迎消息。#{extends/}tags告诉Play此模板集成另一个main.html的模板.模板继承可用来创建复杂的web也并重用公共部分。
打开helloworld/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‘}">
#{get ‘moreStyles‘ /}
<link rel="shortcut icon" type="image/png" href="@{‘/public/images/favicon.png‘}">
<script src="@{‘/public/javascripts/jquery-1.4.2.min.js‘}" type="text/javascript" charset="utf-8"></script>
#{get ‘moreScripts‘ /}
</head>
<body>
#{doLayout /}
</body>
</html>
看到#{doLayout/}tag吗?是Application/index.html插入的位置。
编辑helloworld/app/views/Application/index.html模板
#{extends ‘main.html‘ /}
#{set title:‘Home‘ /}
<form action="@{Application.sayHello()}" method="GET">
<input type="text" name="myName" />
<input type="submit" value="Say hello!" />
</form>
我们使用@{…}符号请求Play自动产生调用Application.sayHello动作的方法。刷新浏览器。
Oops,出错了。因为引用了一个不存在的动作。需要在helloworld/app/controllers/Application.java中创建:
package controllers;
import play.mvc.*;
public class Application extends Controller {
public static void index() {
render();
}
public static void sayHello(String myName){
render(myName);
}
}
我们声明了myName参数,它会自动映射到form提交的HTTP请求的myName参数。刷新浏览器。
输入name提交,出现另一个错误.
因为Play渲染此动作的缺省模板时,没有找到它。我们创建文件helloworld/app/views/Application/sayHello.html
#{extends ‘main.html‘ /}
#{set title:‘Home‘ /}
<h1>Hello ${myName ?: ‘guest‘}!</h1>
<a href="@{Application.index()}">Back to form</a>
然后刷新:
看下提交的url:
http://localhost:9000/application/sayhello?myName=chaos
它不够RESTful。因为Play通过缺省规则捕获了此URL
* /{controller}/{action} {controller}.{action}
可以编辑helloworld/conf/routes文件在缺省规则前添加一条规则,提供更自然的hello url
GET /hello Application.sayHello
可以修改模板更改布局。编辑helloworld/app/views/main.html文件:
给form添加一个验证,要求name字段必填。我们通过Play validation实现。编辑helloworld/app/controllers/Application.java,在sayHello action处:
public static void sayHello(@Required String myName) {
if (validation.hasErrors()) {
flash.error("Oops, please enter your name!");
index();
}
render(myName);
}
并import play.data.validation.*。@Required告诉Play自动检查myName字段是否填写。如果验证失败,我们加入一条消息到flash scope中并重定向到index动作。flash scope允许在重定向时保持消息。
编辑helloworld/app/views/Application/index.html显示错误消息
#{extends ‘main.html‘ /}
#{set title:‘Home‘ /}
#{if flash.error}
<p style="color:#c00">
${flash.error}
</p>
#{/if}
<form action="@{Application.sayHello()}" method="GET">
<input type="text" name="myName" />
<input type="submit" value="Say hello!" />
</form>
输入空参数并提交,OK起作用了。
Selenium Test
在测试模式下运行应用。在cmd中输入play test helloworld。
打开浏览器,输入http://localhost:9000/@tests启动测试器。
执行测试
Selenium测试用例通常写成一个html文件。Play使用Play模板引擎生成这些文件。helloworld/test/Application.test.html文件:
*{ You can use plain selenium command using the selenium tag }*
#{selenium}
// Open the home page, and check that no error occured
open(‘/‘)
assertNotTitle(‘Application error‘)
#{/selenium}
此测试打开home页,确认响应中没有“Application error”。
让我们来编写自己的测试。编辑测试内容:
*{ You can use plain selenium command using the selenium tag }*
#{selenium}
// Open the home page, and check that no error occurred
open(‘/‘)
assertNotTitle(‘Application error‘)
// Check that it is the form
assertTextPresent(‘The Hello world app.‘)
// Submit the form
clickAndWait(‘css=input[type=submit]‘)
// Check the error
assertTextPresent(‘Oops, please enter your name!‘)
// Type the name and submit
type(‘css=input[type=text]‘, ‘bob‘)
clickAndWait(‘css=input[type=submit]‘)
// Check the result
assertTextPresent(‘Hello bob!‘)
assertTextPresent(‘The Hello world app.‘)
// Check the back link
clickAndWait(‘link=Back to form‘)
// Home page?
assertTextNotPresent(‘Hello bob!‘)
#{/selenium}
重新执行
详见:http://www.playframework.com/documentation/1.2.3/firstapp
注:app里controllers里的所有.java文件里的所有方法名必须与View文件里的所有.html文件名一样,不然就要指定html文件名,如:render("User/userList.html", pageObject);proObject是对象名。
2013 最新的 play web framework 版本 1.2.3 框架学习文档整理
标签:
原文地址:http://www.cnblogs.com/zhiji6/p/4444662.html