SpringMVC对于静态资源多处理

转自:https://blog.csdn.net/lchpersonal521/article/details/53112728

1. 引言

今天在学习SpringMVC的时候想用html而不用jsp实现页面,但是像平常一样配置好controller后一直是404找不到html页面,同时InternalResourceViewResolver默认是加“根目录”前缀和“.jsp”后缀,所以最后变成了…/demo/name.html.jsp,Google一下找到了问题原因,总结一下。

2. addResourceHandlers(ResourceHandlerRegistry registry)

此方法用来专门注册一个Handler,来处理静态资源的,例如:图片,js,css等。举例:
  

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
  registry.addResourceHandler("/resource/**").addResourceLocations("/WEB-INF/static/");
}

  当请求http://localhost:8083/resource/1.png时,会把/WEB-INF/static/1.png返回。注意:这里的静态资源是放置在WEB-INF目录下的。

3.configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)

用法:

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
   configurer.enable();
}

  此时会注册一个默认的Handler:DefaultServletHttpRequestHandler,这个Handler也是用来处理静态文件的,它会尝试映射/*。当DispatcherServelt映射/时(/ 和/*是有区别的),并且没有找到合适的Handler来处理请求时,就会交给DefaultServletHttpRequestHandler 来处理。注意:这里的静态资源是放置在web根目录下,而非WEB-INF下
  可能这里的描述有点不好懂(我自己也这么觉得),所以简单举个例子,例如:在webroot目录下有一个图片:1.png 我们知道Servelt规范中web根目录(webroot)下的文件可以直接访问的,但是由于DispatcherServlet配置了映射路径是:/ ,它几乎把所有的请求都拦截了,从而导致1.png 访问不到,这时注册一个DefaultServletHttpRequestHandler 就可以解决这个问题。其实可以理解为DispatcherServlet破坏了Servlet的一个特性(根目录下的文件可以直接访问),DefaultServletHttpRequestHandler是帮助回归这个特性的。

4. 题外话

  问: /和/*有什么区别?
  答: /会拦截除了jsp以外的所有url,/* 会拦截所有url,包括jsp。例如:在webroot下面有一个test.jsp,当DispatcherServlet 配置映射/ 时,浏览器输入:http://localhost:8083/test.jsp这个jsp是可以直接访问的,并且不经过DispatcherServlet,而当DispatcherServlet 配置映射/* 时,这个请求就会被DispatcherServlet 拦截。

猜你喜欢

转载自blog.csdn.net/qq_39385118/article/details/81948047
今日推荐