拦截Spring MVC 3中的视图/响应

时间:2010-07-20 17:05:03

标签: java spring spring-mvc

我是Spring MVC 3的新手,我理解基本概念。我能够做一些简单的事情,比如创建控制器,服务和视图。但是,我还没有进入更先进的领域。因此,如果这个问题看起来很愚蠢(或不可能),我会道歉。

我想知道是否有办法拦截视图和/或响应并在将其发送到客户端之前对其进行修改?我想这就是Spring在向客户端发出的过程中执行数据绑定以形成元素的方式。我想要做的是检查域类中元素的注释,并根据这些注释修改视图。这将涉及在响应中注入新代码(HTML或Javascript)。

更新

当我想到这一点时,我意识到最终的渲染是由JSP完成的。所以我想问题是,是否有一种方法可以在模型移出页面之前拦截模型,并找出数据被绑定到bean上的注释。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:8)

您可能正在寻找的类是org.springframework.web.servlet.HandlerInterceptor您可以在该接口上实现postHandle方法,并且如签名所示,可以访问请求和响应,以及模型映射控制器创建的对象。 (和控制器本身,这就是Object handler参数。)

你可以通过将它们添加到调度程序servlet中的处理程序映射来启用它们。

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <bean class="a.package.MyHandlerInterceptor"/>
        </list>
    </property>
</bean>

顺便提一下,绑定实际上是在HandlerAdapter内部完成的,它定位了Controller方法并调用它们,它不是拦截器。

编辑: 要回答您的编辑,是的,在控制器完成之后,在进入JSP渲染之前,您有机会获取模型对象并使用它。所以你可以做一些事情,比如把你的myCustomScript添加到ModelMap并在你的jsp的${myCustomScript}中抛出<head>,从ModelMap中获取一个支持对象并检查它,等等等

答案 1 :(得分:5)

是的,实际上有很多方法:

  • spring mvc拦截器(在mvc docs中搜索它们) - 您可以定义preHandle / postHandle方法并将拦截器应用于多个控制器
  • spring aop - 定义在给定控制器的方法之前/之后执行的方面
  • servlet过滤器 - 这是最不可取的选项,因为它没有与spring集成 - 你不能注入依赖项。