SpringMVC拦截器是什么
SpringMVC拦截器是对Handler的一个功能扩展。对Handler方法执行前后的一个处理。
怎么写一个SpringMVC拦截器
当一个类实现HandlerInterceptor接口,它就是一个符合拦截器规范的一个拦截器。
实现代码
public class Interceptor01 implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {//在Handler之前执行。返回值为boolean,true表示继续执行后面的拦截器或者Handler,false表示默认不对页面进行操作,显示空白页面。所以当我们返回false时就是用户的请求有错误。应该有友善的提示信息。
System.out.println("preHandler-----Interceptor01");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {//Handler执行完成后,执行该方法。
System.out.println("postHandle-----Interceptor01");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {//当所有拦截器的postHandle方法执行完毕后,执行该方法。记住是所有的拦截器postHandle方法执行完毕。
System.out.println("afterCompletion-----Interceptor01");
}
}
配置SpringMVC拦截器
注意:拦截器的作用域为当前的处理器映射器。拦截器的作用域很重要,不同的拦截器映射器无法共享拦截器,只有重新配置。
创建Handler:
public class ItemController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("Execute Handler");
return null;
}
}
把Handler对象让Spring容器进行管理:
<bean id="itemsListId" class="cn.domarvel.controller.ItemController"></bean>
让SpringMVC拦截器对象被Spring容器进行管理:
<bean id="interceptor01" class="cn.domarvel.interceptor.Interceptor01"></bean>
把拦截器配置到映射器当中:
<!-- 简单url映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="interceptor01"/>
</list>
</property>
<property name="mappings">
<props>
<!-- 对itemsListId进行url映射,url是/showItemsList1.action -->
<!-- 对同一个Handler后端处理器可以配置多个url进行解析 -->
<!-- 多个映射处理器类可以共存,并且可以写相同的url -->
<!-- 先匹配到url的处理器映射器来返回Handler,后面的就不会再返回了。匹配顺序根据处理器映射器的顺序来的。因为Spring的容器是一个LinkedHashMap类型,一个有序但是不能重复的map集合。(通过查看源码知道的) -->
<prop key="showItemsList1.action">itemsListId</prop>
<prop key="showItemsList2.action">itemsListId</prop>
<prop key="showItemsList*.action">itemsListId</prop>
<prop key="item*.action">itemOperationSet</prop>
</props>
</property>
</bean>
部署服务,之后访问相关的页面就行了。
比如我这里访问:http://localhost:8080/SpringMVC/showItemsList2232.action
输出结果:
preHandler-----Interceptor01
Execute Handler
postHandle-----Interceptor01
afterCompletion-----Interceptor01
嗯,非常Nice!!