<url-pattern>/</url-pattern>
与<url-pattern>/*</url-pattern>
的区别
<url-pattern>/</url-pattern>
:
servlet
的url-pattern
设置为/
时, 它仅替换servlet容器
的默认内置servlet
,用于处理所有与其他注册的servlet
不匹配的请求。直白点说就是,所有静态资源(js,css,image,html等)的访问都将交给该servlet处理,而jsp页面则交给servlet容器
内置的JSP servlet
处理。
<url-pattern>/*</url-pattern>
:
servlet
的url-pattern
设置为/*
时,它会覆盖其他所有的servlet
,包括servlet容器
提供的所有servlet
,如缺省servlet
和JSP servlet
。 无论你发出什么请求,都会在该servlet
拦截处理。通常我们不会这么做。如果你只是想使用/*
,那么你可以在Filter
中使用,它处理完后会将url
交给servlet
处理。
实例说明
直接解释<url-pattern>/</url-pattern>
与<url-pattern>/*</url-pattern>
的区别,可能不是那么直观,我们用实验来说话吧。
有一个SpringMVC项目中,已开启静态资源访问,所有编码均为UTF-8
:
- 有一个
Controller
,处理/hello
请求,返回/index.jsp
页面 - 有一个
hello.html
文件 - 有一个
hello.jsp
文件 - 有一个
index.html
文件 - 有一个
index.jsp
文件
DispatcherServlet
的url-pattern
设置为/
时:
我们可以看到结果
-
/hello.html
没有访问到自己本该访问到的页面说明静态资源被DispatcherServlet
拦截处理了。 -
/index.html
访问到自己本该访问到的页面这是因为SpringMVC开启了静态资源访问,结合1
来看,如果静态资源的前缀名与Controller
中处理的请求同名时,会被Controller中的请求覆盖,否则就会返回静态资源本来的页面。 -
/hello.jsp
和/index.jsp
请求都访问到了本该属于自己的页面说明jsp页面没有被DispatcherServlet
拦截处理。
DispatcherServlet
的url-pattern
设置为/*
时:
/hello.jsp
和/index.jsp
都访问到了自己页面的源码,说明jsp页面都被DispatcherServlet
拦截处理了,并且DispatcherServlet
自己还处理不好这些jsp页面(不能对jsp页面进行解析),所以直接返回它们的源码信息,并且编码都变得不可控,编码还由原来的UTF-8
变成了GBK
。
注意:顺便说一下,
- 仅仅只能拦截处理主页请求:
<url-pattern></url-pattern>
- 什么请求都不能拦截处理,相当于没有设置:
<url-pattern>/**</url-pattern>