`
schy_hqh
  • 浏览: 552564 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(一)play之入门篇

 
阅读更多

  准备工作

首先下载play  http://www.playframework.com/download

解压到任意目录,将play根目录加入到系统的PATH环境变量中

【play解压目录中没有bin目录,直接指定解压目录到Path中即可,也可设置一个PLAY_HOME,然后在Path中引用】

jdk1.6以上

命令:play version  查看play版本

 

play本地文档 http://localhost:9000/@documentation

 

Begin

使用play自动创建项目,将生成一个整体的play项目的基础框架出来

注意:不要将自动创建的项目指定到Eclipse的workspace目录中!否则将破坏eclipse的工作环境!

 创建一个项目:play new 项目名称 

CMD切换到项目路径下,如:cd E:\technology-hqh\proj\play-framework

切换到E盘下的proj/play-framework目录下

在该目录中创建play项目,使用命令:play new Demo

这样,就自动创建好了一个play的项目,项目名称为Demo!

 

项目结构



 

运行刚创建好的项目

E:\technology-hqh\proj\play-framework>play run Demo

项目启动后,将监听9000端口

 

访问项目

http://localhost:9000 显示Play的欢迎界面,解释了程序是如何跳转到这个页面的

 

 将play应用转换为eclipse工程项目

play eclipsify Demo

Eclipse中通过 File/Import/General/Existing project
这样,就能通过Eclipse导入项目了!

项目的wokespace另外指定,不要将eclipse使用的workspace指向play所创建的项目目录!

 

程序执行流程分析 

1.程序入口 conf/routes

GET     /                                       Application.index

告诉Play,当服务器收到来自于/路径的GET请求时要调用Application.index的方法。

 Application.index是controllers.Application.index简写,因为controllers包是隐式附加的!

 

2.控制器 app/controllers

Play程序有多个入口方法,每个URL就有一个。这些方法称为action方法。

定义Action方法的类称为controller。

package controllers;

import play.*;
import play.mvc.*;

import java.util.*;

import models.*;

public class Application extends Controller {

    public static void index() {
        render();
    }

}

 

controller 类继承于play.mvc.Controller类,这个类提供了许多controller需要的方法,比如在index action中的render方法。

index action定义为public static void,因为controller类不需要实例化和返回值。

缺省的index动作调用render方法,通知Play渲染一个模板。

使用模板是返回HTTP响应的一个最通用的方式。

模板是在/app/views 目录下的简单文本文件。

模板是app/views目录下一个简单的text文件。

因为这里没有指定一个模板,index action会使用一个默认的模板:Application/index.html。

 

3.模板 app/views

#{extends 'main.html' /}
#{set title:'Home' /}

#{welcome /}

 

#{extends /} tag 表示这个模板继承于main.html这个模板。

模板继承可用来创建复杂的web和重用公共部分。

 #{welcome /} tag会在浏览器中生成欢迎信息。

 

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 src="@{'/public/javascripts/jquery-1.6.4.min.js'}" type="text/javascript" charset="${_response_encoding}"></script>
        #{get 'moreScripts' /}
    </head>
    <body>
        #{doLayout /}
    </body>
</html>

 #{doLayout /}tag表示index.html插入内容的地方。

 

请求生命周期

Play是完全无状态的(stateless),且仅面向请求-应答(Request-Response)。所有请求遵循相同路径:

  1. 框架收到一个HTTP请求
  2. Router匹配请求和Controller、Action,执行动作方法。
  3. 应用代码执行
  4. 绘制模型,呈现视图
  5. 动作的结果作为HTTP响应返回。 

开发生命周期

使用Play开发时没有编译,打包和部署这些阶段。

代之两个不同环境:用于开发阶段的DEV模式和用户部署阶段的PROD模式。

Java源代码在运行时编译和加载,如果Java源文件在应用运行时发生改变,代码会重新编译并热加载(hot-swapped)到JVM中。模板文件也是如此。

 

关于DEV/PROD模式

通过application.mode配置属性切换DEV或PROD。

DEV模式下,Play会检查并在必要时热加载。

application.mode=dev

PROD模式为产品做了优化:Java源文件和模板仅编译一次。

prod.application.mode=prod

 

 

 

创建Form

编辑Demo\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方法。 

 

刷新浏览器

 
 上图提示出错了,原因:引用了一个不存在的动作!

 

在Application.java中创建sayHello()

package controllers;

import play.*;
import play.mvc.*;

import java.util.*;

import models.*;

public class Application extends Controller {

    public static void index() {
        render();
    }
    

    //play将根据form表单的action属性调用sayHello()!        
    public static void sayHello(String myName) {
    	render(myName);
    }

}

 

 刷新页面



 

文本域中输入name并提交



   又提示另一个错误



 

play.exceptions.TemplateNotFoundException: Template not found : Application/sayHello.html
由于Play渲染此动作的缺省模板(sayHello.html)时,没有找到它。

 

创建模板文件Demo/app/views/Application/sayHello.html

#{extends 'main.html' /}
#{set title:'Home' /}

<h1>Hello ${myName ?: 'Guest'}!</h1>
<a href="@{Application.index()}">Back to form</a>

 

 重新输入name并提交


 

表单提交方式使用GET,路径:http://localhost:9000/application/sayhello?myName=Sail
Play 通过缺省规则对此路径进行捕获并解析

# Catch all
*       /{controller}/{action}                  {controller}.{action}

              /application/sayhello                                                      Application.sayHello()

如果表单的action指向 Application.sayHello(),则地址栏显示为/application/sayhello
 
 

定制Rest风格的路径

在Demo\conf\routes文件的缺省规则前面,加上一行

#Rest style URI ---add by hqh
GET     /hello                                  Application.sayHello

 即,如果form表单的action为Application.sayHello,则浏览器地址栏将以hello来标识路径!

 

 重新提交表单

 

 

以Rest风格显示路径

http://localhost:9000/hello?myName=Sail+Huang

 

 

 

 自定义布局

修改main.html或者创建其它模块文件,然后继承它!

 

 

 

 添加验证

给form添加一个验证,要求name字段必填

编辑Demo\app\controllers\Application.java

package controllers;

import play.*;
import play.data.validation.Required;
import play.mvc.*;

import java.util.*;

import models.*;

public class Application extends Controller {

    public static void index() {
        render();
    }
    
    //@Required 方法参数不能为空
    public static void sayHello(@Required String myName) {
    	//检查参数是否为空
    	if(validation.hasErrors()) {
    		//提示错误信息,返回到页面共用户参考
    		flash.error("please enter your name!");
    	}
    	render(myName);
    }
    

}
@Required告诉Play自动检查myName字段是否填写。如果验证失败,加入一条消息到flash scope中并重定向到index动作。flash scope允许在重定向时保持消息。

 

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

打开浏览器,输入http://localhost:9000/@tests启动测试器

 
 
执行测试


 
Selenium测试用例通常写成一个html文件。

Demo/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}

 

编写自己的测试。编辑测试内容:

注意:每一步测试都是基于前一步测试的结果进行的!逻辑性强!

*{ You can use plain selenium command using the selenium tag }*

#{selenium}
	// Open the home page, and check that no error occured
	//测试打开home页,确认响应中没有 "Application error"
	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
	//name参数为空,应该提示什么错误信息    
	assertTextPresent('please enter your name!')        

	// Type the name and submit
	//给name参数赋值并提交表单    
	type('css=input[type=text]', 'bob')    
	clickAndWait('css=input[type=submit]')        

	// Check the result
	//检查提交后的结果应该出现的内容    
	assertTextPresent('The Hello world app!')        
	assertTextPresent('Hello bob!')    

	// Check the back link
	//使用超链接进行页面跳转    
	clickAndWait('link=Back to form')       
	 
	// Home page? 
	//页面跳转后,新页面中没有刚才的结果:'Hello bob!')  
	assertTextNotPresent('Hello bob!')
#{/selenium}

 

 重新执行测试

点击selenium test下面的Application,再点击Start !






 

  • 大小: 45.2 KB
  • 大小: 45.2 KB
  • 大小: 10.4 KB
  • 大小: 11.9 KB
  • 大小: 40.6 KB
  • 大小: 12.8 KB
  • 大小: 18.4 KB
  • 大小: 11.4 KB
  • 大小: 15.7 KB
  • 大小: 12 KB
  • 大小: 17.1 KB
  • 大小: 12.8 KB
  • 大小: 38.9 KB
  • 大小: 82.2 KB
  • 大小: 44.2 KB
  • 大小: 127 KB
  • 大小: 100.6 KB
  • 大小: 48.3 KB
分享到:
评论

相关推荐

    AndEngine入门篇

    本入门篇将带你了解AndEngine的基本概念、架构以及如何开始你的第一个AndEngine项目。 一、AndEngine概述 AndEngine是一个开源的Java库,完全免费,它提供了基本的游戏逻辑、动画处理、物理模拟等功能。其核心优势...

    play1的文档资料

    "Play Framework 学习笔记(一):初识Play"和"Play Framework 开发入门"为初学者提供了入门指导,涵盖了框架的基本概念和基本操作。"Play! Framework试用手记"则分享了实际使用过程中的经验和心得。 6. **论坛...

    play_a_ball.zip

    本篇文章将深入探讨如何使用Python的Pygame模块来编写一个简单的“玩一个球”游戏。游戏包含了代码实现、所需图像和音频资源,读者可以下载"play_a_ball.zip"压缩包,解压后直接运行,体验游戏的乐趣。 Pygame是...

    Play Framework Cookbook.pdf

    《Play Framework Cookbook》是一本非常实用的参考书籍,不仅适合初学者入门,也适合有经验的开发者深入学习 Play Framework 的高级特性和最佳实践。通过本书的学习,开发者可以全面掌握 Play Framework 的各个方面...

    wps之编程入门.pdf

    【标题】:WPS编程入门基础 【描述】:本文档是关于...无论是初学者还是有一定经验的用户,都可以从这篇WPS编程入门教程中获益。通过实践和不断探索,你会发现编程的乐趣和实用性,为日常的办公工作带来极大的便利。

    android入门学习资料

    Android作为全球最受欢迎的智能手机操作系统之一,吸引着众多开发者投入其怀抱。本套学习资料旨在帮助初学者快速掌握Android开发的基本技能,内容涵盖Android开发中文文档以及一系列由eoeAndroid推出的特刊,为您的...

    新版Android开发教程笔记--基础入门一

    这篇新版的Android开发教程笔记将带你进入Android编程的世界,从最基础的入门概念开始讲解。本文主要围绕以下几个关键知识点展开: 1. **Android SDK(软件开发工具包)**:Android SDK是开发者进行Android应用开发...

    Android入门及参考手册.chm

    这份手册分为初级篇、入门篇和进阶篇,覆盖了Android开发的各个阶段,从最基础的环境搭建到复杂的系统优化。 **初级篇** 主要针对完全没有接触过Android开发的新手,讲解了以下知识点: 1. **Android简介**:介绍...

    制作App的入门教程

    这篇教程将带你步入App开发的大门,从基础概念到实际操作,一步步教你如何创建属于自己的App。 一、了解App开发环境 1. 开发平台选择:首先,你需要决定在哪个平台上开发App,主流的选择有iOS(使用Swift或...

    Xamarin 跨平台入门指南

    这篇入门指南详细介绍了如何使用Xamarin进行跨平台开发,从理论基础到实操流程,为初学者提供了一个全面的指导。 首先,文档概述了构建跨平台移动应用程序的基本要求,包括对移动开发和移动软件开发生命周期的介绍...

    SuperData2014年拉美数字游戏市场报告

    C#资料合辑一[C#入门篇] http://download.csdn.net/album/detail/669 [Csharp高级编程(第6版)](共8压缩卷) http://download.csdn.net/album/detail/667 10个[精品资源]Java学习资料合辑[一] ...

    Java手机程式设计入门

    本篇文章将深入探讨Java在手机程式设计中的基础知识,帮助初学者快速入门。 一、Java语言基础 Java是一种面向对象的编程语言,以其“一次编写,到处运行”的特性而闻名。学习Java手机程式设计,首先要掌握Java的...

    ActionScript 3.0入门教程ppt,二讲

    【ActionScript 3.0 入门教程】深入解析 ActionScript 3.0 是Adobe Flash平台上用于构建富互联网应用(RIA)的核心编程语言。在本篇教程中,我们将聚焦于ActionScript 3.0的基础知识,特别是动态文本和交互式按钮的...

    黑马程序员Flutter入门教程之观影App开发

    【标题】"黑马程序员Flutter入门教程之观影App开发"涵盖了使用Flutter框架开发移动应用程序的基础知识。Flutter是由Google推出的开源UI工具包,用于构建高性能、高保真度的原生iOS和Android应用。在这个教程中,你将...

    Android入门小结

    这篇博客主要总结了Android开发的基础知识,旨在帮助新接触这一领域的开发者快速上手。 一、Android系统架构 Android系统由Linux内核、运行库、应用程序框架和应用程序四部分组成。Linux内核提供了硬件抽象层,运行...

    Android Studio APP开发入门

    这篇“Android Studio APP开发入门”教程,将引领初学者逐步踏入Android应用程序的制作殿堂。 首先,我们需要了解Android Studio的安装与配置。在Windows、Mac或Linux系统上,下载适合自己操作系统的安装包,然后...

    android widget入门教程

    这篇教程将带你深入了解Android小部件的开发过程,从基础概念到实际应用。 首先,我们要明白Android小部件(Widgets)与普通的Activity或Fragment不同,它们是轻量级的UI组件,通常用于显示静态或动态的数据,如...

Global site tag (gtag.js) - Google Analytics