先说结论。
/代表默认的匹配路径,匹配所有没有被servlet匹配上的请求,放行对*.jsp的请求
/*代表匹配所有的路径,匹配所有没有被servlet匹配上的请求,其他的一律走/*匹配(包括*.jsp).
以上两个对静态资源都不放过!!你无法只通过配置上面的路径来放行静态资源,所以在SpringMVC中才要配置<mvc:resource>允许放行静态资源。
来看代码
@WebServlet(urlPatterns="/")
public class HelloController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是/的请求路径,访问的是HelloController");
}
}
@WebServlet("/others")
public class OthersController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是OthersController,路径是/others");
}
}
@WebServlet("/*")
public class WorldController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是WorldController, 路径是/*");
}
}
下面是index.jsp
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
环境是基于ServletAPI4.0,可以用注解代替web.xml配置的。
当我把上面3个Servlet都配置上时,
访问/other路径,就会输出 "这是OthersController,路径是/others"
访问其他任何路径(包括index.jsp),都会输出 "这是WorldController, 路径是/*"
也就是会拦截*.jsp
当我把//@WebServlet("/*")这个注解注释后,再访问上面的路径,结果是
访问/other路径,就会输出 "这是OthersController,路径是/others"
访问/a/b/c路径,就会输出 "这是/的请求路径,访问的是HelloController"
访问index.jsp,会跳转到index.jsp
访问/others.jsp,会报404
可见该servlet会放行*.jsp,但是会匹配所有没有匹配上的servlet请求。
下面是来自 官网的一张说明图。(取自:url-pattern配置为"/"和"/*"的区别)
大意就是/不会覆盖任何其他的servlet,所有的静态资源文件将会被正常访问。jsp资源之所以可以访问是因为匹配了默认的*.jsp后缀,所以可以被访问。
因此现在很好区分/和/*的区别了吧。
/和/*都拦截静态资源,都匹配未匹配上的servlet,但是/*会拦截*.jsp,而/会放行*.jsp。