/与/* 区别

今天发现程序老是出现404.结果发现是web.xml的url-pattern配置问题导致。

1.
/**的意思是所有文件夹及里面的子文件夹
/*是所有文件夹,不含子文件夹
/是web项目的根目录

2.当url-pattern配置成/*的时候,Tomcat会将所有的请求交给对应的Servlet进行处理,当url-pattern配置成/的时候,多数情况下与/效果一致,但是,当访问的路径正好对应jsp文件时,Tomcat会访问真实的jsp文件而不是把请求交给对应的Servlet处理。

3.项目配置spring的servlet配置成/*会导致死循环,堆栈溢出。
web.xml中filter和servlet都会用到url-pattern标签。其中filter可以用/*并且我们经常都是这么配的,但是servlet不能用/*(当然,不能说完全不能用)。
servlet使用/*会覆盖其他所有的servlet,包括web容器中预定义的(比如tomcat预定义用来处理jsp的servlet)。此刻servlet覆盖了默认的jsp处理器,servlet又将页面渲染转交给默认的jsp处理器,于是自己调自己,死循环。
servlet使用/就不会有这个问题,此种配法不会覆盖所有servlet,只会覆盖默认servlet(default servlet)。默认servlet的作用就是处理其他servlet不处理的东西, 如果其他servlet处理了就不会到它这里。
再说filter,filter使用/*即为最强的全部匹配,使用/则只能匹配/这一个路径。由于filter的使用方式是链式调用,所以所有匹配到的都会被调用,不存在覆盖一说,只有顺序需要考虑。

4.
<url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为.jsp这样的后缀型url
<url-pattern>/
</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,.jsp,.js和*.html等)

.
<url-pattern>/</url-pattern>:
会匹配到/springmvc这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url。

<url-pattern>/*</url-pattern>:
会匹配所有的url:路径型的和后缀型的url(包括/springmvc,.jsp,.js和.html等)。
下面是关于这个问题在stack overflow上的解释:
原文链接:http://stackoverflow.com/questions/4140448/difference-between-and-in-servlet-mapping-url-pattern
简单的翻译如下:
<url-pattern>/*</url-pattern>:
这种形式将会覆盖所有其它的servlet。不管你发出了什么样的请求,最终都会在这个servlet中结束。因此,对于servlet来说,这是一个很糟糕的URL模式。通常来讲,你只会想要在一个Filter中使用这种模式。它可以通过调用doFilter()方法来使请求继续。
<url-pattern>/</url-pattern>:
这种形式不会覆盖任何其它的servlet。它仅仅替换了servlet容器中内建的默认servlet。这种形式通常只用来请求静态资源(CSS/JS/image等)和展示目录的列表。servlet容器内建的默认servlet同样可以处理HTTP cache请求、媒体(声音/视频)流以及文件的下载。通常来说,你不会想要覆盖这个默认的servlet,否则,你将不得不自己处理一些琐碎的任务。因此,对于sevlet来说,这同样是一个糟糕的URL模式。说到为什么JSP页面的请求并不会命中这个servlet,那是因为servlet容器内建的JSP servlet将会被调用,而这个容器内建的JSP servlet已经默认地映射在了
.jsp上。
<url-pattern></url-pattern>
这种空串的形式。当上下文的根被请求的时候,它将被调用。这与<welcome-file>的方式是不同的,因为这种形式在当任何子目录被请求的时候不会被调用。当你期望一个“首页servlet”的时候,这种URL模式就是适合你的。

猜你喜欢

转载自blog.51cto.com/10884109/2145718