- 用过 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() 没有对应的路由配置,我们将会看到这样一个异常 Read More - 最早是用 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)
这些都是得益约定优于配置,下面来几个例子,分别说明默认参数,命名参数,及多参数,标签体的处理。 Read More - 涉及到页面显示的问题,用自定义标签总能够能事不少,即使是最原始的自定义 JSP 标签也有人乐此不疲,进化到 Play 中的自定义标签数得上很轻量级的实现,简单的只需要一小页文档 The template engine 就足矣。
概括起来 Play1 支持三种方式自定义标签:HTML 文件方式,自定义 FastTags,Java 对象扩展方法. 前二者为面向过程的方式,第三种方式为面向对象的方式,是在往某种数据类型追加一个方法。
确切的说针对 Java 对象的方法的扩展并不能称之为自定义标签。
一个这样的场景,股票价格变化值要显示在页面上,根据正,负,零,再加上不同的区域四种条件分别显示为不同的颜色,比如美国分别为绿色,红色和黑色(注: 美国股市显示的颜色正好与中国相反)。假设 priceChange 是 Integer 类型,我们就可以定义对 Integer 对象的扩展,所在类必须继承自 JavaExtensions 类: Read More - 记录下这个其实没有多大的意义,新入手 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 插件的初始化方法中: Read More - 应用全局设置
全局对象
在你的项目中定义一个Global对象,它为你处理应用的全局设置. 这个对象必须定义在默认包中(即不带 package 声明的包).1import play.api._ 2 3object Global extends GlobalSettings { 4 5}小贴士: 你也可使用
Unmi 注: GlobalSettings.scala 放在 app 目录比较合适,Scala 的 package 层次与目录并不存在严格的对应关系。application.globalkey 值在在配置中指定自己的GlobalSettings实现类名称.
要说呢,不带 package 声明的写法确实不是什么好习惯,因为其他带 package 声明的类无法使用它。见:为何Java的有包名的类不能引用默认包中的类。这就对了,本来这个全局对象就不是给别的类用的 - Don't call me, I'll call you。
勾住应用启动和停止事件
你可以覆盖方法onStart和onStop,它们会在应用的生命周期启动,停止时得到通知: Read More