Servlet中/和/*的区别详解

Servlet中/和/*的区别详解

问题

在搭建springmvc项目时,DispatcherServlet配置为/*welcome-file-list失效了报404异常,
配置为/时可以正常访问,下面记录问题排查过程所涉及关于servlet的知识

    <!-- welcome-file-list 配置-->    
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

Servlet的<url-pattern/>匹配方式

  1. 精确匹配

    无通配符的精确字符串。如:

           <url-pattern>/api/demo1</url-pattern>
           <url-pattern>/api/demo2</url-pattern>
    
  2. 路径匹配

    /开头,且以/*结尾。如:

          <url-pattern>/api/*</url-pattern>   
    
  3. 后缀名匹配

    *.开头(该模式以*.开头,后面的是常量,即使是*也是常量。比如*.*匹配的后缀必须是
    .*而不能是其它)。如:

          <url-pattern>*.jsp</url-pattern>   
          <url-pattern>*.do</url-pattern>   
    
  4. 缺省匹配

    固定值/(也是DefaultServlet的配置)。如:

        <url-pattern>/</url-pattern>   
    

匹配顺序

越精确越优先,越模糊越靠后,优先级从高到底排序为:精确匹配 > 路径匹配 > 后缀名匹配 > 缺省匹配

Tomcat内置servlet配置

Tomcat在$ CATALINA_BASE/conf/web.xml中默认定义了两个Servlet:DefaultServlet
JspServlet

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- The mappings for the JSP servlet -->
    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

问题分析

  • 原因

DispatcherServlet配置/时,匹配的优先级比JspServlet低,所以能正常打开页面。
配置为/*时,匹配优先级比JspServlet高,但springmvc中没有对应的试图映射,所以出现404异常。

  • 解决

welcome-file-list中增加index.do的配置

参考文章

Servlet中/和/*的区别详解

关于welcome-file-list(欢迎页)不起作用的解决办法

posted @ 2024-05-28 23:32  7256  阅读(167)  评论(0)    收藏  举报