SpringMVC中mvc:default-servlet-handler(处理静态资源)和mvc:annotation-driven标签区别

一、处理静态资源

最近在复习 Spring MVC 的时候,通过官方的文档弄清楚了一个以前不太理解的标签,写出来分享一下。

在开发 RESTful 架构的 URI 时,我们都会在web.xml中将前端控制器的映射请求设置为"/"。 

è¿éåå¾çæè¿°

关于配置成"/",在 Spring 的官方文档中这样描述:

The caveat to overriding the “/” Servlet mapping is that the RequestDispatcher for the default Servlet must be retrieved by name rather than by path.

大概意思是默认 Servlet 的 RequestDispatcher 必须通过名称而不是路径来检索。 换句话说就是 Spring MVC 将接收到的所有请求都看作是一个普通的请求,包括对于静态资源的请求。这样以来,所有对于静态资源的请求都会被看作是一个普通的后台控制器请求,导致请求找不到而报 404 异常错误。查看 tomcat 的日志会报一个警告: 

è¿éåå¾çæè¿°

对于这个问题 Spring MVC 在全局配置文件中提供了一个标签。在 WEB 容器启动的时候会在上下文中定义一个 DefaultServletHttpRequestHandler,它会对DispatcherServlet的请求进行处理,如果该请求已经作了映射,那么会接着交给后台对应的处理程序,如果没有作映射,就交给 WEB 应用服务器默认的 Servlet 处理,从而找到对应的静态资源,只有再找不到资源时才会报错。

一般 WEB 应用服务器默认的 Servlet 都是 default。如果默认 Servlet 用不同名称自定义配置,或者在缺省 Servlet 名称未知的情况下使用了不同的 Servlet 容器,则必须显式提供默认 Servlet 的名称,如下:

 

二、

会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter 与ExceptionHandlerExceptionResolver三个bean。
• 还将提供以下支持:
– 支持使用 ConversionService 实例对表单参数进行类型转换
– 支持使用 @NumberFormat annotation、@DateTimeFormat注解完成数据类型的格式化
– 支持使用 @Valid 注解对 JavaBean 实例进行 JSR 303 验证
– 支持使用 @RequestBody 和 @ResponseBody 注解

三、注意

在实际开发中通常都需要配置,否则如果配置了(可以直接相应转发的页面, 而无需再经过 Handler 的方法)或者配置了(处理静态资源)时其他的转发就用不了了

你可能感兴趣的:(【26】SpringMVC)