在布局上获取域变量

时间:2011-12-16 12:17:48

标签: layout grails

在Grails中将模型变量传递给布局的最佳方法是什么?具体来说,我正在使用具有User类的Spring安全插件。我也有Contact类,如下所示:

class Contact {

    String realname
    String company
    String mobile
    String fix
    String email
    User user
        ...

在我的布局(main.gsp)中获取当前登录人员公司的选项有哪些?

3 个答案:

答案 0 :(得分:1)

你的意思是你需要自动地为每个页面传递这个模型,而不是在每个控制器的渲染时手动传递它吗?您可以在那里使用filters

def filters = {
    all(controller: '*', action: '*') {
        before = {
            request.setAttribute('loggedInPerson', SecurityContextHolder.context.authentication?.principal)
            //Notice, that there is used original Authentication, from Spring Security
            //If you need you can load your Contact object there, or something
        }
        after = {

        }
        afterView = {

        }
    }
}

并在你的gsp上使用loggedInPerson

Hello ${loggedInPerson.username}!

顺便说一句,还有Spring Security tags,可以帮助您而不使用自己的过滤器,例如:

Hello <sec:loggedInUserInfo field="username"/>!

答案 1 :(得分:1)

要添加上述答案,您可以在登录任何控制器方法时为用户设置会话变量。

您也可以在控制器方法中为公司设置会话变量:

session.company = Contact.findByUser(session.user)?.company

或来自上面的例子

   session.company = Contact.findByUser(SecurityContextHolder.context.authentication?.principal)?.company

在你的main.gsp中,例如:

<span id="companyName">${session.company}</span>

答案 2 :(得分:0)

如果要将某个对象添加到模型中,还可以使用grails提供的“拦截器”。要将特定变量添加到特定控制器,您可以使用类似的内容。

def afterInterceptor = {model, modelAndView->

    model.loggedInUser = getLoggedInUser()  // retrieve your user details here

}

您可以在main.gsp布局中将loggedInUser检索为${loggedInUser}

如果您需要在多个控制器中获取这些详细信息,可以创建BaseController并将afterInterceptor保留在此BaseController中。需要在相应视图中引用登录用户的所有控制器都应扩展BaseController