最近工程启动时,由于希望能够将静态页面和动态页面相分离,所以在动态请求的参数前面添加了前缀来进行区分已拦截。比如采用前缀 /gzj/*。
配置的内容如下:
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/applicationContext-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!--是启动顺序,让这个Servlet随Servletp容器一起启动。-->
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/gzj/*</url-pattern>
</servlet-mapping>
在启动的时候,发现无法匹配到我们Controller中/gzj/为前缀的uri。经过实验发现是由于在进行匹配的时候,Servlet会将/gzj/的前缀提取出来。所以比如我们希望匹配Controller中的/gzj/index的uri,则请求的路径为/gzj/gzj/index。比较类比nginx的proxypass的以/为结尾的情况。
有相应几个stackoverflow的问题在讨论,可以去看一下:
cant-get-spring-mvc-dispatcher-to-work-properly-when-url-pattern-is-a-path
spring-mvc-url-pattern-syntax