SpringMVC配置前端控制器的路径问题

在使用SpringMVC时,都需要在web.xml中配置一个前端控制器DispatcherServlet

控制器是一个servlet,但这个路径配置就有很多种,之前都是以扩展名配置的路径,如*.do,然后再项目中就就*.do的路径进行访问。

但最近的项目遵循Restful风格,配置的路径如下

可以看到配置的路径为“/”,由于之前疑惑上网查,说是/*和/都是拦截所有请求,于是把这里的路径改成/*,之后项目就出先了404资源找不到的问题。

通过后来查阅资料,以自己的理解  /* 和 / 的区别如下

  首先我们了解一个servlet的匹配规则

    精度匹配>路径匹配>扩展名匹配>内省匹配 (这里具体就不举例了,想了解的同学可以自行百度)

    所有这里的  /属于内省匹配模式(TomCat默认有一个这样的路径),/*属于路径匹配。所以当控制器返回一个结果视图访问时,如果配置的为/*.则SrpingMVC会再次拦截,但由于找不到相关的控制器,就会报404资源找不到。

    如果这里配置的为 / ,首先会覆盖掉Tomcat中默认的,Tomcat默认的是用来处理静态资源的,比如html,jsp等一些静态资源。这里覆盖掉以后,我们就要自己考虑静态资源的处理了。

    

  其次我发现在web.xml中又配置了这样一些路径,由于之前覆盖掉了Tomcat默认的,这里应该是将一些静态资源手动调用Tomcat的默认处理器进行处理,但是在这里面我们没有发现jsp页面,那么控制器返回的jsp还是会被 / 拦截进入到SpringMVC中。

  所以为了防止资源找不到报404,在SpringMVC的配置文件中配置了如下的配置信息

首先的作用是对进入到SpringMVC的静态资源进行处理,功能同Tomcat默认的DefaultServlet功能类似

其次这个的作用是当进入到SpringMVC中并且路径为 / 时,默认跳转到/index.html界面,这貌似就是跳转主页功能。

最后 是SpringMVC提供处理静态资源的,详细用法自行百度。

有个疑惑,假如我访问一个js文件,web.xml里面配置了*.js交给Tomcat处理(扩展名匹配),DispatcherServlet又配置的是‘/’  (内省匹配),而扩展名优先级大于内省,所以说当我访问一个JS静态资源时,是不是进入SpringMVC中的,但这里又在SpringMVC中配置了一些静态资源的处理,不知道有什么用???

总结:

  1./*和/都可以拦截所有请求,但是优先级不一样,/*的优先级要高于/,这也是为什么配置/*会报资源找不到的问题,因为根本到达不了Tomcat默认的Servlet来处理静态资源。

  2.网上说的/*拦截扩展名的,/不会拦截带扩展名的,我觉得这总说法是不对的。还是要理解路径的优先级。

 

 

猜你喜欢

转载自www.cnblogs.com/dreampig/p/9001772.html