Play 2.0 中文资料 - 搭建你偏爱的 IDE

用 Play 进行工作其实很简单的. 你甚至不需要一个复杂的 IDE, 因为 Play 会在你对源文件作了修改之后自动编译和刷新, 因此你可以很轻易的使用一个简单的文本编辑器来工作.

然而, 使用一个现代的 Java 或 Scala IDE 或给予你很 Cool 生产效率, 比如即时的编译, 良好的重构和调试功能.

Eclipse

生成配置

Play 提供了一条命令简化了 Eclipse 配置. 为转换一个 Play 应用为有效的 Eclipse 项目, 使用 eclipsify 命令:

无需关联下载依赖的源文件 jars 包:

Unmi 注: 对于一个新建的项目,执行 eclipsify 之后会产生 Eclipse 必须的 .project, .classpath 和 .settings 文件,并且这个命令还会创建 test 和 target 目录。Play 1.x 的 play eclipsify 命令有些不同,它会生成一个 eclipse 目录,里面有三个分别用于运行, 调试和测试用的 launch 文件。 阅读全文 >>

Play 2.0 中文资料 - 使用 Play 2.0 控制台

启动控制台

Play 2.0 控制台是基于 sbt 的为开发而准备的控制吧, 它允许你管理整个 Play 应用的开发周期.

要启动控制台, 进入到现有的 Play 应用的目录,然后运行 play 脚本:

Unmi 注: 虽然 sbt 是为 Scala 准备的构建工具,但是即使你创建的应用选的是 Java 语言, 我们仍然是要依赖于 sbt. 在 Play 1.x 的时候不存在 Play 控制台,要么就是直接把应用运行起来了。在 Play 1.x 的项目目录下运行 play 命令只会显示简单的帮助信息。

play 命令进入到当前应用的控制台下,提示符是 [应用的名称] $

阅读全文 >>

Play 2.0 中文资料 - 剖析 Play 2.0 应用

标准的应用目录布局

Play 应用的目录布局是标准化的,这样可保持尽量的简单. 一个标准的 Play 应用看起来如下:

阅读全文 >>

Play 2.0 中文资料 - 创建一个新的应用

用 play 命令创建一个应用

创建一个新应用最初的方式是用 play new 命令.

这会询问你一些信息.

  • 应用的名称 (仅用于显示, 这个名称后面将在几个消息中使用到).
  • 用于这个应用的模板. 你可以从 默认的 Scala 应用, 默认的 Java 应用, 和 空应用 三个选项目中选择.

Unmi 注: 新版 play new 命令允许你带上目录名,让你在指定的目录下创建应用,在 2.0-beta 版中,只是在当前目录下创建你的应用。运行 play help 看显示的 new 是否是: new [directory]    Create a new Play application in the specified directory. 就知道能否指定应用的目录。

并且此时的 play new 命令可以用

这样就会在 ~/Desktop/unmi 目录中创建应用,后面的提示是一样的. 在 ~/Desktop/unmi 目录下有应用所需的 app, conf, public 等目录。
阅读全文 >>

Play 2.0 中文资料 - 安装

系统要求

为了运行 Play 框架, 你需要 JDK 6 或更新的版本.

假如你正使用 MacOS, Java 已经内置了. 如果你正在使用 Linux, 请确认使用了 Sun  的 JDK 或 OpenJDK (不是 gcj, 它是许多 Linux 发行版的默认  Java 命令). 要是用的是 Windows, 只下载安装最新版的 JDK 安装包即可.

确可 javajavac 命令被设置到了当前路径下 (你可以在命令行提示符下通过输入 java -versionjavac 来检查它).

下载二进制包

下载 Play 2.0 的二进制包 (选择最新的 2.0 RC 版) 并解压到有读和写权限的目录下. (运行 play 会向安装目录中写入文件, 所以不要安装在 /opt, /usr/local 或任何你无需设置写入权限的目录中.)

Unmi 注: 当前最新的版本是 2.0.4。 阅读全文 >>

Play 2.0 中文资料 - 开篇

Play 当前版本是 2.0.4,2.0 前的版本通常会称为 PlayFramework,或者 Play!,现在干脆直呼为 Play 了,名气大了些就这样的,似乎越来越显得不可一世了。本人有意更深点了解 Play 框架,所以打算翻译官网 Manual, tutorials & references 一系列资料,并且着重点会先放在基于 Scala 语言的 Play 2.0 的应用。

Play 2.0 是一个高生产率的 Java 和 Scala 的 Web 应用框架,它集成了现代 Web 应用开发所而的组件和 API。

Play 是轻量级的,无状态的,Web 友好的架构,并且是特征可预期的(features predictable)。还借助于它的反应模型(reactive model) 和 Iteratee IO 的使用,让 Play 为高伸缩性的应用最小化了资源消耗(CPU, 内存和线程).

Unmi 注:关于 Iteratee IO, 可参考:Iteratee I/OScalaz Tutorial: Enumeration-Based I/O with Iteratees

第一步要翻译的内容只想覆盖到以下:

开始使用

Scala 用元组/列表类型实现多返回值的函数

Java 的方法不支持多返回值,或者我们想达到返回多个值的效果时,不得不借用数组、列表或对象等来容纳多个值返回给调用者。这样使用起来不怎么优美,特别是为返回多个值而创造一个类成本有点高,如果 Java 也存在像 C# 那样的匿名类倒好。C# 如何使用匿名类返回多个值可参看本文后面的例子。

把 Scala 当作是一种脚本语言,它的灵活性就应该与 Perl 或 Ruby 看齐。Scala 的方法也可以有多个返回值,它实现些种行为,可借助于元组和列表类型,虽然你也可以发掘更多的实现方式,但到目前为止,我还是觉得用元组和列表最简单。

下面给出代码例子,让我们瞧瞧 Scala 如何实现方法多个返回值,并且作为对比我还会贴上 Perl, Ruby 和 C# 可以怎么实现多返回值。我是 Java 的惯用者,不过我一直都未否认,从语言层面 C# 比 Java 要显得优雅的多。

用元组实现 Scala 方法多返回值:

方法返回一个元组,里面可以组合任何多个的不同类型的返回值,调用时可以用元组变量或元组模式去接收方法的返回值,用元组模式的方式更好看些,也才能算作真正的多返回值。 阅读全文 >>

Scala 无参数方法和统一访问原则

在 Scala 中当方法不需要接受参数时可定义成两种类型的方法

1.  def width(): Int   空括号方法(empty-paren method)

2. def width: Int  无参数方法(parameterless method)

从语法上讲,Scala 在调用上面那种类型的方法时都可以统一用 obj.width 的方式,实际对于无参数方法是只能用 obj.width 的方式,而空括号方法,既可以用 obj.width 也可以用 obj.width() 的形式。

那么 Scala 在方法无须参数时是定义空括号方法还是无参数方法时有什么约定呢?

当方法没有副作用(side effect)时,定义成无参数方法;当方法会产生副作用时,定义成空括号方法

那么又该如何识别方法是否有副作用呢?一般来说有副作用的地方会在于其结果类型是否为 Unit。如果某个函数不返回任何有用的值,也就是说如果返回类型为 Unit,那么这个函数唯一能产生的作用就只能是产生某种副作用,例如改变对象内部的某种状态,或是向控制台的输出等。有副作用的方法就像是数据库的存储过程(一般用于更新数据),无副作用的方法像是数据库的函数(一般用于查询得到数据)。 阅读全文 >>

Scala 的 apply 和 update 方法的应用

Scala 是构建在 JVM 上的静态类型的脚本语言,而脚本语言总是会有些约定来增强灵活性。灵活性可以让掌握了它的人如鱼得水,也会让初学者不知所措。比如说 Scala 为配合 DSL 在方法调用时有这么一条约定:

在明确了方法调用的接收者的情况下,若方法只有一个参数时,调用的时候就可以省略点及括号。如 “0 to 2”,实际完整调用是 “0.to(2)”。但 “println(2)” 不能写成 “println 10“”,因为未写出方法调用的接收者 Console,所以可以写成 “Console println 10”

到这里就要讲到 apply 和 update 方法相关的约定,描述的是直接在对象(对象)后直接加圆括号的代码的情况下,那就是:

用括号传递给变量(对象)一个或多个参数时,Scala 会把它转换成对 apply 方法的调用;与此相似的,当对带有括号并包括一到若干参数的进行赋值时,编译器将使用对象的 update 方法对括号里的参数和等号右边的对象执行调用。

对上面那段话的解释可由下面几个例子得到很好的理解

1. theArray(0), 取数组的第一个元素的操作会转换成 theArray.apply(0) 操作,这也能解释为什么 Scala 数组取值不用中括号括下标的方式,因为它也是一次方法调用 阅读全文 >>