天天看点

Servlet Mapping 中/ 和 /*的区别

首先它们的共同点在于:作用都是用于拦截http://ip:port/context下的所有请求

不同点在于:(1)/ 模式下,Servlet不会拦截 .jsp(仅限于此,.html仍会被拦截)格式的请求;而 /* 模式才是真正意义上的拦截所有形式的请求。

(2)在 /*模式下,通过调用HttpServletRequest 对象的getPathInfo()方法,将得到不包含context名称的访问路径;而在 / 模式下,该方法返回始终为null,此时只能转而使用getRequestURI()等方法得到包含context名称的请求路径。

所以在MVC架构中,例如SpringMVC中,如果你把DispatcherServlet对应的Servlet-Mapping匹配模式配置为 /* 时,即使经过视图解析器得到的访问jsp页面的请求也会再次被拦截,从而无法得到将要访问的页面而报错。所以应配置为 /。

原因探讨:参考社区http://stackoverflow.com/questions/4140448/difference-between-and-in-servlet-mapping-url-pattern关于这一点的讨论

我大致将社区中的讨论结果总结陈列如下:

(1)web server有几个默认的servlet,其Servlet-Mapping映射路径包括“*.jsp”(用于处理jsp页面响应),以及“”(用于默认页面响应)等

(2)“/*”会覆盖掉以上所有的默认servlet,从而将所有的请求都拦截了下来

(3)“/”不会覆盖默认servlet,所以默认的“*.jsp”servlet仍然可以正常工作,(精确匹配优先)优先拦截jsp页面请求,并响应。

继续阅读