在mvc应用程序中,在多个视图之间共享公共对象的最佳方式是什么?假设我有一个logincontroller,它接受用户名和密码,对用户进行身份验证并加载他们的数据(帐户信息、全名等)。我想在每一页上都显示这个-类似于带有“欢迎”的标题 <user name
>,你有 <account value
>我不认为我应该把用户对象存储在会话中。我必须把它和每个控制器一起退回吗?
我在这个应用程序中使用spring框架,但我认为这并不重要。必须有一些通用的方法来处理这个常见的用例。
更新
不确定这是否重要,但我还需要userid(登录时返回的主键)作为其他控制器的参数。因为这只是返回的用户对象上的另一个值,但没有显示,所以我认为答案与显示的数据相同。
3条答案
按热度按时间mftmpeh81#
我以前在springmvc应用程序中通过使用
HandlerInterceptor
(javadoc链接)将这些细节添加到modelandview中我需要它的所有页面。因为
HandlerInterceptor
就是能够通过一段代码将公共功能应用于许多请求和/或响应,这是一种自然的适合。拦截器允许您钩住控制器的前处理或后处理步骤;您可以配置UrlHandlerMapping
如果愿意,只将拦截器应用于某些url(或url的模式)。lnvxswe22#
您并没有真正共享公共对象—这是公共数据(是的,由对象 Package )。假设您有一个最小的userinfo类和一个相应的模板片段来显示它。该片段将包含在您的视图中。
但是不管框架是什么(以及如何将这个公共片段添加到视图中),框架/模板引擎都需要找到一个“userinfo”绑定并获取所需的字段。
除非您计划在每个页面请求上点击(db)后端以获取该信息,否则您将需要缓存它。通常这将在会话中进行。
ar5n3qh53#
如果有相当多的逻辑与公共元素相关联,那么使用
ServletRequest.getRequestDispatcher()
又称作<jsp:include />
,然后您可以使用“子控制器”和“子视图”再次完成整个请求处理周期。编辑:看SpringMVC
HandlerInterceptor
s