关于MVC中url-pattern匹配问题的心得
链接: https://www.cnblogs.com/canger/p/6084846.html
看完该文章后个人的见解。
在springmvc中,对于dispatcherservlet的url-pattern如何使用。
首先要知道服务器的默认servlet,是为了处理静态资源的请求。
服务器还会有一个jspServlet,为了处理jsp页面的请求。
如果url-pattern是/,那么他就是默认匹配,他将会覆盖掉服务器中的DefaultServlet,此时,一个请求过来,服务器开始按顺序匹配url。
如果是.jsp,那么就会执行服务器的后缀匹配,因为他的优先级高于默认匹配,所以.jsp的请求就会给拦截,不会送到dispatcherservlet中,所以dispatcherservlet不会处理jsp请求。其他的请求如果在dispatcherservlet中有requestmapping,那么就会被处理。此时,如果是静态资源请求,dispatcherservlet没有映射,那么就会返回404错误。因为他覆盖掉了默认servlet,而且他也无法处理静态资源请求。
解决办法有两个:①将dispatcherservlet的url-pattern变成后缀匹配,而且请求的url后缀也要改成相应的,这样他就不会覆盖掉defaultServlet,而且也可以匹配除.jsp的请求。
②在spring-mvc.xml中配置一个mvc:default-servlet-handler/,他会注册一个DefaultServletHeepRequestHandler,他对即将进入dispatcherservlet进行一个筛选,在dispatcherservlet中有映射的,放行;没有映射的,交给defaultServlet。
两种方法的根本就是为了不覆盖掉defaultServlet。
如果url-pattern是 /* ,他是路径匹配,高于后缀匹配,而且也可以匹配所有的请求,那么会发生什么呢?
首先,在dispatcherservlet中有requestmapping映射的,处理请求。
如果没有映射,那么就返回404错误,比如,jsp页面请求。因为你这个请求已经匹配到dispatcherservlet,那么他就不会进入服务器默认的jspServlet,就无法解析到该jsp请求,当然也无法返回页面了。
解决办法就是在前面加多一个路径,比如 /mvc/ *,这样对jsp页面的请求就无法进入dispatcherservlet中,要确保jsp页面的url前缀和它不能相同,比如/mvc/a.jsp,这样是不可以的。
我的想法就是这么多了,今天就写到这吧。^ - ^