【JavaWeb-Servlet】urlPatterns中的/和/*的区别

先说结论。

/代表默认的匹配路径,匹配所有没有被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。

参考:url-pattern配置为"/"和"/*"的区别

发布了26 篇原创文章 · 获赞 3 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_34291570/article/details/104762108
今日推荐