1、楔子
在web项目中,常常需要用到前端控制器,前端控制器用于拦截请求,然后根据不同的请求做出不同的处理,以下主要针对/与/*的区别作出解释:
这,是一个springmvc的前端控制器,如果不引入springmvc的参数,与javaweb中无异。其中 url-pattern属性(url模式)用于指定前端控制器拦截的请求url模式。
<!--配置springmvc的前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
2、不同url-pattern详解
- / : 拦截所有请求,但不会拦截页面请求(/web/index.html),也不会拦截jsp的路径(web/hello)或页面请求
- /*: 拦截所有请求(路径或页面)包括jsp,但只能拦截一层目录
- /** :与/*一样,能够拦截所有请求,能够拦截多层目录,真正意义上的拦截所有请求
3、不同url-pattern下前端控制器执行流程
-
当url-pattern为"/"时:
对于路径请求: 若是其他的路径请求,前端控制器会将其拦截,然后创建映射器去匹配控制器中对应的handle方法(过程不止这一点,这里不过多描述)
对于页面不进行拦截: 当我们直接访问一个页面资源时(如/index.html或/index.jsp),前端控制器不会拦截该请求,那么问题来了,这个请求会被怎样处理呢?in fact,在web项目中,除了我们自己配置的web.xml,tomcat中同样存在web.xml,这二者之间的关系为继承关系,若我们自己配置的web.xml解决不了,那么接下来就只能去tomcat中的web.xml中查找了。在tomcat的web.xml文件中,定义了两个servlet,如下:
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>xpoweredBy</param-name> <param-value>false</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> </servlet-mapping>
-
当url-pattern为"/*"时:
拦截所有请求和页面: 无论是路径请求还是页面请求都会被拦截,假设当前请求没有对应的handle方法,那么该请求就会交由tomcat里的DefaultServlet进行处理,DefaultServlet根据请求响应对于页面后,这个页面又会被我们设置的/*拦截,这样就会造成404的异常
引用文章:
SpringMVC中拦截/和拦截/*的区别,访问静态资源
Spring中拦截/和拦截/*的区别 - 不能访问到返回的JSP - 访问静态资源(jpg,js等)
/ /* /**的区别