我像所有人一样使用ModelAndView对象:
ModelAndView result = new ModelAndView("view");
result.addObject("requests", requestsService.getListByBackoffice(filter, page, Config.RECORDS_PER_PAGE));
但是我注意到我在大多数视图中总是使用了几个对象。所以问题是 - 是否有任何解决方案来创建某种默认分配的对象,这些对象会自动传递给视图?
谢谢
答案 0 :(得分:4)
您可以在HandlerInterceptor
注册DispatcherServlet
。然后,您实现postHandle()
方法:
public class CustomInterceptor extends HandlerInterceptorAdapter /* which implements HandlerInterceptor */ {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
modelAndView.addObject("myObject", new Object());
// add as many as you wish
}
}
注意:ModelAndView
对象可能是null
。如果您的处理程序方法直接写入响应主体,例如使用@ResponseBody
。
根据您在注册拦截器时使用的url模式,postHandle()
将被调用并使用您想要的任何对象填充模型。
您还可以注册servlet Filter
(web.xml
或WebApplicationInitializer
)。过滤器只是在分派给servlet之前添加请求属性。
public class CustomFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setAttribute("myObject", new Object());
chain.doFilter(request, response);
}
// ... init and destroy methods
}
注意:在请求生命周期的某个时刻,Spring会将model
中的所有属性添加到您的请求属性中。
此处的缺点是,无论@Controller
是否有效,都会添加属性,因为Filter
在Spring DispatcherServlet
之前被调用。此外,Filter
由您的servlet容器管理(存在变通方法),因此很难将Spring bean注入其中。
答案 1 :(得分:0)
第一个解决方案:
我没有尝试过这样做,但可以像在Constructor中创建ModelAndView对象一样,或者在你总是调用的地方创建,只设置默认传递的对象。 在相应的方法中调用setViewName()并添加要设置的相应对象。
第二个解决方案:
编写一个添加该默认对象的方法,并在任何需要的地方调用该方法(除了拦截器之外什么都没有)。