作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

我上一章总结了Play框架的基本使用。这一章里,我将修改和增加响应。

HTTP协议是按照“请求-响应”的方式工作。Play框架的核心是用动作(Action)来完成“请求-响应”。一个动作负责处理一种请求。一个项目可能要定义许多动作。复杂的网站,可能要定义上百个动作。所以,Play使用控制器(Controller)和URL路由(URL routing)来组织管理动作。控制器用于给动作分类。URL路由(routes)记录了URL和动作的对应关系。

IDE

在开发代码之前,先简单介绍如何使用Eclipse,开发Play项目。

在项目的根目录下,使用命令:

play eclipse

成功后,打开Eclipse,在File->Import中,选择General->Existing Projects into Workspace。在Select root directory中,选择项目的根目录。随后,项目被引入Eclipse。

Java是静态语言,可以在编译时就决定对象的类型,因此能方便的实现代码自动提示补齐、自动寻找类所在的包并import。在写程序的过程中,也能有很多友好提示。

后面的代码中,如果没有写明import的包,可以在Eclipse环境下自动寻找。

理解响应

我先来介绍控制器和URL路由。我以Play默认生成的动作为例讲解。你可以在Play项目中找到下面文件。

一个请求进入服务器后,由URL路由引导到正确的动作来处理。URL路由根据请求的方法和URL来识别这一请求,再寻找对应动作。

URL路由是一个文件,即项目根目录下的conf/routes。文件的每一行是一条记录,规定了某个URL的对应动作。比如:

# Home page
GET / controllers.Application.index()

#开始的行是注释

记录分为三个部分。第一部分为请求的方法,第二个部分为请求的URL,第三个是请求的对应动作。这里Application是一个控制器,位于app/controllers/Application.java中。一个控制器也是一个Java类。而动作index()是类的一个方法。

我对默认生成的Application.java略作修改。新的app/controllers/Application.java为:

package controllers;

import play.*;
import play.mvc.*; import views.html.*; public class Application extends Controller { public static Result index() {
return ok("Hello World!");
} }

可以注意到,作为控制器的Application,需要继承自Controller类。

一个动作必须是一个静态(static)的方法。一个动作返回一个Result类型的对象。ok("Hello World!")返回的就是这么一个Result对象,代表了一个HTTP响应。ok()返回的响应都是200状态,即ok(正常回复)。在这个例子中,响应的主体内容为"Hello World!"。

你可以启动Play服务器,访问上面的URL(localhost:9000/)。使用Chrome的network工具监视回复。页面如下:

根据network工具的监视,响应的状态码为200。响应的类型为text/plain。这是ok()生成Result对象时自动决定的。我可以手动控制响应类型,比如将index()的返回语句改为:

return ok("Hello World!").as("text/html");

这样,响应的主体类型为html。

其它状态的响应

除了ok()之外,Play还提供了其他的一些便捷方法,用以生成不同状态的响应。这些方法的名字和状态的名字相同,比如:

return badRequest("bad request"); // 400, 坏请求
return unauthorized("You are forbidden"); // 401, 未授权
return redirect("/new"); // 303, 重新定向

这些方法返回对应的状态码。浏览器根据状态码和回复的内容,做出反应。比如收到303时,重新定向到新的URL。

此外,我还可以直接使用status()来说明数字形式的状态码

return status(200, "good");

更多的响应生成方式可参考Results

练习

在上面的控制器Application中,增加一个新的动作,用于显示

<p>See you!</p>

修改routes,并验证效果。

URL路由

URL路由是由一行一行的记录组成的。上面我们看到了GET方法,还可以是其它HTTP方法,比如POST:

POST    /somePost                   controllers.Application.somePost()

我要在Application类中增加somePost()动作来处理该请求,比如:

public static Result somePost() {
return ok("posted");
}

POST方法常用于向服务器提交数据。我将在以后深入。

url还可以有用户定义的变量,从而让一行记录对应不止一个请求,比如:

GET    /record/:id            controllers.Application.record(id: Long)

上面的:id是一个名为id的变量。":"是一个提示符。id将从":"开始,直到结束或者另一个"/"。

当我们访问/record/1234时,id就是1234。对应的动作包含有一个参数,来接收id变量。我这里把参数类型定义为Long。Play将负责类型的转换。

相应的record()动作为:

public static Result record(Long id) {
return ok("record:" + id.toString());
}

可以看到,该动作与之前的动作有点不一样,它接受一个参数,即来自url的变量。

除了":"之外,还有另一个提示符"*"。与":"不同,"*"表示的区间不受"/"限制。

GET    /newRecord/*name           controllers.Application.newRecord(name: String)

如果我们访问/newRecord/abc/def,那么name将对应字符串"abc/def"

总结

动作、控制器、URL路由

ok()

欢迎继续阅读“Java快速教程”系列文章

来玩Play框架02 响应的更多相关文章

  1. 4-3 Spring MVC框架-02

    Spring MVC框架-02 Ⅰ.RESTful基础 是一种设计风格和开发方式 1.get和post请求区别: get post 获取请求 上传请求 请求参数在地址栏URL 请求参数在请求体里面 U ...

  2. Pizza Pie Charts – 基于 Snap SVG 框架的响应式饼图

    Pizza Pie Charts 是一个基于 Adobe 的 Snap SVG 框架的响应式饼图插件.它着重于集成 HTML 标记和 CSS,而不是 JavaScript 对象,当然Pizza Pie ...

  3. Java自动化测试框架-02 - TestNG之理论实践 - 纸上得来终觉浅,绝知此事要躬行(详细教程)

    理论 TestNG,即Testing, NextGeneration,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用 ...

  4. Django框架02 /Django下载安装、url路由分发

    Django框架02 /Django下载安装.url路由分发 目录 Django框架02 /Django下载安装.url路由分发 1. django下载安装 2. pycharm创建项目 3. 基于D ...

  5. Java自动化测试框架-02 - TestNG之理论到实践

    TestNG,即Testing, NextGeneration,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用来做集 ...

  6. 来玩Play框架01 简介

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 说到网络框架,Ruby的Ruby on Rail和Python的Django都相当 ...

  7. 来玩Play框架07 静态文件

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Play框架的主要功能是提供动态响应的内容.但一个网络项目中必然有大量的静态内容, ...

  8. 前端框架bootstrap(响应式布局)入门

    Bootstrap,是基于HTML,CSS.javascript的前端框架 该框架已经预定义了一套CSS样式和与样式相对应的js代码(对应的样式有对应的特效.) 开发人员只需要编写HTML结构,添加b ...

  9. SpringMVC框架02——SpringMVC的Controller详解

    1.基于注解的控制器 1.1.@Controller 注解类型 在SpringMVC中使用org.springframework.stereotype.Controller注解类型声明某类的实例是一个 ...

随机推荐

  1. 【uwp】浅谈China Daily 中划词翻译的实现

    学习uwp开发也有一段时间了,最近上架了一个小应用(China Daily),现在准备将开发中所学到的一些东西拿出来跟大家分享交流一下. 先给出应用的下载链接:China Daily , 感兴趣的童鞋 ...

  2. 真正的汉化-PowerDesigner 16.5 汉化

    一.背景 经常使用PowerDesigner,之前使用15版本,后来16出来后,就一直在使用16,不过一直是英文.一些同事对使用英文版总显示有些吃力. 遍寻百度.必应,都没有找到真正的针对版本16的汉 ...

  3. mono-3.4.0 源码安装时出现的问题 [do-install] Error 2 [install-pcl-targets] Error 1 解决方法

    Mono 3.4修复了很多bug,继续加强稳定性和性能(其实Mono 3.2.8 已经很稳定,性能也很好了),但是从http://download.mono-project.com/sources/m ...

  4. C#分布式消息队列 EQueue 2.0 发布啦

    前言 最近花了我几个月的业余时间,对EQueue做了一个重大的改造,消息持久化采用本地写文件的方式.到现在为止,总算完成了,所以第一时间写文章分享给大家这段时间我所积累的一些成果. EQueue开源地 ...

  5. C#与C++的发展历程第一 - 由C#3.0起

    俗话说学以致用,本系列的出发点就在于总结C#和C++的一些新特性,并给出实例说明这些新特性的使用场景.前几篇文章将以C#的新特性为纲领,并同时介绍C++中相似的功能的新特性,最后一篇文章将总结之前几篇 ...

  6. 使用R画地图数据

    用R画地图数据 首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf.bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下. ...

  7. springmvc的图片上传与导出显示

    1.前端文件上传需要在form表单内添加enctype="multipart/form-data" ,以二进制传递: 2.web.xml文件内配置 <servlet-mapp ...

  8. 【MSP是什么】MSP认证之项目群管理学习总结

    首先要说的是,我这篇体会是针对一定的背景的,不能算是一种通用的管理方式,只能是我自己的经验总结,能给大家平常的管理提供一点思路,我就很满足了.先说说背景,我所在公司做的是大型桌面应用软件,简单点说就是 ...

  9. TODO:Github的使用技巧之同步代码

    TODO:Github的使用技巧之同步代码 GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub. GitHub 于 2008 年 ...

  10. ASP.NET AntiXSS的作用

    XSS跨站脚本攻击        是指用户输入HTML编码对网站进行跨站攻击.            通过使用FCKeditor.FreeTextBox.Rich TextBox.Cute Edito ...