大家都知道,Play1的模板使用了groovy作为模板语言,并且不允许在模板中直接创建方法。这个限制非常不方便,因为我们经常需要在在页面中创建一些临时使用的工具方法。
Play给出了两种方案:
这两种方法都不够轻量,这里介绍一种更方便的方法:在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了