我有一个播放应用程序(播放 1.2.4)。在我的应用程序的每个页面中,我都希望能够访问已登录的用户(使用 groovy)。所以我可以执行权限检查等。我试着把它放在主模板中,就在doLayout
#{set user:user/}
我可以在我的应用程序的主页中访问用户,但是当通过指向其他页面的链接时,我无法再访问用户变量。
我有一个播放应用程序(播放 1.2.4)。在我的应用程序的每个页面中,我都希望能够访问已登录的用户(使用 groovy)。所以我可以执行权限检查等。我试着把它放在主模板中,就在doLayout
#{set user:user/}
我可以在我的应用程序的主页中访问用户,但是当通过指向其他页面的链接时,我无法再访问用户变量。
我认为您对在 Play!Framework 上使用#{set}
和标记存在误解。#{get}
查看文档#{set}
和#{get}
标签。
我给你举个例子,你有三个模板,如下所示:
<html>
<head>
<title>#{get 'title' /}</title>
</head>
<body>
#{doLayout /}
</body>
</html>
#{extends 'main.html' /}
#{set title:header /}
<p>This is template1.html page</p>
#{extends 'main.html' /}
#{set title:header /}
<p>This is template2.html page</p>
控制器上的方法如下:
public static void template1() {
String header = "Template 1 Title"
render(header);
}
public static void template2() {
render();
}
这就是解释,当你渲染时template1.html
,你可能会注意到我们在 中设置了页面标题(通过使用header
变量)template1.html
。我们设置的标题是main.html
使用#{get}
on检索的main.html
。
然后看你渲染的时候template2.html
,你可能会注意到我们也设置了页面标题。但不同之处在于控制器(template2()
方法),您没有将header
变量值传递给模板。因此,尽管您设置了标题,但标题具有 null 值,并且在您渲染时未设置标题的含义template2.html
。
因此,对于您的问题,我认为当您坚持放置#{set user:user /}
模板并想要访问user
变量时,您必须在渲染模板之前将user
变量传递给所有控制器方法。呃..效率太低了!
建议
我建议您可以使用
session
来存储用户数据userid
,因为它可以在您的所有应用程序模板中访问!请在此处查看文档。
希望这可以使您了解机制,并且会如此