2

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

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

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

谢谢

4

2 回答 2

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 注入其中。

于 2013-07-26T15:09:08.337 回答
0

第一个解决方案:

我没有尝试过,但可以像在构造函数中创建 ModelAndView 对象或你总是调用的地方,设置你总是想传递的对象作为默认值。在相应的方法中调用 setViewName() 并添加要设置的相应对象。

第二种解决方案:

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

于 2013-07-26T15:07:43.787 回答