Play 2.0 中文资料 - 处理和响应 JSON 请求

处理 JSON 请求

JSON 请求是一个以有效的 JSON 数据作为请求体的 HTTP 请求. 它必须指定 Content-Type 头为 text/json 或是 application/json 作为 mime 类型.

默认的, Action 使用 any content 作为 Body 解析器, 这让你接收 Body 并解析为 JSON (实际为 JsValue):

更好的(也是更简单的)办法是指定你自己的 BodyParser 用以告诉 Play 把类容 Body 直接解析为 JSON: 阅读全文 >>

Play 2.0 中文资料 - Play JSON 库

概述

推荐的处理  JSON 的方式是使用 Play 基于 JSON 库的类型类, 位置在 play.api.libs.json.

这个库是构建于 Jerkson, 之上的,它又是基于 Java 的超快的 JSON 库 Jackson 的 Scala 封闭。

Unmi 注:在 Play 1.x 所用的 JSON 库是 Gson,而 Play 2.0 后更换成了 Jackson。还得 Play 2.0 是基于 SBT 构建的,所以 Play 2.0 的所有的 jar 都是在 $PLAY_HOME/repository/local 目录中。

这样做的好处是无论是 Java 还是 Scala 的 Play 应用依赖了相同的底层库 (Jackson), 同时 Scala 用户可以享受到  Play’s JSON 所带来的额外的类型安全性.

play.api.libs.json 包含有七种 JSON 数据类型:

  • JsObject
  • JsNull
  • JsUndefined
  • JsBoolean
  • JsNumber
  • JsArray
  • JsString

上面的类型都继承自通用的 JSON 值类型, JsValue. 阅读全文 >>

JavaDoc 编程,书写自定义的 Doclet, 定制输出

前一篇介绍了 JavaDoc 编程,书写自定义的 Taglet 支持 @unmi 等, 那时提到了 Doclet,但是差点无视了 Doclet,现在才知道 Doclet 真是太强大了,有了它你会觉得 javadoc 已经不是原本的那个 javadoc 了,别再把 javadoc 看作只会生成一大堆 HTML 文件的工具了。尤其是搭配上自定义的 Taglet,那可是,自已体验吧。

Doclet 是 JavaDoc 的一个很隆重的扩展点,可以在执行 javadoc 时用 -doclet 来指定自己的 Doclet,那么 doclet 可以为我们做些什么呢?

可以为我们生成 HTML 的 JavaDoc API 文档,这就是默认的 com.sun.tools.doclets.standard.Standard 为我们做的事,还可以像以前那样从源文件中抽取信息生成各种 XML 文件,或是 PDF, Excel, UML 图等等任何可能的内容,或做任何有作为的事情。总之在 doclet 中可以感知道对任何包,类,方法,字段等的遍历。这里 Doclet.com 有大量的第三方的 doclet 供你选择,如:

AntDoclet, API Guide Doclet, EJBGen, Java2Rose Doclet, JDiff, JUnitDoclet, LaTeXtaglet, PDFDoclet, PublishedApiDoclet, ServletDoclet, Spell Check Doclet, UMLGraph, VelocityDoclet, XDoclet, xml-doclet 等数十种 Doclet, 还可以找到别的,所以你要是不想自定义 Doclet 的话,有第三方可用就直接用人家的就行。

总有特殊需求的时候,总有要自定义 Doclet 的时候。说那么多总要来看看 Doclet 可以用来做什么,见如下 DocumentDoclet: 阅读全文 >>

JavaDoc 编程,书写自定义的 Taglet 支持 @unmi 等

javadoc 可为我们的 Java 项目生成 API 文档,别人的应该是看得多了,自己的可能不好意思晾出来看。那 Java 源代码里的 @author, @see, @param 等应该是司空见惯了吧。除此之外我们还可以自定义自己的 tag,并让它们的内容按照我们需要的格式生成到 javadoc 文档中,或作他用。还记得没有 Maven 的时代我们是怎样用 XDoclet 生映射文件的吗?现在的 Taglet 定制想要做的事情大抵如此。

执行一下 javadoc 命令看看,一堆的参数可以指定,又有学问在里头,且看:

-tag <name>:<locations>:<header>  Specify single argument custom tags
-taglet                           The fully qualified name of Taglet to register
-tagletpath                       The path to Taglets

-doclet <class>           Generate output via alternate doclet
-docletpath <path>        Specify where to find doclet class files

关于 doclet 部份这儿暂且不说,单讲 tag 部分的东西。

对于自定义 tag,简单的时候,用参数 -tag  都可以不写自己的 taglet 类,例如有这样一个代码: 阅读全文 >>

Java 的多行字符串 Here Document 的实现

寻求了很久关于如何在 Java 中实现多行字符串,即 Here Document。因为在测试中准备大的字符串数据是不得不用加号去拼接,甚至是麻烦。稍好就是用 http://www.htmlescape.net/javaescape_tool.html 把你输入的大段文字生成 Java 的字符串。

找过一些介绍 Java 实现 Here Document 的方法,首先大家无一不是把这个多行字符串塞在注释里,有些实现在运行还在依赖于 Java 源文件中的注释,这不太可取。聪明的做法应该要去打编译器的主意,让编译后体现在 Class 文件中,变量就被赋上了多行字符串值,这就是 JDK1.5 引入的 APT(Annotation Processing Tool),到 JDK1.6 后可操作性更强了,可以 javac 的时候带上 -processor 参数。

单单从语法特性上来讲,我觉得 Java 与现今流行的语言还是有差距,不过它一直在成长,像 JDK 1.5 和 1.7 这两个版本就带来了不少好东西。想要见识一下其他些个语言,如 Perl, PHP, Ruby, C++11 怎么实现 Here Document 还是请看 http://en.wikipedia.org/wiki/Here_document

就连 Java 最亲密的战友 C# 都早实现了 Here Document,用 @ 符号: 阅读全文 >>

保持顺序的 Java Properties 类

Java 的 Properties 加载属性文件后是无法保证输出的顺序与文件中一致的,因为 Properties 是继承自 Hashtable 的, key/value 都是直接存在 Hashtable 中的,而 Hashtable 是不保证进出顺序的。

总有时候会有关心顺序一致的需求,恰如有 org.apache.commons.collections.OrderdMap(其实用 LinkedHashMap 就是保证顺序) 一样,我们也想要有个 OrderdProperties。网上查了下还真有:

http://livedocs.adobe.com/jrun/4/javadocs/jrunx/util/OrderedProperties.html

http://www.openrdf.org/doc/alibaba/2.0-rc4/apidocs/org/openrdf/repository/object/composition/helpers/OrderedProperties.html

不过没找到源码,其实自己写一个 OrderedProperties  也不难,并不需要重头写起,只要继承自 Properties,覆盖原来的 put/keys,keySet,stringPropertyNames 即可,其中用一个 LinkedHashSet 来保存它的所有 key。完整代码如下: 阅读全文 >>

Play 2.0 中文资料 - 模板引擎(用例)

模板, 实际作为简单函数存在的, 它可以任何你希望的方式被组合应用. 下面是一些通用场景的使用案例.

布局

我们来声明一个 views/main.scala.html 模板来用作主布局模板:

正如你所看到的, 这个模板有两个参数: 一个标题和一个 HTML 内容块. 现在我们可在另一个模板 views/Application/index.scala.html 中用它: 阅读全文 >>

Play 2.0 中文资料 - 模板引擎(语法)

Unmi 注:因为是 Web 框架,所以展示层必不可少,也就是接下来两章,我们进入到 Play2.0 中的模板引擎的世界,不同与Play 1.x 让你眼花缭乱的 ${}, #{}, @{}, @@{}, &{}, %{}% 和 {} 如此众多的标签样式,而在 Play 2.0 中只有一个魔幻的 @ 符号。这就叫化繁为简,Play 1.x 的模板是基于 Groovy 的,而 Play 2.0 是基于 Scala 的,它在效率上也改善不少。

基于 Scala 的类型安全的模板引擎

Play 2.0 带来了崭新而真正强大的基于 Scala 的模板引擎. 这一新引擎的设计灵感来自于 ASP.NET 的 Razor.  具体表现在:

  • 简洁, 富有表现力, 且流畅: 它最小化了一个文件所需的字符和按键的数量, 并且开启了一个快速而流畅的代码流. 不像多数的模板语法, 你不必中断你的代码去显式的告诉你的 HTML 说这儿有一个服务端代码块. 解析器足够的聪明,能依据你的代码进行推断(Unmi 注: 推断出哪块代码应该由服务端来执行). 这使得简洁而富有表现力的语法显得更干净,  并且输入变得快速而有乐趣.
  • 易学: 源于其最小化的概念,而让你快速而富有成效的掌握它. 只需用到你现有的 Scala 语言和 HTML 知识.
  • 并非新的语言: 我们尽量选择不去创建一门新语言. 相应的,我们希望能让开发者使用它们现有的 Scala 语言技能。也就是要在选择你自己语言的情况下,提供一套模板标记语法,从而让你书写出令人敬畏的 HTML 结构流.
  • 可用任何文本编辑器: 无须特别的工具,在任何纯文本编辑器中都能保持高效. 阅读全文 >>

Play 2.0 中文资料 - 组合 Action

本章介绍几种定义通用 Action 功能的方法.

基本的 Action 组合

我们首先从一个简单的日志装饰器(logging decorator) 开始: 我们想要记录下当前 Action 每次被调用的日志.

我们不直接就定义自己的 Action, 而是首先提供一个用于创建标准 Action 的帮助方法:

接着你可以这么来使用: 阅读全文 >>

Play 2.0 中文资料 - Body 解析器

什么是 Body 解析器?

HTTP PUT 或 POST 请求含有一个请求体(Body). 请求体可以使用任何格式, 只要在请求头中指定相应的 Content-Type 即可. 在 Play 中, 一个 Body 解析器 转换请求体为对应的 Scala 值.

然而,HTTP 请求体可能非常的大,这时候 Body 解析器 不可能在解析之前光等着把数据全部加载到内存. BodyParser[A] 是个基本的 Iteratee[Array[Byte],A], 这就是说它一块一块的接收数据 (只要 Web 浏览器在上传数据) 并计算出类型为 A 的值作为结果.

让我们考虑一下几个例子.

  • 一个文本型 Body 解析器能够把逐块的字节数据连缀成一个字符串, 并把计算得到的字符串作为结果 (Iteratee[Array[Byte],String]).
  • 一个文件型 Body 解析器能够把逐块的字节数据存为一个本地文件, 并以 java.io.File 引用作为结果 (Iteratee[Array[Byte],File]).
  • 一个 s3 型 Body 解析器能够把逐块的字节数据推送给 Amazon S3 并以 S3 对象 ID 作为结果 (Iteratee[Array[Byte],S3ObjectId]). 阅读全文 >>