tomcat首页welcome-file-list设置与url-pattern匹配规则

一、welcome-file-list

1. <welcome-file-list>标签下可以设置多个首页<welcome-file>,容器启动后会在根目录下依次查找匹配的物理存在的文件,返回第一个找到的文件,没有找到报404错误。

<welcome-file-list>
    <welcome-file>a.jsp</welcome-file>
    <welcome-file>b.html</welcome-file>
    <welcome-file>c.html</welcome-file>
  </welcome-file-list>

首页也可以是WEB-INF目录下的文件。


2、首页的路径只能是一个实际存在的物理文件地址,不能将首页设置成Servlet或Controller的地址,再通过来Servlet或Controller返回一个页面,例如以下,tomcat会在根目录下的view文件夹查找addUser文件,找不到则报404.

<welcome-file-list>
  <welcome-file>/view/addUser</welcome-file>
</welcome-file-list>

如果确实需要使用控制器来返回页面,可以通过在页面中跳转到控制器路径来实现。建立首页文件home.html,内容如下,URL为跳转路径,再将该页面设置为主页。

<html> 
<head>
  <meta http-equiv="Refresh" content="0; URL=/view/addUser">
</head>
</html>

3. 可以不设置首页,由SpringMVC来处理根路径应该返回的页面,注意2中是设置首页为控制器路径,此处是不设置首页,不要混淆。不设置首页直接去掉welcome-file-list标签或者

<welcome-file-list>
  <welcome-file></welcome-file>
</welcome-file-list>

对根路径进行映射

@RequestMapping("/")
public String indexPage() throws Exception {
	return "index"; 
	}

或使用<mvc:view-controller />,有2种方法

1. 重定向 
<mvc:view-controller path="/" view-name="redirect:/view/index"/> 
即如果当前路径是/ 则重定向到/view/index 
2. view name 
<mvc:view-controller path="/" view-name=admin/index"/> 

如果当前路径是/ 则交给相应的视图解析器直接解析为视图 。

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"p:order="2">
      <propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>
      <propertyname="contentType" value="text/html"/>
      <property name="prefix"value="/WEB-INF/jsp/"/>
      <property name="suffix"value=".jsp"/>
</bean>
得到的视图时 /WEB-INF/jsp/view/index.jsp

二、url-pattern匹配规则

  • 需要明确

1. servlet容器中的匹配规则既不是简单的通配,也不是正则表达式,而是特定的规则。所以不要用通配符或者正则表达式的匹配规则来看待servlet的url-pattern。

2. 当servlet容器接收到浏览器发起的一个url请求后,容器会用url减去当前应用的上下文路径,以剩余的字符串作为servlet映射,如url是http://localhost:8080/appDemo/addUser,其应用上下文是appDemo,容器会将http://localhost:8080/appDemo去掉,用剩下的/addUser部分拿来做servlet的映射匹配

注:http://localhost:8080/appDemo/user/addUser/ 是非法的url,不会被当作http://localhost:8080/appDemo/user/addUser识别

3. 当有一个servlet匹配成功以后,不会再继续匹配剩下的servlet。

4. Servlet 2.5开始,一个servlet可以使用多个url-pattern规则。以下3个url-pattern都可以映射到MyServlet

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/user/users.html</url-pattern>
    <url-pattern>/index.html</url-pattern>
    <url-pattern>/user/addUser.action</url-pattern>
</servlet-mapping>
  • 三种写法

1. 精确匹配。形如/add。

注:/user/*/index也是精确匹配,其中的*不是通配符而是字符*。只有/user/*/index才能匹配上,/user/a/index,/user/b/index都是无法匹配的。

2. 路径匹配。形如/*,/user/*,以以/开头,/*结尾

3. 扩展名匹配。形如*.do

注以上三种匹配不能组合混用。

4. 默认匹配/,当以上都无法匹配时,就是用默认的Servlert。优先级最低

匹配优先级

精确匹配>路径匹配(长路径优先级大于短路径优先级)>扩展名匹配>缺省匹配

  • "/*"与"/"

“/*”属于路径匹配,并且可以匹配所有request,由于路径匹配的优先级仅次于精确匹配,所以“/*”会覆盖所有的扩展名匹配,很多404错误均由此引起,一般只用于filter的url-pattern。
 “/”默认匹配模式,优先级最低,不会覆盖其他任何url-pattern,只是会替换servlet容器的内建default servlet ,该模式同样会匹配所有request(除了jsp文件)。
 配置“/”后,会拦截诸如http://localhost:8080/appDemo/user/addUser.action、http://localhost:8080/appDemo/user/updateUser的格式的请求,但是并不会拦截http://localhost:8080/appDemo/user/users.jsp、http://localhost:8080/appDemo/index.jsp,这是因为servlet容器有内置的“*.jsp”匹配器,而扩展名匹配的优先级高于缺省匹配,所以才会有上述现象。

/*与/都会拦截.css,.js,.html等静态资源。

  • 配置“/”后静态资源的处理

在SpringMVC框架中我们会配置请求默认由DispatcherServlet来处理,这样静态资源的处理也会被拦截到由DispatcherServlet处理,而我们并没与写Controller来进行映射,常报404。


  • 3种方式解决方法

1. 使用web服务器默认的servlet来做处理,它会根据请求路径正确找到资源,tomcat默认servlet名称为default

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
  </servlet-mapping>

要写多个,要配置多个,每种文件配置一个

2、使用<mvc:default-servlet-handler/>

配置<mvc:default-servlet-handler/>后,会把"/**" url注册到SimpleUrlHandlerMappingurlMap,请求到达DisPatcherServlet 后,把对静态资源的访问通过HandlerMapping转到DefaultServletHttpRequestHandler处理并返回。DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />

3. 使用<mvc:resources mapping="" location="" />


<mvc:default-servlet-handler />将静态资源的处理经由Spring MVC框架交回Web应用服务器处理。而<mvc:resources />更进一步,由Spring MVC框架自己处理静态资源,并添加一些有用的附加值功能。

使用<mvc:resources/>元素,同样会把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回。<mvc:resources />允许静态资源放在任何地方,如WEB-INF目录下、类路径下等,甚至可以将JavaScript等静态文件打到JAR包中。通过location属性指定静态资源的位置,由于location属性是Resources类型,因此可以使用诸如"classpath:"等的资源前缀指定资源位置。传统Web容器的静态资源只能放在Web容器的根路径下,<mvc:resources />完全打破了这个限制。

补充说明:多个HandlerMapping的执行顺序问题
  1. DefaultAnnotationHandlerMapping的order属性值是:0
  2. <mvc:resources/>自动注册的 SimpleUrlHandlerMapping的order属性值是:2147483646
  3. <mvc:default-servlet-handler/>自动注册 的SimpleUrlHandlerMapping的order属性值是: 2147483647

Spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过DefaultAnnotationHandlerMapping来找处理器,一定是找不到的,我们没有叫a.jpg的Action。再按order值升序找,由于最后一个SimpleUrlHandlerMapping是匹配"/**"的,所以一定会匹配上,再响应图片。

转自:

servlet的url-pattern匹配规则

基础7——url-pattern匹配规则

https://www.cnblogs.com/dflmg/p/6393416.html

https://blog.csdn.net/z69183787/article/details/41654039

  • 22
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
<welcome-file-list>是一个在web.xml中配置的标签,用于设置网站的默认首页。在这个标签中,可以设置多个<welcome-file>,容器启动后会按照设置的顺序在根目录下查找匹配的物理存在的文件,并返回第一个找到的文件作为首页。如果没有找到匹配的文件,则会返回404错误。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [welcome-file-list](https://blog.csdn.net/weixin_54010017/article/details/124711057)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [tomcat首页welcome-file-list设置url-pattern匹配规则](https://blog.csdn.net/xybz1993/article/details/81023955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [web.xml中的welcome-file-list标签作用](https://blog.csdn.net/ningmeng666_c/article/details/115538178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值