`

Play framework 2.0 -http编程

阅读更多

 

#Actions,contorllers,和Results的概念。

 

1.Action

 

Action的概念很熟悉吧,Play应用中的大部分请求都有Action来处理。Action可以看作是一个处理请求数据并产生一个结果放回给客户端的简单Java方法。

Action返回play.mvc.Result,代表Http响应发送到客户端,在例子中,ok()构建了一个200状态的相应,它包含一个text/plain的响应体。

 

2.Controller

 

Controller是继承自play.mvc.Contorller的类,它将若干Action方法组合在一起。

下面是两个简单的Action例子。

 

 

public static Result index() {
  return ok("It works!");
}
public static Result index(String name) {
  return ok("Hello" + name);
}

 

 

3.Results

 

Results即结果。最简单的莫过于包含一个状态码、一组HTTP头和一个Http体的被发送到web客户端的Http Resul。

这些Results被play.mvc.Result定义,play.mvc.Results 类提供了一些帮助产生标准Http Results的方法,例如我们用到的ok()方法。

 

下面的代码示例创建了各种Results:

 

 

	Result ok = ok("Hello world!");
	Result notFound = notFound();
	Result pageNotFound = notFound("<h1>Page not found</h1>").as("text/html");
	Result badRequest = badRequest(views.html.form.render(formWithErrors));
	Result oops = internalServerError("Oops");
	Result anyStatus = status(488, "Strange response type");
 

 

 

这些方法都可以在play.mvc.Results中找到。

 

重定向同样是简单的Results,把浏览器重定向到一个新的URL也不过是一种简单的result,不同的是这些result 类型没有响应体。

 

如:

 

 

public static Result index() {
  return redirect("/user/home");
}
 

 

 

#Http 路由

 

1.内置的Http路由

 

路由是将每一个进来的Http请求转换成一个Action调用(action是contoller类里的静态的、公共的方法)的组件。

一个Http请求在MVC框架中被视为一个事件,这一事件包含了两个主要的信息块:

请求路径和Http方法(get,post...)

路由在conf/routes文件中被定义,并且会被编译,也就是说你能直接在浏览器中看到路由错误。

 

2.路由的配置语法

 

conf/routes是路由的配置文件,这个文件列出了所有应用需要的用到的路由,每一个

路由包含了一个Http方法和一个指定了action方法调用的通用资源定位符。

示例如下:

 

 


# Display a client.
GET /clients/:id controllers.Clients.show(id: Long)
 

 

3.Http方法

 

Http方法指任何被Http所支持的方法,如GET/POST/PUT/DELETE/HEAD等

 

4.URI

URI定义了路由请求的路径,请求路径的某些部分可以是动态的。

静态路径,例如准确匹配GET /clients/all的请求,就可以这样定义路由:

GET   /clients              controllers.Clients.list()

动态路径,如果你想定义一个路由,例如通过ID来检索Client,那么你需要增加一个动态部分:

GET   /clients/:id          controllers.Clients.show(id: Long) 

很多时候,动态部分不止一个。动态配置也可以使用通配符和正则表达式。如:

GET   /files/*name          controllers.Application.download(name)  

GET   /clients/$id<[0-9]+>  controllers.Clients.show(id: Long)

 

5.调用action生成的方法

 

路由的最后一部分定义了调用的方法,和需要的参数,参数可以定义各种类型,int,long,String,List等等。

 

6.路由优先级

 

多个路由匹配同一个请求的时候就会产生冲突,这时候第一个路由会被使用。

 

#处理响应

 

1.改变默认的content-Type

 

结果的content-Type会根据你设置的Http体的Java值来自动进行指定,如Result textResult = ok("Hello World!");将自动设置content-type头为"text/plian",

而Result jsonResult = ok(jerksonObject);则会被设置为"application/json"。

这一点非常有用,当然也可以通过as方法自行设定。如Result htmlResult = ok("<h1>Hello World!</h1>").as("text/html");

或者直接设置Http response也能达到效果response().setContentType("text/html");return ok("<h1>Hello World!</h1>");

 

2.设置Http响应头

 

可以增加或者更改Http响应头,例如:

 

public static Result index() {
  response().setContentType("text/html");
  response().setHeader(CACHE_CONTROL, "max-age=3600");
  response().setHeader(ETAG, "xxx");
  return ok("<h1>Hello World!</h1>");
}
 

这些设置会废弃之前的设置。

 

3.设置和丢弃cookies

 

cookies仅仅是Http头的特殊形式,Play提供了一些方法使得对设置cookies变得更简单。

例如:

response().setCookie("theme", "blue");

response().discardCookies("theme");

 

4.为文本结果指定字符编码

 

正确处理基于文本的Http响应的字符编码十分重要,Play使用UTF-8作为默认的编码格式。

 

#Session和Flash 作用域

 

1.Session的概念在Play中很不同

 

如果你要保持跨多个Http请求的数据,你可以把他们保存在Session或者Flash作用域中。保存在Session中的数据在整个用户会话中可用,

保存在Flash作用域中的数据仅在下个请求中可用。

 

Session和Flash数据没有在服务器上储存,而是使用cookies在后续的Http请求之间传递(而是使用cookies被添加到后续的每个Http请求中),理解这一点很重要。

也就是说数据大小受限制了(最大到4KB),并且只能存储字符。

 

Cookies被一个密钥签名,这样客户端就无法修改cookie数据。Play的Session无意作为一个缓存。如果你需要存储与某个特定用户相关的数据,

那么你可以使用Play内置的缓存机制来存储。通过存储一个用户会话的唯一ID来与缓存中的数据进行关联。

 

注意:Play没有Session超时失效的技术,如果你的应用程序需要这样的功能,你可以在用汉语Session中存储一个时间戳,并需要你自己来实现Session失效的功能。

 

读取Session

String user = session("connected");

往Session中存储数据

session("connected", "user@gmail.com");

删除某个Session

session.remove("connected");

废除所有Session

session().clear();

 

2.Flash作用域(scope)

 

Flas作用域的工作方式和Session很相似,但是有两点是不同的:

a 数据仅保持在一个请求中

b 数据未被签名,因此用户可以修改Flash cookie的数据。

 

注意:Flash作用域仅应该被用于在简单的非Ajax应用中传递成功/失败消息。

因为其数据仅仅传递给下一个请求,但是在复杂的web应用中它无法确保请求的顺序。

总之,Flash作用域受到竞争条件限制。

 

Flash的使用方法与Session相似。

 

#(Body parses)Http体分析器

 

1.何为体解析

 

一个Http请求会包含一个Http体,这个Http体能过按照content-Type头中的设定被格式化。

 

注意:你不能直接使用Java实现BodyParser(体解析器)。因为Play的体解析器必须直接处理一个迭代矩阵,

而这必须由Scala来实现。

不过Play提供了默认的BodyParser,它可以满足大部分的情况(解析Json、Xml、Text、上传文件等)。并且你可以直接使用Java来重用这些解析器

来实现自己的解析器。例如你可以基于Text的解析器来实现一个RDF的解析器。

 

2.BodyParser的Java API

 

所有的解析器必须返回play.mvc.Http.RequestBody类型的值。这个由BodyParser产生的值最终可以通过request().body()方法获取到。

可以通过@BodyParser.Of的注解来指定一个特定的BodyParser,例如:

 

 

@BodyParser.Of(BodyParser.Json.class)
	pulic static Result index() {
	  RequestBody body = request().body();
	  ok("Got json: " + body.asJson());
	}

 

 

3.Http.RequestBody API

 

通常BodyParser会返回正确的play.mvc.Http.RequestBody类型的值。但一些解析器能提供比Http.RequestBody更特殊的类型。使用as()方法你可以自动的将请求体转换为另一种类型。例如:

 

 

@BodyParser.Of(BodyLengthParser.class)
	pulic static Result index() {
	  BodyLength body = request().body().as(BodyLength.class);
	  ok("Request body length: " + body.getLength());
	}
 

 

4.默认的体解析器:任意内容

 

如果你不指定你自觉的体解析器,Play会使用默认的最接近content-Type的解析器。

a text/plain:String,使用asText().

b application:json:JsonNode,使用asJson().

c text/xml: org.w3c.Document,使用asXml();

d application/form-url-encoded:Map<String, String[]>,使用asFormUrlEncoded().

e multipart/form-data:Http.MultipartFormData, 使用asMultipartFormData().

f 其他content type: Http.RawBuffer, 使用asRaw().

例如:

 

 

 
pulic static Result save() {
	  RequestBody body = request().body();
	  String textBody = body.asText();
	  
	  if(textBody != null) {
	    ok("Got: " + text);
	  } else {
	    badRequest("Expecting text/plain request body");
	  }
	}
 

 

 

5.内容的最大长度

 

基于文本的体解析器有一个最大长度因为它们要被全部装载到内存中。

Play默认的内容长度为100KB,默认的大小可以在application.conf中定义:parsers.text.maxLength=128K

 

#Action的构成

 

1.关于actions的提醒

 

之前,我们说一个Action就是一个返回play.mvc.Result类型值的Java方法。实际上,Play把内部actions当作函数。

因为Java不支持first class functions,由Java API提供的Action是一个play.mvc.Action的实例:

 

public abstract class Action {
    
  public abstract Result call(Http.Context ctx);    
    
}

 

Play为你建立一个根action来调用正确的action方法,这样就允许更复杂的action组合。

 

 

 

 

分享到:
评论
1 楼 Geggis 2015-07-14  
您好!我想学习一下,请问可以转载吗?转载时会标明出处。

相关推荐

    Play framework 2.0入门教程(三)的源代码,Play留言板

    Play Framework 2.0 是一个基于Java和Scala的开源Web应用程序框架,以其“写后即运行”的特性而闻名。这个入门教程的第三部分是关于如何使用Play Framework构建一个简单的留言板应用。在这里,我们将深入探讨Play ...

    Play framework 2.0入门教程(四)的源代码,Play留言板(数据库版)

    在这个“Play框架2.0入门教程(四)的源代码”中,我们主要探讨的是如何在Play框架下创建一个基于数据库的留言板应用。 首先,我们需要了解Play框架2.0的核心特性。这个版本引入了更加模块化的设计,支持Scala和...

    play2.0 for java developers.pdf

    ### Play2.0 for Java Developers #### 概述 Play2.0是一个现代的Web应用框架,它基于Java和Scala语言构建,旨在提供简洁、快速且可扩展的应用开发体验。对于Java开发者而言,Play2.0提供了一套完整的Java API,...

    play框架手册

    10.在HTTP下进行异步编程 - 89 - 暂停http请求 - 89 - Continuations - 90 - 回调Callbacks - 91 - HTTP response流 streaming - 92 - 使用WebSockets - 92 - 11.在play框架里使用Ajax - 94 - 通过jsAction标签使用...

    play-scala-isolated-slick-example:示例Play Slick项目

    6. "playframework" - 这是项目的核心框架,是一个灵活的Web开发框架,使用Scala和Java构建服务器端应用。 7. "WebappScala" - 明确指出该Web应用程序是使用Scala语言编写的。 【压缩包子文件的文件名称列表】:...

    Javaly-Play:Javaly - Java Playframework

    它是一种工具,可以帮助教授和教师更好地教授编程,并帮助学生以有趣而有条理的方式学习编程,利用(最终……)统计数据来增强学习体验和教学体验,所有这些都在学习如何编写好的干净代码的名称。 我们希望拥有...

    播放VCD文件(2.0)

    - WinForms是.NET Framework的一部分,用于构建桌面应用程序的用户界面。在播放VCD文件的场景中,WinForm将用于创建播放器的图形用户界面,包括播放、暂停、停止等控件。 4. **2.0版本**: - 更新到2.0版本可能...

    播放MP3音频(2.0)

    2. **.NET Framework 2.0 API**:这是微软开发的一个全面的开发平台,包含了大量的类库,支持多种编程语言。在2.0版本中,我们能够找到处理多媒体文件的基础工具。 3. **C#编程语言**:C#是.NET Framework的主要...

    C# 2.0 winform八哥学语播放软件

    C# 2.0是.NET Framework 2.0的一部分,它引入了诸如匿名方法、迭代器、 partial 类和属性、可空类型以及泛型等新特性,这些都极大地提高了代码的可读性和可维护性。在这个八哥学语播放软件中,开发者可能利用了C# ...

    scalaz-core_2.9.3-7.1.0-RC2.zip

    总结来说,"scalaz-core_2.9.3-7.1.0-RC2.zip"和"play-twenty-three.zip"代表了Scala生态系统中的两个关键部分:一个强大的函数式编程库和一个基于Play Framework的JSON处理项目。理解并熟练运用这些工具,可以帮助...

    java开源框架下载集合

    **下载链接**: [http://download.playframework.org/releases/play-2.0.zip](http://download.playframework.org/releases/play-2.0.zip) Play Framework 是一款基于Java和Scala的高性能、轻量级Web应用开发框架。...

    java-play-voice.rar_play

    在Java编程语言中,播放声音是一项常见的任务,尤其在开发多媒体应用或游戏时。`java-play-voice.rar_play`这个压缩包可能包含了关于如何在Java中实现声音播放的详细资料,其中`java播放声音的方法.pdf`很可能是核心...

    play-scala-service-example:带有Macwire端点Akka类型的播放服务

    2. **Play Framework**: Play是基于Java和Scala的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式,支持异步I/O和热加载,适合开发RESTful API。Play与Scala的集成使得开发者可以利用Scala的强大功能来...

    用于运行Java应用程序的Cloud Foundry构建包 仅供学习参考用代码.zip

    - `framework_aspectj_weaver_classes`: 这部分涉及到AspectJ,一个强大的Java切面编程(AOP)工具。在Cloud Foundry环境中,AspectJ Weaver可能被用来实现AOP功能,如日志记录、性能监控等。 通过这个压缩包,你...

    spring2.0 hibernate 3.0 struts1.1 xfire1.2 整合

    但随着技术的发展,现在更多的开发者可能转向使用Spring Boot、Hibernate ORM(取代XFire的现代Web服务框架如Spring Web Services)和更新版本的Struts或替代品如Play Framework。 然而,由于描述中提到“jar自已去...

    控制vlc播放器

    在VS2003中,你需要确保安装了.NET Framework 2.0或更高版本,因为C#的`Process`类是在这个框架版本中引入的。同时,VLC必须也已经安装在目标计算机上,并且其可执行文件(`vlc.exe`)的路径是可访问的。 此外,...

    SpringMVC文档.zip_spring mvc

    - Play Framework是另一个流行的Web框架,文档可能探讨了两个框架在开发模式、性能、社区支持等方面的异同。 3. **Spring框架基础** - "sping .docx"可能涵盖了Spring框架的基本概念,包括IoC容器、bean的生命...

    2015-Framework:2015年框架

    4. **Play Framework**: Play是一款现代、轻量级的Java web框架,强调开发速度和简洁的代码。2015年的Play Framework 2.x版本支持异步I/O,适用于构建高性能的Web应用。 5. **Java EE 7**: Java企业版(Java EE)在...

    swagger-core,用于生成swagger api规范的示例和服务器集成,该规范允许轻松访问restapi.zip

    2. **服务器端集成**:它能够与多种服务器框架集成,如 Jersey、Spring MVC 和 Play Framework,帮助开发者快速构建符合 Swagger 规范的 REST 服务。 3. **文档生成**:通过解析源代码,Swagger Core 可以自动生成...

    register-trust-settlor-frontend

    在“register-trust-settlor-frontend”这样的前端项目中,Scala通常与Play Framework一起使用。Play Framework是一个开源的Web框架,它支持异步操作,可以构建响应式的、高性能的Web应用。Scala的强类型系统和表达...

Global site tag (gtag.js) - Google Analytics