关于前端控制器中映射路径/与/*的理解

1、楔子

       在web项目中,常常需要用到前端控制器,前端控制器用于拦截请求,然后根据不同的请求做出不同的处理,以下主要针对/与/*的区别作出解释:

       ,是一个springmvc的前端控制器,如果不引入springmvc的参数,与javaweb中无异。其中 url-pattern属性(url模式)用于指定前端控制器拦截的请求url模式。


    <servlet>
        <servlet-name>DispatcherServletservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:springmvc.xmlparam-value>
        init-param>
        <load-on-startup>1load-on-startup>
    servlet>

    <servlet-mapping>
        <servlet-name>DispatcherServletservlet-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>defaultservlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
        <init-param>
            <param-name>debugparam-name>
            <param-value>0param-value>
        init-param>
        <init-param>
            <param-name>listingsparam-name>
            <param-value>falseparam-value>
        init-param>
        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>defaultservlet-name>
        <url-pattern>/url-pattern>
    servlet-mapping>
    
    <servlet>
        <servlet-name>jspservlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServletservlet-class>
        <init-param>
            <param-name>forkparam-name>
            <param-value>falseparam-value>
        init-param>
        <init-param>
            <param-name>xpoweredByparam-name>
            <param-value>falseparam-value>
        init-param>
        <load-on-startup>3load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>jspservlet-name>
        <url-pattern>*.jspurl-pattern>
        <url-pattern>*.jspxurl-pattern>
    servlet-mapping>
    
    
    
  • 当url-pattern为"/*"时:
    拦截所有请求和页面: 无论是路径请求还是页面请求都会被拦截,假设当前请求没有对应的handle方法,那么该请求就会交由tomcat里的DefaultServlet进行处理,DefaultServlet根据请求响应对于页面后,这个页面又会被我们设置的/*拦截,这样就会造成404的异常

引用文章:
SpringMVC中拦截/和拦截/*的区别,访问静态资源
Spring中拦截/和拦截/*的区别 - 不能访问到返回的JSP - 访问静态资源(jpg,js等)
/ /* /**的区别

你可能感兴趣的:(JavaWeb,servlet,java)