zoukankan      html  css  js  c++  java
  • 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 新建项目名称,

    t1

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

    t2

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

    这里的play eclipsify 可简化为 play ec

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

    3、环境变量配置

    Path: C:Program FilesJavajdk1.6.0_21in;

    CLASSPATH: .;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.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源代码,并将编译的类缓存在tmpytecode目录下。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是对象名。

  • 相关阅读:
    [YTU]_2536( C++ 长方体继承自矩形)
    [YTU]_2560(C++继承(改错题))
    [YTU]_2532(投简历)
    [YTU]_2621(B 继承 圆到圆柱体)
    stl
    noip2008双栈排序
    倍增入门水题
    noip模拟【ping】
    dp入门(LIS,LCS)
    【Luogu 1799】数列
  • 原文地址:https://www.cnblogs.com/zhiji6/p/4444662.html
Copyright © 2011-2022 走看看