after-action-before-render类型的拦截器(Play 1.x)

时间:2013-04-26 14:05:54

标签: playframework playframework-1.x

我知道@Before@After的存在,但@After恰好在渲染模板后执行

我的几乎所有控制器都扩展了我的特定类,我想,不引人注目地,能够在我的超类中执行一些代码来检查某些条件并在后设置一些flash / renderArgs 在子类中执行代码,但渲染完成之前

实现这一目标的任何简单方法?

编辑:这是代码的片段

class MyController extends Controller {
   @After
   static void checkStage() {
      if (xyz) {
         flash.put("stage", "bla");
      }
   }
}

我的控制器都延伸MyController但由于checkStage代码被称为 AFTER ,渲染完成后,stage flash属性将呈现为下一次呈现页面的时间

实际上,我希望使用flash.now代替flash.put,但因为代码@After代码在渲染后执行,所以它永远不会显示

2 个答案:

答案 0 :(得分:2)

好吧,如果你想要最简单:只需在调用render()之前插入检查代码。这是最简单的方法!

如果你想要更复杂的东西,可以制作一个覆盖loadTemplate https://github.com/playframework/play/blob/master/framework/src/play/PlayPlugin.java#L157的插件,并用你的额外代码包装返回的模板。你需要看的另一部分是模板加载器:https://github.com/playframework/play/blob/master/framework/src/play/templates/TemplateLoader.java#L58 - 看起来非常复杂,但可以工作。

也许您应该解释为什么要尝试执行此预渲染代码 - 可能有更好的方法。


编辑:好的,我知道你要做什么。是的,一旦发送请求,您就无法修改cookie(也就是闪存)。我建议你避免使用cookie来维护事务之间的状态 - 每个变量都会添加到HTTP事务中,并在每次请求时发送。

相反,我建议您使用Cache.set(Session.getId(),map)并将所有状态值放在Map中。然后我想你可以在@After

期间保存它们

这里的例子; http://www.playframework.com/documentation/1.2.5/controllers#session

答案 1 :(得分:0)

免责声明:自从我使用Play 1.x以来,已经有一段时间了,带上了一粒盐

如果我理解你想做类似的事情:

public static void myMethod() {
   // myMethod code here

   // some common code here

   renderTemplate("myTemplate.html", id, client);
}

您应该能够将此公共部分提取到父控制器上,方法如下:

public static void renderMyTemplate(String template, Object... params){
   // some common code here
   renderTemplate(template, params);
}

并通过调用此方法替换您对render的调用。这应该解决你的问题。