2009-11-02 65 views
1

在MVC应用程序的多个视图之间共享公共对象的最佳方式是什么?假设我有一个LoginController,它接受用户名和密码并对用户进行身份验证并加载其数据(帐户信息,全名等)。我想在每个页面上显示此内容 - 例如“Welcome <user name>”的标题,您的账户中有<account value>。“我认为我不应该将该用户对象存储在会话中。每个控制器都必须返回吗?如何在MVC应用程序的多个视图中显示公共信息?

我对这个应用程序使用Spring框架,但我认为不重要。必须有一些通用的方式来处理这个常见的用例。

更新

不知道这事,但我还需要用户名作为参数到其他控制器(主键返回在登录时)。由于这只是返回但未显示的用户对象的另一个值,因此我认为答案与显示的数据相同。

+0

我认为这个框架很重要 - 它会帮助某个人(他知道java比我更好)为你提供更快的答案。在asp.net-mvc版本中,我们使用html助手来呈现常见的UI元素(例如登录欢迎我们描述) – 2009-11-02 17:06:58

回答

2

你并不真正分享共同的对象 - 这是常见的数据(是的,被对象包裹)。比方说,你有一个最小的UserInfo类和一个相应的模板片段来显示它。该片段将包含在您的观点中。

但无论框架(以及如何将这个常见片段添加到视图中),框架/模板引擎都需要找到'userInfo'绑定并获取必需的字段。

除非您打算在每个页面请求中打开您的(db)后端以获取该信息,否则您需要将其缓存。通常这将在会议中。

1

如果有相当多的逻辑与通用元素相关联,那么使用ServletRequest.getRequestDispatcher()又名<jsp:include />执行子请求可能会更容易,那么您可以通过“子控制器”再次完成整个请求处理循环,和“子视图”。

编辑:看看Spring MVC HandlerInterceptor小号

0

我之前在Spring MVC应用程序由具有HandlerInterceptorJavadoc link)处理这个确切的使用情况下添加这些细节ModelAndView的所有页面中我需要它。

由于HandlerInterceptor的整个目的是能够通过一段代码将许多请求和/或响应应用于通用功能,所以这是非常合适的。拦截器允许您挂接控制器的预处理或后处理步骤;并且您可以将您的UrlHandlerMapping配置为只将拦截器应用于某些URL(或URL的模式),如果您愿意的话。

+0

这看起来有助于通用逻辑,但是如何从HandlerInterceptor访问用户信息?我必须将它存储在HandlerInterceptor可访问的所有视图中,对吧? – 2009-11-02 17:27:28

+0

是的。如果你正在使用Spring Security,那么当前线程的主体很容易获得(静态的,这可能会让人觉得奇怪) - SecurityContextHolder.getContext()。getAuthentication()。getPrincipal() – 2009-11-02 17:49:57

相关问题