And*_*esQ 5 playframework playframework-1.x
我知道的存在@Before
和@After
,但@After
发生在模板的渲染之后执行
几乎所有的控制器都扩展了我的特定类,我想,不引人注目地,能够在我的超类中执行一些代码来检查某些条件,并在子类中执行代码后设置一些flash/renderArgs ,但是在渲染完成之前
任何简单的方法来实现这一点?
编辑:这是一段代码
class MyController extends Controller {
@After
static void checkStage() {
if (xyz) {
flash.put("stage", "bla");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的控制器都扩展了,MyController
但由于checkStage
代码在渲染完成后被调用,stage
因此下次渲染页面时将呈现flash属性
实际上,我想使用flash.now
而不是flash.put
,但因为代码@After
代码在渲染后执行,它永远不会出现
好吧,如果你想要最简单的:只需在调用 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(又名 flash)。我建议您避免使用 cookie 来维护事务之间的状态 - 每个变量都会添加到 HTTP 事务中并在每个请求上发送。
相反,我建议您使用 Cache.set(Session.getId(), map) 并将所有状态值放入 Map 中。然后我想你可以在 @After 期间保存它们
示例在这里;http://www.playframework.com/documentation/1.2.5/controllers#session