因为配置了前端控制器 : url-pattern : / 除了.jsp以外 的请求都会被DispatcherServlet拦截
所有对于静态资源的请求都会被看作是一个普通的后台控制器请求,导致请求找不到而报 404 异常错误。
访问静态资源 ,这里我们有两个方法解决:
第一种解决方法
可以将前端控制器的映射修改为 url-pattern : /*.do
这样访问静态资源 .css、.js 等等,都能正常访问到啦。
但 想要前端控制器处理的请求 都要带上 .do ,并且这样对要使用 rest 风格的 url不友好,所以不建议使用。让我们来看看第二种把
第二种解决方法
2.1
需要我们在SpringMVC的配置文件中配置一些处理静态资源的配置,要使用到 mvc 的 schema 约束,所以首先要配置mvc的名称空间和mvc的 .xsd约束文件 ,如下:
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation=http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
2.2 接下来,我们在SpringMVC的配置文件 中加上如下配置:
<!--让服务器的默认的Servlet 来处理静态资源 -->
<mvc:default-servlet-handler/>
PS:在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler ,
这个Handler的作用是去Servlet容器查找默认的Servlet来响应静态文件,一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。
如果的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:
mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />
问题:
虽然可以访问到了静态资源,但是引入这行代码后,Controller就会失效了,准确来说是RequestMapping下面的方法失效了,从而界面无法跳转。在网上看了一些原因后,总结一下就是
<mvc:default-servlet-handler/>在SpringMVC上下文中定义一个DefaultServletHttpRequestHandler,
而这会导致SpringMVC的处理映射器和处理适配器失效,从而Controller失效。
而要解决这个问题还只要在SpringMVC的配置文件中配置:
<mvc:annotation-driven/>
<mvc:annotation-driven/>这一行代码的作用是自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter这两个bean,所以我把他们注释了。
2.3 终极版
如上!我们只用配置这两行: 就能正常访问静态资源 且 不让SpringMVC的处理映射器和处理适配器失效 (Controller失效)
<!-- 使用 服务器默认的Servlet来处理静态资源 -->
<mvc:default-servlet-handler/>
<!-- 注册处理映射器和处理适配器 (不让@RequestMapping 失效) -->
<mvc:annotation-driven/>
PS:<mvc:annotation-driven/>这一行代码的作用是自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter这两个bean,所以我把他们注释了。
<mvc:default-servlet-handler/>定义的DefaultServletHttpRequestHandler,是当没有其他mapping可以处理请求时才会执行该handler匹配的mapping,从而去查找静态内容。
部分摘自:
cnblogs.com/jdbn/p/11020374.html
https://www.cnblogs.com/dflmg/p/6393416.html