首先它们的共同点在于:作用都是用于拦截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页面请求,并响应。
本文对比了/与/*两种Servlet映射模式的区别,指出/模式不会拦截.jsp文件,而/*模式则会拦截所有类型的文件。此外,文章还讨论了这两种模式在获取请求路径方面的不同,及其在MVC架构如SpringMVC中的应用。
790

被折叠的 条评论
为什么被折叠?



