目标

通用在SpringStartupListener 类,使用setAlwaysUseFullPath属性, 修改Spring MVC的URL映射控制路径匹配规则,达到满足业务要求

详述

Spring MVC的URL映射有一个控制路径匹配的参数alwaysUseFullPath。默认值为false。
当它被设置为false后,总是使用当前servlet映射内的路径来查找Controller。
当它被设置为true后,总是使用当前servlet上下文中的全路径来查找Controller。
我希望,值为true。


当它被设置为false后(默认值)
servlet url-pattern= "/*"; request URI= "/test/a" 映射的Controller= "/test/a"
servlet url-pattern= "/"; request URI= "/test/a" 映射的Controller= "/test/a"
servlet url-pattern= "/*.do"; request URI= "/test/ a.do " 映射的Controller= "/test/a"
servlet url-pattern= "/test/*";request URI= "/test/a" 映射的Controller= "/a" (这里不满意)


当它被设置为true后
servlet url-pattern= "/test/*";request URI= "/test/a" 映射的Controller= "/test/a" (现在满意了)

我希望的是,当servlet拦截的是"/test/*" 路径时  ,浏览器访问/test/a 地址,被映射到 /test/a  Controller

配置:

在spring-context.xml配置文件中加入以下内容:

 <!-- 修改Spring MVC的URL映射控制路径匹配规则,达到满足业务要求 -->
 <bean class="com.sicheng.common.web.SpringStartupListener"></bean> 

如果系统有多个 Spring MVC 的DispatcherServlet容器(子容器),都会被影响


request.getServletPath()返回值的研究

问题描述,我在开发中遇到了以下现象,对我的开发工作造成了干扰。

  • request.getServletPath() 的返回值,受  <url-pattern>*.htm</url-pattern> 影响,返回不同结构的值

网上也有人遇到了同样的问题,比如这篇文章《request.getServletPath()返回为空的问题》 https://www.ktanx.com/blog/p/3551

为了全面分析,排除干扰,特证明了以下两点

  • contextPath 的变化对以上现象并不会产生影响
  • map.setAlwaysUseFullPath(true);  设置为true或false 对以上现象并不会产生影响