Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2012-11-07) Play1中自定义helper类的技巧

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

大家都知道,Play1的模板使用了groovy作为模板语言,并且不允许在模板中直接创建方法。这个限制非常不方便,因为我们经常需要在在页面中创建一些临时使用的工具方法。

Play给出了两种方案:

  1. 定义自己的JavaExtensions类
  2. 在模板中以全路径方式调用方法,如"org.apache.commons.StringUtils.trimToEmpty(mystr)”

这两种方法都不够轻量,这里介绍一种更方便的方法:在action中创建一个匿名的工具类实例,传给模板

public static void show() {

Object h = <span class="kwrd">new</span> Object() {
    <span class="kwrd">public</span> String trimToEmpty(Object obj) {
        <span class="kwrd">if</span>(obj==<span class="kwrd">null</span>) <span class="kwrd">return</span> <span class="str">""</span>;
        <span class="kwrd">return</span> obj.toString();
    }
}
render(h);

}```

在模板中就可以这样使用:

Hello, ${h.trimToEmpty(name)};

```

对于临时使用的工具方法,这种方式非常适合。如果想在本controller范围或全局范围使用,只需要在合适的地方,创建一个action,使用play.mvc.Before,把它事先放入renderArgs中即可。

@Before

static void prepareHelper() {

Helper helper = <span class="kwrd">new</span> Helper();
renderArgs.put(<span class="str">"h"</span>, helper");

}```

一些评论

green

顶版主,喜欢这样轻量的代码。play-app-base预定义了一些helper大家喜欢可以直接拿来用。参见:https://github.com/greenlaw110/play-app-base/tree/master/src/com/greenlaw110/utils

补充一下,如果是所有的模版都打算使用这些helper的话,可以定义一个filter:

public class HelperLoader extends Controller {
@Before static void loadHelpers() {
renderArgs.put(“h1″, …);
renderArgs.put(“h2″, …);
}
}

然后在其他Controller上用@With(HelperLoader.class)即可。

如果用rythm模版引擎的话可以更简单一些:在app/rythm目录下创建一个文件__addon.src, 放入在模版中需要的helper即可:

com.greenlaw110.utils.S s = com.greenlaw110.utils.S.instance;
..

不需要在任何地方声明@Before或者@With了

comments powered by Disqus