Spring MVC:默认视图对象

时间:2013-07-26 14:59:47

标签: java spring spring-mvc

我像所有人一样使用ModelAndView对象:

ModelAndView result = new ModelAndView("view");
result.addObject("requests", requestsService.getListByBackoffice(filter, page, Config.RECORDS_PER_PAGE));

但是我注意到我在大多数视图中总是使用了几个对象。所以问题是 - 是否有任何解决方案来创建某种默认分配的对象,这些对象会自动传递给视图?

谢谢

2 个答案:

答案 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 Filterweb.xmlWebApplicationInitializer)。过滤器只是在分派给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()并添加要设置的相应对象。

第二个解决方案:

编写一个添加该默认对象的方法,并在任何需要的地方调用该方法(除了拦截器之外什么都没有)。