5

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

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

有什么简单的方法可以实现这一目标吗?

编辑:这是代码片段

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

我的控制器都扩展MyController了,但是由于在渲染完成checkStage调用了代码,因此下次渲染页面时将渲染 flash 属性stage

实际上,我想使用flash.now而不是flash.put,但是因为代码@After代码是在渲染之后执行的,所以它永远不会出现

4

2 回答 2

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(也称为 flash)。我建议您避免使用 cookie 来维护事务之间的状态 - 每个变量都添加到 HTTP 事务中并在每个请求中发送。

相反,我建议您使用 Cache.set(Session.getId(), map) 并将所有状态值放入 M​​ap 中。然后我认为您可以在@After 期间保存它们

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

于 2013-05-07T05:34:01.727 回答
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通过调用此方法替换您的调用。这应该可以解决您的问题。

于 2013-05-07T10:45:57.437 回答