注意:这里的对象名和对象类型都是java类中使用的,可以去看源码
匹配优先级如下,排在前面的优先级高 匹配规则对象名对象类型映射特征(url-pattern)精确匹配exactWrappers数组具体路径,例如:/hello前缀匹配wildcardWrappers数组以/*结尾,例如:/*,/hi/*扩展名匹配extensionWrappers数组以*.开头,例如:*.jsp,*.html默认匹配defaultWrapper一个对象/,其它匹配都无法匹配时,使用默认匹配 tomcat自带的web.xml配置了welcome-file-list节点,该节点的子节点即为默认访问页面(welcome-file),welcome-file配置的顺序会影响到实际的默认访问,我们可以在自己的web.xml文件中配置welcome-file-list节点以覆盖tomcat自带的,tomcat自带的web.xml中配置的welcome-file-list节点如下 index.html index.htm index.jsp 如果是默认访问,即请求根路径(ip:port/项目名/) 时,如果我们自定义的servlet没有配置“/*”前缀匹配,那么请求路径无法依据精确匹配、前缀匹配及扩展名匹配被任何servlet匹配到,此时会增加一个资源文件(welcomeResources)匹配方式,先拼接welcome-file的值再进行如上三种匹配,具体规则如下: 1、如果只有一个welcome-file时,直接将welcome-file的值拼接到根目录后面进行匹配 2、如果存在多个welcome-file时,按照顺序依次尝试,如果依据精确匹配、前缀匹配方式可以找到对应的servlet或者物理真实存在该文件,则使用该welcome-file的值拼接到根目录后面进行匹配,如果不存在这样的welcome-file,则使用第一个welcome-file的值拼接到根目录后面进行匹配。 注意:这里说的物理真实存在表示,在项目的webapp文件夹下存在这样的文件,即文件名和后缀与welcome-file的值相同 三、实例验证仍然使用 前文提到的项目 ,servlet和项目结构都不变。项目的web.xml发生变化,覆盖tomcat自带的web.xml的welcome-file-list,现在web.xml内容如下:
helloServlet xin.yangshuai.servlet.HelloServlet 1 hiServlet xin.yangshuai.servlet.HiServlet 1 index.html index.htm index.jsp 1、servlet配置了/*映射,则用此servlet来处理默认访问 web.xml helloServlet /index.html helloServlet /index.jsp helloServlet / hiServlet /*运行结果:hiServlet配置了/*映射,则由hiServlet来处理默认访问
2、servlet没有配置/*映射,只有一个welcome-file时,则直接将welcome-file的值拼接到根目录后面进行匹配 web.xml index.html helloServlet *.html helloServlet /index.jsp helloServlet / hiServlet /index.html运行结果:没有servlet配置/*,只有一个welcome-file,值为index.html,则默认访问相当于:http://localhost:8080/first_page/index.html,hiServlet配置的精确匹配,所有由hiServlet来处理默认访问。
3、其实welcome-file不用写成一个页面的样子,可以随意的写,可以没有后缀,可以有层级。 web.xml hh/index.html helloServlet *.html helloServlet /hh/* helloServlet / hiServlet /hh/index.html运行结果::没有servlet配置/*,只有一个welcome-file,则默认访问相当于:http://localhost:8080/first_page/hh/index.html,hiServlet配置的精确匹配,所以由hiServlet来处理默认访问。 注意:没有精确匹配时,也会寻找可以进行前缀匹配、扩展名匹配的servlet进行匹配。
servlet没有配置/*映射,如果存在多个welcome-file时,按照顺序依次尝试,如果存在依据精确匹配、前缀匹配方式获取的servlet或者物理真实存在该文件,则使用该welcome-file的值拼接到根目录后面进行匹配,如果不存在这样的welcome-file,则使用第一个welcome-file的值拼接到根目录后面进行匹配。 注意:存在多个welcome-file,默认请求尝试拼接welcome-file的值时,是不考虑扩展名匹配的。 4、尝试拼接:依据物理真实存在文件 web.xml index.html index.htm index.jsp helloServlet *.html hiServlet /hi运行结果:没有servlet配置/*,存在多个welcome-file时,按照顺序依次尝试,首先尝试拼接index.html,但是index.html并非物理真实存在,并且不能精确匹配或者前缀匹配,所以index.html被舍弃,同样道理,index.htm也会被舍弃,然后尝试index.jsp,index.jsp物理真实存在,所以拼接index.jsp,默认访问相当于:http://localhost:8080/first_page/index.jsp,此路径可以由tomcat自带的名为jsp的servlet进行扩展名(*.jsp)匹配,这也就是我们新建项目默认访问的页面。
5、我们可以覆盖默认的映射规则,比如覆盖*.jsp web.xml hiServlet *.jsp运行结果:与上面相同的分析过程相同,默认访问相当于:http://localhost:8080/first_page/index.jsp,由于hiServlet覆盖了*.jsp映射规则,所以由hiServlet处理默认访问。
6、尝试拼接:依据前缀匹配 web.xml hh/index.html index.htm index.jsp helloServlet *.jsp hiServlet /hh/*运行结果:没有servlet配置/*,存在多个welcome-file时,按照顺序依次尝试,首先尝试拼接hh/index.html,可以看出,hiServlet配置了/hh/*的映射规则,符合前缀匹配,所以拼接hh/index.html,默认访问相当于:http://localhost:8080/first_page/hh/index.html,所以由hiServlet处理默认访问。 注意:除了依据前缀匹配,也可以依据精确匹配。
7、尝试拼接:不能依据扩展名匹配 web.xml
index.html index.htm index.jsp helloServlet *.html hiServlet /hh运行结果:没有servlet配置/*,存在多个welcome-file时,按照顺序依次尝试,此时默认访问相当于:http://localhost:8080/first_page/index.jsp,依据物理真实存在文件拼接。helloServlet虽然配置了*.html后缀匹配规则,但是并没有拼接index.html。
8、尝试拼接:无法依据精确匹配,前缀匹配和物理真实存在文件匹配,则使用第一个拼接。 我们将项目的index.jsp删掉(改个名相当于删除了) web.xml(与上面相同) index.html index.htm index.jsp helloServlet *.html hiServlet /运行结果:没有servlet配置/*,存在多个welcome-file时,按照顺序依次尝试,此时依据精确匹配,前缀匹配和物理真实存在文件匹配都无法匹配到,所以拼接第一个,默认访问相当于:http://localhost:8080/first_page/index.html,此时只有helloServlet配置了*.html扩展名匹配,所以由helloServlet来处理默认访问。
总结 匹配优先级 精确匹配 前缀匹配 扩展名匹配 资源文件匹配(如果是默认访问) 默认匹配默认访问拼接原则 如果是默认访问,即请求根路径(ip:port/项目名/) 时,如果我们自定义的servlet没有配置“/*”前缀匹配,那么请求路径无法依据精确匹配、前缀匹配及扩展名匹配被任何servlet匹配到,此时会增加一个资源文件(welcomeResources)匹配方式,先拼接welcome-file的值再进行如上三种匹配,具体规则如下: 1、如果只有一个welcome-file时,直接将welcome-file的值拼接到根目录后面进行匹配 2、如果存在多个welcome-file时,按照顺序依次尝试,如果依据精确匹配、前缀匹配方式可以找到对应的servlet或者物理真实存在该文件,则使用该welcome-file的值拼接到根目录后面进行匹配,如果不存在这样的welcome-file,则使用第一个welcome-file的值拼接到根目录后面进行匹配。如有错误,欢迎指正!!!
参考:https://www.cnblogs.com/fangjian0423/p/servletContainer-tomcat-urlPattern.html