Java Play框架是否支持;片段;?

Java Play框架是否支持;片段;?,java,playframework,Java,Playframework,如果我想在多个页面上拥有一个通用的UI,比如一个菜单,那么推荐的方法是什么 它将包含模板代码和后端控制器(类似于LiftWeb框架中的“片段”) 我知道Play有一个菜单模块,但我更感兴趣的是如何实现这一点。有两种方法可以将公共视图代码包含到Play框架中 您可以使用{include}标记或{extends}标记 顾名思义,extends标记从父视图扩展而来。默认情况下,创建新应用程序时,在Play设置的框架代码中使用extends标记。它扩展了main.html。您可以在这里添加代码 incl

如果我想在多个页面上拥有一个通用的UI,比如一个菜单,那么推荐的方法是什么

它将包含模板代码和后端控制器(类似于LiftWeb框架中的“片段”)


我知道Play有一个菜单模块,但我更感兴趣的是如何实现这一点。

有两种方法可以将公共视图代码包含到Play框架中

您可以使用
{include}
标记或
{extends}
标记

顾名思义,extends标记从父视图扩展而来。默认情况下,创建新应用程序时,在Play设置的框架代码中使用extends标记。它扩展了main.html。您可以在这里添加代码

includes标记允许您在指定点将公共视图代码注入模板。这与php include/require或jsp include工作在很大程度上是一样的

当模板代码还需要来自模型的数据或逻辑(通过控制器)时,问题就会出现。如果是这种情况,那么您需要在控制器中使用@Before或@With符号,以确保每次都执行控制器代码的公共部分。可以将任何数据添加到“渲染器”列表中,以便在视图中使用

使用渲染器的一个简单示例是

@Before
private static void commonData() {
    // do your logic here
    renderArgs.put("menu", menu);
    renderArgs.put("selected", selectedMenuItem);
}

您输入到renderArgs(菜单和示例中选择的)中的值将可用,就像您将它们传递到renderArgs方法一样。

谢谢-您能给我指出任何使用renderArgs的示例代码吗?@Codemwnci我在renderArgs{}中得到空/空值。成功登录后,我在renderags中存储了一个映射,并使用renderags.get(login_det').toString()在控制台中打印了所有值。当我在另一个控制器中使用相同的方法时,我得到的渲染器是{}。这里可能有什么问题。它是相同操作的一部分吗?您是否使用@Before将数据存储在渲染器中?请记住,渲染器仅在请求的长度内有效,因此它将在下一个请求中丢失。还请记住,如果您从一个操作中调用另一个操作,它将强制HTTP重定向,这是另一个请求,因此renderArgs将被重置。@Codemwnci我在登录期间在一个单独的函数中设置值,该函数是@Before private static void commonData(){Map cacheMap=Cache.get(“login_det”,Map.class);如果(cacheMap!=null){renderags.put(“login_det”,cacheMap);System.out.println(“commonData”+renderags.toString());}}@Codemwnci在我的CustomerList控制器函数中,我打印了缓存和renderags.toString()。Cahce仍然有值,但renderags是{}