Playframework 在呈现拦截器类型之前的操作后(播放1.x)

Playframework 在呈现拦截器类型之前的操作后(播放1.x),playframework,playframework-1.x,Playframework,Playframework 1.x,我知道存在@Before和@After,但是@After恰好在呈现模板之后执行 几乎我所有的控制器都扩展了我的一个特定类,我希望能够在我的超类中执行一些代码,在执行子类中的代码之后,在渲染完成之前,检查一些条件并设置一些flash/renderags 有什么简单的方法可以做到这一点吗 编辑:下面是一段代码 class MyController extends Controller { @After static void checkStage() { if (xyz) {

我知道存在
@Before
@After
,但是
@After
恰好在呈现模板之后执行

几乎我所有的控制器都扩展了我的一个特定类,我希望能够在我的超类中执行一些代码,在执行子类中的代码之后,在渲染完成之前,检查一些条件并设置一些flash/renderags

有什么简单的方法可以做到这一点吗

编辑:下面是一段代码

class MyController extends Controller {
   @After
   static void checkStage() {
      if (xyz) {
         flash.put("stage", "bla");
      }
   }
}
我的控制器都扩展了MyController,但由于在渲染完成后调用了
检查阶段
代码,因此下一次渲染页面时,
阶段
闪存属性将被渲染


实际上,我想使用
flash.now
而不是
flash.put
,但是因为
之后的代码是在渲染之后执行的,所以它永远不会显示出来。如果您想要最简单的方法,只需在调用render()之前插入检查代码即可。这是最简单的方法

如果您想要更复杂的东西,可以制作一个插件,覆盖
loadTemplate
,并将返回的模板与额外的代码打包。您需要了解的另一部分是模板加载器:-看起来非常复杂,但可以工作

也许你应该解释一下为什么你要做这个预渲染代码——可能有更好的方法


编辑:好的,我知道你想做什么了。是的,一旦发送请求,您就不能修改cookie(也称为flash)。我建议您避免使用cookies来维护事务之间的状态-每个变量都会添加到HTTP事务中,并在每个请求中发送

相反,我建议您使用Cache.set(Session.getId(),map)并将所有状态值放入映射中。那我想你可以在@After的时候救他们


这里的例子

免责声明:我已经有一段时间没有使用Play1.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
的调用替换为对该方法的调用。这应该可以解决您的问题。

这只是一个快速解决方案的想法:为什么不创建一个
Controller
的子类,在这个子类中,您可以用想要执行的内容覆盖
render()
方法,并调用
Controller
render()
,然后让你的控制器继承
你的FancyController
而不是
控制器
?这不适用于重定向,因为代码是在超类中执行的,我添加了一些代码并澄清了我想做的事情嗯,我有一个想法-你可以在模板本身中做这件事。假设您的模板扩展了一个基础模板(例如,默认播放项目中的main.html)?你可以在模板中调用你的额外逻辑。我确实尝试了很多东西,但游戏的内部“魔力”使它很难搞乱控制器(静态方法、局部变量名解析等等)。。。我想我会做快速肮脏的“模板中的代码”解决方案,至少现在是这样。是的,我想这是你能做的最好的了。请看我最后的编辑,我认为很可能你不应该使用flash/session(又名cookies)来管理状态。我不是在管理状态,只是(通过flash)向用户添加一些通知拦截器代码在超类中执行,我添加了一些代码并澄清了我想要的内容do@Shaga我不明白你的问题。想法是消除
之后的
,而是在超类中创建该帮助器方法,添加公共代码并使用
renderTemplate
为您的控制器请求呈现正确的模板我正在寻找的是一种不需要我更改子控制器的方法,前后都有,但我认为不是这样exist@Shaga不幸的是,我认为没有其他选择,除非您通过创建新的注释(在需要时运行)来破解框架