Play Framework介绍:Hello World

开发 后端
Play!是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引擎,以及建立一个现代Web应用所需的所有东西。

本文翻译自官网。原文见:http://www.playframework.org/documentation/1.1.1/firstapp

Play是一个Rails风格的Java Web框架。先上官网的Hello World,感觉下。运行环境,我换成了Windows ^_^

准备

安装 Java 5 以上版本及Play。安装指导见:http://www.playframework.org/documentation/1.1.1/install

项目创建

打开CMD,执行:

play new helloworld

image

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端口

image

打开浏览器键入http://localhost:9000,应用显示了一个缺省的欢迎页

image

现在,看下此页是如何显示的。

应用的主入口点配置在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:

  1. package controllers;  
  2.  
  3. import play.*;  
  4. import play.mvc.*;  
  5.  
  6. import java.util.*;  
  7.  
  8. import models.*;  
  9.  
  10. public class Application extends Controller {  
  11.  
  12.     public static void index() {  
  13.         render();  
  14.     }  
  15.  

 

看到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文件:

  1. #{extends 'main.html' /}  
  2. #{set title:'Home' /}  
  3.  
  4. #{welcome /} 

 

其中的内容是Play tag,类似JSP taglib.#{welcome/}tag生成了之前看到的欢迎消息。#{extends/}tags告诉Play此模板集成另一个main.html的模板.模板继承可用来创建复杂的web也并重用公共部分。

打开helloworld/app/views/main.html模板

  1. <!DOCTYPE html> 
  2.  
  3. <html> 
  4.     <head> 
  5.         <title>#{get 'title' /}</title> 
  6.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  7.         <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}"> 
  8.         #{get 'moreStyles' /}  
  9.         <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}"> 
  10.         <script src="@{'/public/javascripts/jquery-1.4.2.min.js'}" type="text/javascript" charset="utf-8"></script> 
  11.         #{get 'moreScripts' /}  
  12.     </head> 
  13.     <body> 
  14.         #{doLayout /}  
  15.     </body> 
  16. </html> 

 

看到#{doLayout/}tag吗?是Application/index.html插入的位置。

 

#p#

创建FORM

编辑helloworld/app/views/Application/index.html模板

  1. #{extends 'main.html' /}  
  2. #{set title:'Home' /}  
  3.    
  4. <form action="@{Application.sayHello()}" method="GET">  
  5.     <input type="text" name="myName" />   
  6.     <input type="submit" value="Say hello!" />  
  7. </form> 

 

我们使用@{…}符号请求Play自动产生调用Application.sayHello动作的方法。刷新浏览器。

image

Oops,出错了。因为引用了一个不存在的动作。需要在helloworld/app/controllers/Application.java中创建:

  1. package controllers;  
  2.  
  3. import play.mvc.*;  
  4.  
  5. public class Application extends Controller {  
  6.  
  7.     public static void index() {  
  8.         render();  
  9.     }  
  10.       
  11.     public static void sayHello(String myName){  
  12.         render(myName);  
  13.     }  

 

我们声明了myName参数,它会自动映射到form提交的HTTP请求的myName参数。刷新浏览器。

image

输入name提交,出现另一个错误.

image

因为Play渲染此动作的缺省模板时,没有找到它。我们创建文件helloworld/app/views/Application/sayHello.html

  1. #{extends 'main.html' /}  
  2. #{set title:'Home' /}  
  3.  
  4. <h1>Hello ${myName ?: 'guest'}!</h1>  
  5.    
  6. <a href="@{Application.index()}">Back to form</a> 

 

然后刷新:

image

提供更好的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

 

image

#p#

自定义布局

可以修改模板更改布局。编辑helloworld/app/views/main.html文件:

image

添加验证

给form添加一个验证,要求name字段必填。我们通过Play validation实现。编辑helloworld/app/controllers/Application.java,在sayHello action处:

  1. public static void sayHello(@Required String myName) {  
  2.         if (validation.hasErrors()) {  
  3.             flash.error("Oops, please enter your name!");  
  4.             index();  
  5.         }  
  6.         render(myName);  
  7.     } 

 

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

编辑helloworld/app/views/Application/index.html显示错误消息

  1. #{extends 'main.html' /}  
  2. #{set title:'Home' /}  
  3.    
  4. #{if flash.error}  
  5.     <p style="color:#c00">  
  6.         ${flash.error}  
  7.     </p>  
  8. #{/if}  
  9.  
  10. <form action="@{Application.sayHello()}" method="GET">  
  11.     <input type="text" name="myName" />   
  12.     <input type="submit" value="Say hello!" />  
  13. </form> 

 

输入空参数并提交,OK起作用了。

image

自动化测试

Selenium Test

在测试模式下运行应用。在cmd中输入play test helloworld。

image

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

image

执行测试

image

Selenium测试用例通常写成一个html文件。Play使用Play模板引擎生成这些文件。helloworld/test/Application.test.html文件:

  1. *{ You can use plain selenium command using the selenium tag }*  
  2.  
  3. #{selenium}  
  4.     // Open the home page, and check that no error occured  
  5.     open('/')  
  6.     assertNotTitle('Application error')  
  7. #{/selenium} 

此测试打开home页,确认响应中没有“Application error”。

让我们来编写自己的测试。编辑测试内容:

  1. *{ You can use plain selenium command using the selenium tag }*  
  2.  
  3. #{selenium}  
  4.     // Open the home page, and check that no error occurred  
  5.     open('/')  
  6.     assertNotTitle('Application error')  
  7.       
  8.     // Check that it is the form  
  9.     assertTextPresent('The Hello world app.')  
  10.       
  11.     // Submit the form  
  12.     clickAndWait('css=input[type=submit]')  
  13.       
  14.     // Check the error  
  15.     assertTextPresent('Oops, please enter your name!')  
  16.       
  17.     // Type the name and submit  
  18.     type('css=input[type=text]''bob')  
  19.     clickAndWait('css=input[type=submit]')  
  20.       
  21.     // Check the result  
  22.     assertTextPresent('Hello bob!')  
  23.     assertTextPresent('The Hello world app.')  
  24.       
  25.     // Check the back link  
  26.     clickAndWait('link=Back to form')  
  27.       
  28.     // Home page?  
  29.     assertTextNotPresent('Hello bob!')  
  30. #{/selenium} 

重新执行

image

 

 

原文链接:http://www.cnblogs.com/Chaos/archive/2011/04/16/2018361.html

【编辑推荐】

  1. Play Framework介绍:主要概念
  2. Java堆内存的10个要点
  3. “Java已死”简史
  4. Play!在云端:Java PaaS平台入门
  5. JavaFX 2.0.3发布 带来两个全新文档
责任编辑:林师授 来源: Chaos的博客
相关推荐

2012-02-24 09:53:24

JavaPlay Framew

2012-02-20 14:20:44

JavaPlay Framew

2009-07-30 13:21:17

Scala入门Hello World

2012-03-14 12:29:55

JavaPlay Framwo

2012-02-22 16:06:42

2012-02-24 10:57:43

2012-02-20 14:41:30

JavaPlay Framew

2012-02-22 17:23:51

JavaPlay Framew

2012-02-23 13:13:00

JavaPlay Framew

2014-12-19 10:07:10

C

2017-11-23 17:45:46

Yii框架IntelYii框架深度剖析

2012-03-14 09:29:00

Play framewJava

2012-02-23 13:48:16

JavaPlay Framew

2023-01-06 08:18:44

2009-08-11 10:32:23

什么是Groovy

2023-09-04 07:30:03

Wasm汇编语言

2009-09-16 17:15:19

OSGi Bundle

2011-06-08 14:39:06

Qt 教程

2012-02-23 12:53:40

JavaPlay Framew

2023-05-23 08:01:10

Netty网络通信
点赞
收藏

51CTO技术栈公众号