Play1 直接调用 Action 方法,不作 302 跳转

用过 PlayFramework 的同学们应该都知道,Action 方法间的调用是进行的  302 重定向操作。

简单例子说明一下,当基于下面的 r1, r2 路由配置时,如果 Application.f1() 方法中调用了 f2() 方法,实际运作是 f1() 在调用 f2() 时,会先反向出 f2() 方法对应的路由  GET /r2,然后向 /r2 发出的一个 302 跳转.

上面也算是绕个弯形成了对 f2() 方法的调用,这也是非常合理,在 Action 中很容易理解的。

GET     /r1                                                                     Application.f1
GET     /r2                                                                    Application.f2
GET     /r3                                                                    Application.f3

为什么说会反向出 f2() 方法对应的路由,可以反证一下。

例如说在 f1() 中调用了一个 public static void f4() 方法,但是 f4() 并未出现在 routes 配置中,也就是 f4() 没有对应的路由配置,我们将会看到这样一个异常 阅读全文 >>

PlayFramework 1 自定义标签 -- FastTags

最早是用 HTML 来自定义标签,现在觉得 HTML 写有关逻辑的代码就有点不伦不类了,HTML 里着重是显示代码。前有一篇 PlayFramework 1 模板应用 -- Java 对象扩展 学习了对 Java 对象扩展的方式,如果不是基于已有对象类型进行方法扩展来进行调用,就可以自定义 FastTags 的方式。

Java 对象扩展的使用是 ${obj.abc()}, FastTags 标签是 #{abc}...${/abc}。

FastTags 标签类继承自 play.templates.FastTags,标签对应方法的原型是

public static void _tagName(Map<?, ?> args, Closure body, PrintWriter out,     ExecutableTemplate template, int fromLine)

这些都是得益约定优于配置,下面来几个例子,分别说明默认参数,命名参数,及多参数,标签体的处理。 阅读全文 >>

PlayFramework 1 模板应用 -- Java 对象扩展

涉及到页面显示的问题,用自定义标签总能够能事不少,即使是最原始的自定义 JSP 标签也有人乐此不疲,进化到  Play 中的自定义标签数得上很轻量级的实现,简单的只需要一小页文档 The template engine 就足矣。

概括起来 Play1 支持三种方式自定义标签: HTML 文件方式, 自定义 FastTags, Java 对象扩展方法. 前二者为面向过程的方式,第三种方式为面向对象的方式,是在往某种数据类型追加一个方法。

确切的说针对 Java 对象的方法的扩展并不能称之为自定义标签。

一个这样的场景,股票价格变化值要显示在页面上,根据正,负,零,再加上不同的区域四种条件分别显示为不同的颜色,比如美国分别为绿色,红色和黑色(注: 美国股市显示的颜色正好与中国相反)。假设 priceChange 是 Integer 类型,我们就可以定义对 Integer 对象的扩展,所在类必须继承自 JavaExtensions 类: 阅读全文 >>

PlayFramework 1 输出所有 WS.url() 访问的 URL

记录下这个其实没有多大的意义,新入手 Play 框架的应该直接就是用版本 2 了,只因我们还要系统工作在 Play1 下,所以记下来,估计在 Play2 中已无借鉴作用了。

我们在 Play1 中访问外部 WebService 资源都是用 WS.url(url),然后调用它的 get(), post(), delete() 等相对应的 HTTP 请求方法。我们可以系统中所有通过 WS.url() 访问的 URL, 需找到切面,Play 是在哪里为访问的 URL 创建请求的。

看 WS 类的实现,它是一个 PlayPlugin 插件,其中定义了

private static WSImpl wsImpl = null;

来看 Play 是如何获得 WSImple 实现的,WS 插件的初始化方法中: 阅读全文 >>

Play 2.0 中文资料 - 应用程序全局对象

应用全局设置

全局对象

在你的项目中定义一个 Global 对象,它为你处理应用的全局设置. 这个对象必须定义在默认包中(即不带 package 声明的包).

小贴士: 你也可使用 application.global key 值在在配置中指定自己的 GlobalSettings 实现类名称.

Unmi 注: GlobalSettings.scala 放在 app 目录比较合适,Scala 的 package 层次与目录并不存在严格的对应关系。

要说呢,不带 package 声明的写法确实不是什么好习惯,因为其他带 package 声明的类无法使用它。见:为何Java的有包名的类不能引用默认包中的类。这就对了,本来这个全局对象就不是给别的类用的 - Don't call me, I'll call you。

勾住应用启动和停止事件

你可以覆盖方法 onStartonStop,它们会在应用的生命周期启动,停止时得到通知: 阅读全文 >>