在配置spring框架时可参考: 链接
https://blog.csdn.net/J080624/article/details/66969987
【1】web.xml中 配置资源拦截路径
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.
DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 此处也可以配置成 *.do 形式 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
原因:
这里也可以设置成*.do 的形式,意思就是当有请求来的时候只拦截.do结尾的请求,然后去通过
DispatcherServlet 找到对应controller进行访问
但这种rest风格很不好。
我们一般配置
<url-pattern>/</url-pattern> 的形式
"/" 的意思是替换掉容器的default servlet ,意思就是会把所有的请求 都交给DispatcherServlet 分发器处理
这样的问题就是 我们的静态资源也被当成请求处理 就会出现静态资源加载不进来
也就怎么样都访问不到容器中原始默认的servlet(
对静态资源的访问就是通过容器默认的servlet处理的)
解决这个问题:
因为默认的servlet被 “/” 代替了 解决的目标就是重新启用默认servlet ;所以在spring-mvc中配置<mvc:default-servlet-handler>
/*配置一个handler通过转发到servlet容器的默认servlet来处理静态资源*/
果然,静态资源可以访问了。但是。。
【2】
controller又不能访问了
原因:
default-servlet-handler 在SpringMVC上下文中定义了一个DefaultServletHttpRequestHandler
/*当DispatcherServlet url-pattern为 ‘/’时,该handler将会使用‘/*’去匹配请求路径;因此,
重置了servlet容器对静态资源的默认处理*/
当DispatcherServlet url-pattern为 ‘/’ 时。该handler将会使用 ‘/*’ 去匹配请求
因为’/’将servlet定义为默认serlvet,在没有精确匹配servlet出现前,’
/*'
将拥有最高的优先级!!
/*
可以拦截路径和资源型的请求,并转发到默认的serlvet
也就是说,
静态资源此时可以由默认default servlet进行处理,但是default servlet不能处理你的业务请求(mapping)
解决办法:,需要保证该handler对应的handler mapping在执行顺序中为最后
<mvc:annotation-driven />
<mvc:default-servlet-handler/>
- 必须与<mvc:annotation-driven> 结合使用,否则controller将失效。
- 容器默认的DefaultServletHandler处理 所有静态内容与无RequestMapping处理的URL;放到handlerMapping配置后,否则会导致映射失效
<mvc:annotation-driven />
<!-- 对静态资源文件的访问 需要是spring3.0.5以上版本-->
<mvc:default-servlet-handler/>
[3] tomcat 乱码问题 注意 两个地方都要配置