我知道@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
代码在渲染后执行,所以它永远不会显示
答案 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
的调用。这应该解决你的问题。