2013 最新的 play web framework 版本 1.2.3 框架学习文档整理

Play framework框架学习文档

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

 

一、什么是Playframework

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 代码更少。(有时候会少很多!)

二、playframework框架的优点

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优雅地结合。

三、Play FrameWork开发入门

1、准备工作

官方网站:www.playframework.com下载最新版本的play-1.2.3.zip开发包。将下载的包解压,解压后的路径最好不要包括空格、中文之类的,会导致play命令执行不了的问题。

2、新建项目

将下载的play-1.2.3.zip开发包解压并进行环境变量的配置(也可不需要配置环境变量,但要在运行时要完整绝对路径)

打开cmd命令窗口,键入cd play压缩目录,接着输入play new 新建项目名称,

技术分享

运行项目输入play run 项目名称。

技术分享

如果没有报错证明项目可以运行,接着输入 play eclipsify 项目名称,才可导入项目到eclipse,

 

这里的play eclipsify 可简化为 play ec

 

打开eclipse,导入刚才新建的项目即可。

 

 

3、环境变量配置

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安装路径)

4、MVC模型

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中。

app/controllers

一个Controller就是一个Java 类,它的静态公共方法则是动作(Action)。动作是接收HTTP请求后的Java处理入口点。Controller类实际是面向过程的,非OO。Action从HTTP请求中提取数据,读或更新Model对象,然后返回一个包装成HTTP响应(HTTP Response)的结果。

app/models

Model是一组具有所有OO特性的Java类。包含数据结构和应用可使用的操作。(译注:即充血模型)。支持通过JPA持久化。

app/views

应用的视图由Play的模板系统生成。Controller从Model获取数据,然后使用模板呈现它。此package包含HTML,XML等模板文件,用作动态生成模型的表述(Representation)。

5、应用程序布局

app目录

包含所有可执行的工件:Java源代码和视图模板。其下有三个标准package,每个代表MVC的一层。你也能添加你自己的包,如示例的utils包。

View pacakge可以在分子packages:

· tags 存储应用的ta。如可重用的模板片段。

· 一个Controller一个view目录,按惯例,每个Controller的相关模板存储在自己的子目录中。

.class文件在哪儿?

Play在运行时编译Java源代码,并将编译的类缓存在tmp\bytecode目录下。Play应用的可执行工件时.java源文件,不是已编译的.class(译注:包括jar文件)。

public目录

存储静态的、由Web服务器直接处理的资源。分为三个子目录:images,stylesheets和javascripts,分别放图片,css和js。

conf目录

包含应用的所有配置文件。两个必须文件为:

· application.conf: 应用主配置文件,包含所有标准的配置选项。

· routes:url路由规则定义文件。

此目录包含在Java ClassPath中。

lib目录

存放应用依赖的标准Java类库。此目录自动添加到Java classpath中。

 

6、创建简单的helloworld程序

打开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插入的位置。

创建FORM

编辑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

看下提交的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是对象名。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。