我有一个播放应用程序(Play 1.2.4)。在我的应用程序的每个页面中,我想要访问登录用户(使用groovy)。所以我可以执行权限检查等。我试图将它放在doLayout
#{set user:user/}
我可以在我的应用程序的主页面中访问该用户,但在浏览其他页面的链接时,我无法再访问该用户变量。
答案 0 :(得分:1)
我认为您对在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}
在main.html
上检索的。
然后在渲染template2.html
时查看,您可能会注意到我们也设置了页面标题。但区别在于控制器(在template2()
方法上),您尚未将header
变量值传递给模板。因此,虽然您已设置标题,但标题具有空值,并且在您呈现template2.html
时未设置标题的含义。
因此,对于您的问题,我认为当您坚持将#{set user:user /}
放在模板上并希望访问user
变量时,您必须在所有控制器上传递user
变量方法在渲染模板之前。呃..效率太低了!
建议
我建议您使用
session
来存储用户数据,例如userid
,因为它可以在所有应用模板中访问!请查看文档here。
希望这可以让你理解机制,并且会这样