playframework--helloworld程序编写 不指定


babo , 2010/01/07 13:43 , 编程语言 , 评论(0) , 阅读(2100) , Via 本站原创 | |

本文参考官方http://www.playframework.org/documentation/1.0/firstapp教程,基本上是翻译

转载请注明http://www.xinlogs.com

在安装完playframework框架后,我们就可以编写一个helloworld程序来看看playframework框架是如何工作的了。

我是在C:盘的当前用户目录下,建立了一个playframework目录。在命令窗口,进入这个目录

在c:usersbaboplayframework目录下输入下面命令,创建项目

复制内容到剪贴板
  1. play new helloworld

然后play框架会提示你输入程序的全名称,这里就输入helloworld即可

play new helloworld会在当前目录下,创建一个helloworld目录,用来保存项目的全部文件。

下面运行我们新创建的项目,进入项目的目录helloworld,输入play run

当看到入上图提示,证明项目已经跑在9000端口等我们访问了。让我们打开浏览器输入http://localhost:9000访问下看看

看到上图显示的默认欢迎界面,说明我们的项目已经成功创建。下面我们看看play框架是如何显示出这个页面的

play框架里,你创建项目以后,程序的入口点在 conf/routes 文件。这个文件定义了程序全部可以被访问的URL地址。如果你打开 conf/routes 文件,你会看到第一个‘route’信息就是如下语句
 

复制内容到剪贴板
  1. GET / Application.index

以上语句,告诉play框架,当web服务器收到一个访问 / 路径的的GET请求,就调用Application.index的java方法。实际上Application.index方法是controllers.Application.index的简写,因为controllers package 已经被import进来。

一个play框架程序的每个URL都会有入口点,我们叫这些方法Action。定义这些方法的类,我们叫做 'controllers'。

下面我们看看 controllers.Application controller。 打开helloworld/app/controllers/Application.java 文件:

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. }

我们可以看到Application的父类是 play.mvc.Controller 类。这个类为controllers提供了很多有用的方法, 像render() 方法,我们用在index action里。

这个index action 被定义为一个 'public static void' 方法. action方法是static的, 因为controller类从来都不会有实例. 总是返回void类型.

默认的index action 很简单: 它调用render() 方法告诉Play框架去返回一个模板页面.用一个模板生成http响应是最常见的方法(但不是就这一个种方法)。

模板是在 /app/views 目录下的一个简单的text文件. 因为我们没有指定一个模板, 所以这个action将用一个默认的模板: Application/index.html

让我们看下模板文件的内容,打开helloworld/app/views/Application/index.html 文件:

XML/HTML 代码复制内容到剪贴板
  1. #{extends 'main.html' /}
  2. #{set title:'Home' /}
  3.  
  4. #{welcome /}

模板的内容看起来很简洁。实际上你看到的全是Play标签。它常接近JSP标签。上面的 #{welcome /}标签,就是生成我们在浏览器看到的默认欢迎页面。

这个#{extends /} 标签告诉Play框架这个模板继承于另外一个叫 main.html的模板文件。模板继承是一个很棒的概念,在用于创建复杂网页的共用部分重用上。

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

 

XML/HTML 代码复制内容到剪贴板
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2.  
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  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"
  8. href="@{'/public/stylesheets/main.css'}" />
  9. <link rel="shortcut icon" type="image/png"
  10. href="@{'/public/images/favicon.png'}" />
  11. </head>
  12. <body>
  13. #{doLayout /}
  14. </body>
  15. </html>

看到#{doLayout /} 标签了吧,它就是Application/index.html 文件内容被插入的位置

创建一个表单

下面我们将从一个可以输入我们名字的表单来开始写我们的程序。

编辑 helloworld/app/views/Application/index.html 模板,如下所示

XML/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 action的URL。现在,刷新下我们的浏览器。

我们得到了一个错误,因为我们引用的 Application.sayHello action不存在。让我们在helloworld/app/controllers/Application.java文件里创建它。

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. }
  14.  
  15. }

我们在action方法里声明了myName参数,它将被自动填充上来自表单提交的HTTP myName 参数。

现在我们在访问http://localhost:9000显示如下

在文本框输入你的名字,然后提交,你会发现一个新的错误。

这个错误显而易见,Play框架调用sayHello action方法的默认模板,但是这个模板不存在。让我们创建helloworld/app/views/Application/sayHello.html文件

XML/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>

然后刷新浏览器页面,显示如下

我们看到了sayHello.html文件里使用了groovy的'?:'操作符。当我们myName没有没有被填充的时候,它默认用'guest'填充myName。

到这里,我们的HelloWorld程序已经可以正常运行了。但是我们还有几个问题需要解决。

如何显示更好的URL,这个对于SEO还是比较重要的。

如何自定义LayOut

如何对输入的字符进行验证

如何自动测试。

后面我们慢慢实现。