Spring MVC配置DispatcherServlet拦截路径的理解(转载)

使用Spring MVC,配置DispatcherServlet是第一步。
DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet。
DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。
“某某规则”:是根据你使用了哪个HandlerMapping接口的实现类的不同而不同。
先来看第一个例子:
Xml代码

<load-on-startup>1</load-on-startup>是启动顺序,让这个Servlet随Servletp容器一起启动。
<url-pattern>*.form</url-pattern>会拦截*.form结尾的请求。
<servlet-name>example</servlet-name>这个Servlet的名字是example,可以有多个DispatcherServlet,是通过名字来区分的。每一个DispatcherServlet有自己的WebApplicationContext上下文对象。同时保存的ServletContext中和Request对象中,关于key,以后说明。
在DispatcherServlet的初始化过程中,框架会在web应用的WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml的配置文件,生成文件中定义的bean。
第二个例子:
Xml代码

指明了配置文件的文件名,不使用默认配置文件名,而使用springMVC.xml配置文件。
其中<param-value>**.xml</param-value>这里可以使用多种写法
1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml
2、<param-value>/WEB-INF/classes/springMVC.xml</param-value>
3、<param-value>classpath*:springMVC-mvc.xml</param-value>
4、多个值用逗号分隔
Servlet拦截匹配规则可以自已定义,Servlet拦截哪种URL合适?
当映射为@RequestMapping("/user/add")时:
1、拦截*.do,例如:/user/add.do,弊端:所有的url都要以.do结尾。不会影响访问静态文件。
2、拦截/app/*,例如:/app/user/add,弊端:请求的url都要包含/app,@RequestMapping("/user/add")中不须要包含/app。
3、拦截/,例如:/user/add,弊端:对jpg,js,css静态文件的访问也被拦截不能正常显示。后面有解决办法。
4、拦截/*,可以走到Action中,但转发到jsp时再次被拦截,不能访问到jsp。
Spring MVC拦截器是一种可插拔的组件,它可以在请求到达控制器之前或者返回视图之前对请求进行处理。Spring MVC 支持单个拦截器或者多个拦截器,下面分别介绍它们的工作流程。 1. 单个拦截器的工作流程 单个拦截器的工作流程如下: - 当一个请求到达 DispatcherServlet 时,DispatcherServlet 会创建一个 HandlerExecutionChain 对象,该对象包含了一个或多个处理器拦截器和一个处理器(即控制器)。 - 在执行处理器之前,DispatcherServlet 会调用拦截器的 preHandle 方法,如果该方法返回 true,则继续执行下一个拦截器或者执行处理器。 - 在执行完处理器之后,DispatcherServlet 会调用拦截器的 postHandle 方法,该方法可以修改 ModelAndView 对象,但不能改变视图。 - 当视图渲染完成后,DispatcherServlet 会调用拦截器的 afterCompletion 方法,该方法可以进行一些资源清理操作。 2. 多个拦截器的工作流程 多个拦截器的工作流程类似于单个拦截器的工作流程,只是多了一些拦截器的调用。 - 当一个请求到达 DispatcherServlet 时,DispatcherServlet 会创建一个 HandlerExecutionChain 对象,该对象包含了多个处理器拦截器和一个处理器(即控制器)。 - 在执行处理器之前,DispatcherServlet 会按照拦截器的声明顺序调用每个拦截器的 preHandle 方法,如果有任何一个拦截器的 preHandle 方法返回 false,则停止拦截器的执行,并返回错误视图。 - 在执行完处理器之后,DispatcherServlet 会按照拦截器的声明顺序倒序调用每个拦截器的 postHandle 方法,该方法可以修改 ModelAndView 对象,但不能改变视图。 - 当视图渲染完成后,DispatcherServlet 会按照拦截器的声明顺序倒序调用每个拦截器的 afterCompletion 方法,该方法可以进行一些资源清理操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值