Java 如何在MVC应用程序的多个视图中显示公共信息?

Java 如何在MVC应用程序的多个视图中显示公共信息?,java,model-view-controller,language-agnostic,spring-mvc,Java,Model View Controller,Language Agnostic,Spring Mvc,在MVC应用程序中,在多个视图之间共享公共对象的最佳方式是什么?假设我有一个LoginController,它接受用户名和密码,对用户进行身份验证并加载他们的数据(帐户信息、全名等)。我想在每一页上都显示这一点——类似于带有“Welcome”的标题,您的帐户中有。“我认为我不应该只在会话中存储该用户对象。我是否必须将其与每个控制器一起返回 我正在为这个应用程序使用Spring框架,但我认为这并不重要。必须有一些通用的方法来处理这个常见的用例 更新 不确定这是否重要,但我还需要UserID(登录时

在MVC应用程序中,在多个视图之间共享公共对象的最佳方式是什么?假设我有一个LoginController,它接受用户名和密码,对用户进行身份验证并加载他们的数据(帐户信息、全名等)。我想在每一页上都显示这一点——类似于带有“Welcome
”的标题,您的帐户中有
。“我认为我不应该只在会话中存储该用户对象。我是否必须将其与每个控制器一起返回

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

更新


不确定这是否重要,但我还需要UserID(登录时返回的主键)作为其他控制器的参数。由于这只是返回但未显示的用户对象上的另一个值,我认为答案将与显示的数据相同。

如果有相当多的逻辑与公共元素关联,则使用
ServletRequest.getRequestDispatcher()
aka
执行子请求可能更容易,然后,您可以使用“子控制器”和“子视图”再次完成整个请求处理周期


编辑:查看Spring MVC
HandlerInterceptor
s

我以前在Spring MVC应用程序中处理过这个确切的用例,方法是让a()为我需要的所有页面将这些细节添加到ModelAndView中


由于
HandlerInterceptor
的全部目的是能够通过一段代码将通用功能应用于许多请求和/或响应,因此这是一种自然的适合。拦截器允许您钩住控制器的前处理或后处理步骤;如果愿意,您可以将
UrlHandlerMapping
配置为仅将拦截器应用于某些URL(或URL模式)。

您并不是真正共享公共对象-这是公共数据(是的,由对象包装)。假设您有一个最小的UserInfo类和一个相应的模板片段来显示它。该片段将包含在您的视图中

但不管框架如何(以及如何将这个公共片段添加到视图中),框架/模板引擎都需要找到“userInfo”绑定并获取所需字段


除非您计划在每个页面请求上点击(db)后端以获取该信息,否则您将需要缓存它。通常情况下,这将在会话中进行。

我认为框架确实很重要-它将帮助某些人(比我更了解java)更快地获得答案。在asp.net-mvc land中,我们使用html帮助程序呈现公共UI元素(如登录欢迎u r描述),这些元素看起来有助于公共逻辑,但如何从HandlerInterceptor访问用户信息?我必须把它存放在一个可以让手持截取器访问所有视图的地方,对吗?是的。如果您使用的是Spring安全性,那么线程的当前主体很容易获得(静态地,这可能会让人感到奇怪)-SecurityContextHolder.getContext().getAuthentication().getPrincipal()