SpringMVC - (3)DispatcherServlet在web.xml中的路径映射问题

DispatcherServlet是Spring提供给开发者的servlet,在整个过程中DispatcherServlet承当了一个中心控制器的角色来处理各种请求。
在请求到达之前还需要经过web.xml:

	<!-- Map all requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

负责将请求路径映射到具体的servlet路径上,有下面几种配置方式:

  • *.do
  • /(现在最流行的配置方式)
  • /*

为什么 / 是现在最流行的配置方式

SpringMVC - (3)DispatcherServlet在web.xml中的路径映射问题_第1张图片
tomcat自带jspservlet和defalutservlet分别用于处理jsp请求和静态资源文件,的配置必须使jsp请求交由tomcat自带的jspservlet处理
在springmvc的xml中配置/,它会对tomcat中的default配置进行覆盖,这样就不能访问webapp下的静态资源了,这样会更加安全。

/* 做了什么

前面讲了/会覆盖tomcat中的default,那么配置成/*的话就会同时覆盖defaultservlet和jspservlet,那么此时你就连jsp都不能正确访问了,因为jsp请求不再交由tomcat处理,而是交给DispatchServlet处理,它会在你用浏览器访问时将你的jsp代码加载在页面而不是你期望的五彩斑斓的页面效果。

*.do 又是什么

以.do结尾的请求都会经过DispatcherServlet处理早期的SpringMVC资料,他们把DispatchServlet配置成.do或者.action形式,那是因为早期的SpringMVC缺乏对静态资源的管理,如果配置成/那么所有对静态资源请求也会交给DispatchServlet处理,除非配置相应的Controller否则也会报错,所有静态资源管理的任务还是应该由tomcat中的default来管理,因此早期DispatchServlet配置成.do .action等形式来避免覆盖掉default的功能。当然现在做了优化也就没用这个了。

那爷的静态资源怎么搞

掐面配置的/拦截了静态资源但是没有拦截jsp请求,这个时候你的jsp虽然能运行,但是其中引用的静态资源比如图片js等就没有显示出来了,这个时就要用到spring为我们提供的两个注解了:

    <mvc:default-servlet-handler/><!-- 静态资源放行 -->
    <mvc:annotation-driven></mvc:annotation-driven><!-- 开启注解支持 -->

它们结合使用产生的功效是如果DispatchServlet发现请求是一个静态资源那么会交给default servlet即交给Tomcat处理,这个时候你的jsp请求就能正确的加载了

你可能感兴趣的:(SpringMVC)