Play2 for Java(四:Controller、Action、Result)

Module 4 控制器,Action,结果集

4.1 控制器Controller

相信使用过MVC框架的应该很熟悉,控制器直接负责处理请求以及返回响应,但在Play!中大部分工作都都被推给了Action和Result了。在Play!中控制器提供了更多的辅助角色,为常见任务提供助手,通常不碍事。

这里写图片描述

控制器的契约只是一个实现控制器抽象基类的类。所以一个有效的,但最终没用的控制器,可以这样声明。当我们通过和Action和Result一起工作时,我们将看到控制器提供的一些特性。

4.2 Action

这里写图片描述

在Play!中,Action是处理HTTP请求的关键抽象.它们在请求对象上操作,这是对实际HTTP请求的一种编码抽象,并返回一个Result对象,一个HTTP响应的编码抽象。

这里写图片描述

操作是作为控制器上的静态方法实现的。一个基本的动作是这样的。我们将方法声明为public,ranhou 我们将其声明为静态的,它被定义为返回一个Result对象。我们上图这里返回TODO;这是控制器提供的一个助手的示例。它返回由Play!提供的预定义视图,这表明这条路线还有待执行

4.3 Result

这里写图片描述

当执行一个操作时,它返回一个Result的子类。Result只是标识操作的响应的接口。Play!它本身负责将该结果映射成HTTP响应。您不必自己实现Result接口,因为Play!提供了一些关于Result的高级抽象,而且为控制器提供了各种各样的Result构建器来配置响应的行为。
通常Result对象提供了HTTP状态码以及响应的内容,Controller 类提供了一个帮助方法,使得定义属性变得简单。例如,我们已经在以前的代码示例中看到了OK构建者模式的应用。这些Result生成器是围绕普通的HTTP状态名建模的:
200——ok
400——badRequest
404——notFound
500——internalServerError
控制器类不是为每个可能的HTTP状态提供一个助手,而只是实现了大约13个比较常用的HTTP状态,并且提供了一个更通用的状态助手来指定不常见的状态。因此,如果你真的想要返回一个HTTP状态为418的,内容为“I'm a Teapot”,你可以如下图这样做。

这里写图片描述

该帮助方法接受许多不同类型的对象作为内容,Play!将尝试为HTTP响应选择最好的内容类型。例如,将字符串传递给该帮助方法将返回text/html响应;传递view引用将导致text/html响应;传递JsonObject将导致application/json响应;并且传递一个File文件会导致Play!检查文件类型以获得响应的内容类型。这在大多数情况下都是有用的,但是,如果您想要返回一个字符串,它表示一个HTML字符串,那么您可以使用“as”方法手动地覆盖内容类型,以返回结果,参考下图。

这里写图片描述

4.4 Session和Flash Scope

有时您可能想要在众多的请求和响应中持久化值,而您不希望将它们存储在URL中。
例如,当用户登录时,您希望存储对其帐户的引用,如果他们正在填写一份多页表格时候你经常会有这种需求。Play!支持Session的概念;然而,Play框架毕竟是一个无状态的框架,所以是通过cookie提供会话支持。每次更新或创建Session时,在客户端和服务器之间发送的cookie将被更新。基于cookie的会话有一些值得考虑的关注点。
Session对象本身实际上只是一个键值对的映射,它将键和值映射回请求响应cookie。与一般的基于服务器的会话不同,cookie只能用于存储字符串值。因此,如果您想存储一个largeobject,您需要找到一种方法来序列化和反序列化每个请求。cookie的大小是有限的,准确的说是4kb,这意味着使用默认方法存储大量的数据是很困难的。cookie是使用加密密钥签名的;这意味着外部篡改将使cookie失效,在许多情况下使cookie变得更加安全。

这里写图片描述

默认情况下,当用户关闭浏览器时,会话cookie将过期,这意味着它的声明周期完全由客户端决定。如果您可能出于安全考虑需要在会话中强制执行某种人工超时,那么您将需要手动实现此功能。控制器提供了通过session方法访问和设置会话值的助手方法(看上图)。
例如,session(“username”)用于访问与username键相关联的值。如果username这个键不存在,将返回null。
例如,session(“username”,“james”)可以用来设置username键的值。

这里写图片描述

在我们讨论会话值的时候,我们应该看一下Flash Scope。有时您将会获取到一个希望传递到下一个请求的短消息。例如,如果您正在验证表单,或者您已经排队了一个操作,那么您可能想要在表单发布或执行操作之后显示一条消息。您可以使用Session对象进行此操作,并确保在请求完成后手动清除它,但这将在几乎所有请求上造成不必要的开销。Flash Scope是一种只针对请求而存在的短时间会话。如果您设置了一个Flash Scope的值,您可以使用它在页面上显示一条消息,但是刷新页面时,Flash Scope的值将会消失。可以通过控制器上的Flash方法来访问Flash Scope。

4.5 Request/Response对象

这里写图片描述

通过在控制器上提供的访问器,可以使我们深入到Request和Response对象中。这些方法返回的具体对象包装了当前的HTTP请求和响应。Request对象大部分是只读的,因为对将要丢弃的对象进行突变是没有意义的。它提供了很多方法,包括:
①检查请求的cookie;
②检索客户端指定的HTTP头;
③查询可接受的媒体类型,如Application, JSON, Text, HTML,这对于更高级的内容的协商策略很有用;
④检索请求体以及请求的HTTP方法;
⑤检索变量的值;
⑥以及请求的其他细节,如主机、端口号、URI、远程地址。
Response对象主要由Play!来处理您选择从操作返回的结果,因此响应对象上可操作性的选项更加有限。Response对象提供了:
①读取和写入cookie、任意标题和响应内容类型的能力
②针对HTTP Header的语法糖。

猜你喜欢

转载自blog.csdn.net/qq_31179577/article/details/78732638