问题描述:
我们在spring mvc框架中为了是URL更符合RESTful风格,通常在web.xml中会配置spring框架servlet 的 url 拦截为 "/" ,也就是拦截所有资源的url请求,这样一来,所有的资源包括, js | css | 图片 | 所有静态资源都将经过框架的servlet拦截。不应该是这样的。所以有了对应servlet的url拦截为“/”的时候,对静态资源访问不应该经过servlet拦截的问题处理。如果 servlet-mapping 的 url-pattern 为 “*.do”,就是只拦截有一定后缀的url,那么就不会有静态资源访问的问题了。
一、
spring mvc 下默认访问的三种方式
1>.
第一种 访问tomcat容器的默认页面
<welcome-file-list>
<welcome-file>/index.html</welcome-file>
</welcome-file-list>
这种方式通常用来访问我们的初始页面
2>.
第二种 spirng mvc 默认index controller 方式
(
如果在tomcat容器没有配置默认页面,怎spring mvc 会主动去寻找/index的controller,如果有则会调用,没有则会显示404页面)
@RequestMapping(value="/index")
public ModelAndView index(HttpServletRequest request, HttpServletResponse response){
return new ModelAndView("index");
}
3>.
第三种 spirng mvc 配置根节点访问“/”方式
@RequestMapping(value="/")
public ModelAndView index(HttpServletRequest request,HttpServletResponse response){
return new ModelAndView("index");
}
或者
<mvc:view-controller path="/" view-name="home"/>
This is a shortcut for defining a ParameterizableViewController that immediately forwards to a view when invoked.
※ 三种方法
优先级别是 1>3>2
二、
spring mvc 使用RESTFull 的url风格拦截所有资源请求时的静态资源的访问配置,避免被spring mvc框架的匹配,因为这是没有必要的,可恶的。
※.如果spring mvc框架的servlet-mapping的url-pattern为 “/” ,若我们没有处理静态资源,就会造成静态资源的访问出现 404
解决方案:
1>.
激活web应用服务器(如Tomcat)的defaultServlet来处理静态文件
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
要配置多个,每种文件配置一个
要写在DispatcherServlet的前面, 让defaultServlet先拦截,这个就不会进入Spring了,可能性能是最好的。
Tomcat, Jetty, JBoss, and GlassFish 默认 Servlet的名字 -- "default"
Google App Engine 默认 Servlet的名字 -- "_ah_default"
Resin 默认 Servlet的名字 -- "resin-file"
WebLogic 默认 Servlet的名字 -- "FileServlet"
WebSphere 默认 Servlet的名字 -- "SimpleFileServlet"
2>.
在spring3.0.4以后版本提供了 <mvc:resources />
<mvc:resources mapping="/static/**" location="/static/" />
/static/**映射到 ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period 可以使得静态资源进行web cache
如果出现下面的错误,可能是没有配置<mvc:annotation-driven />的原因。
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'
使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,
key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,
这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问.
另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler,
否则无法处理static resources request.
3>.
使用<mvc:default-servlet-handler/>
<mvc:default-servlet-handler/>
会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.
DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.
补充说明:多个HandlerMapping的执行顺序问题:
DefaultAnnotationHandlerMapping的order属性值是:0
<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping的order属性值是: 2147483646
<mvc:default-servlet-handler/>自动注册的SimpleUrlHandlerMapping的order属性值是:2147483647
spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,我们没有叫a.jpg的Action。再按order值升序找,由于最后一个SimpleUrlHandlerMapping 是匹配"/**"的,所以一定会匹配上,再响应图片。
※ 加载一个静态资源是却要经过框架servlet的层层pattern,不必要的性能开销。
最后还是特别强调,像一开始说的,如果框架servlet的url-pattern是指定后缀的,如 “*.go” ,那么框架的url拦截就只会匹配后缀带 .go 的request,就不会有静态资源访问的问题了。
分享到:
相关推荐
七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...
七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...
Spring MVC和springboot静态资源处理.rar
七、spring mvc 如何访问到静态的文件,如jpg,js,css? 八、spring mvc 请求如何映射到具体的Action中的方法? 九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常...
《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7...
spring mvc+spring+Mybatis架构 Mybatis分页功能 伪静态配置 spring mvc访问静态资源
thymeleaf,我个人认为是个比较好的模板,性能也比一般的,比如freemaker的要高,而且把将美工和程序员能够结合起来,美工能够在浏览器中查看静态效果,程序员可以在应用服务器查看带数据的效果。 thymeleaf是一个...
《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及...
支持REST风格的URL 添加更多注解,可完全注解驱动 引入HTTP输入输出转换器...和数据转换、格式化、验证框架无缝集成 对静态资源处理提供特殊支持 更加灵活的控制器方法签名,可完全独立于Servlet API
ssm(spring+spring mvc+mybatis+maven)高仿bilibili视频网站项目实例 里面包含论坛, 购物商城 网页 后台管理的java项目集成 演示地址: http://106.75.216.49/bilibili/ (服务器不太稳定,可以尝试刷新,感谢...
spring mvc的json和xml视图,dwr及静态资源等不同种类url整合,对应博客教程地址: http://blog.csdn.net/qgmzzn1/article/details/8465969
NULL 博文链接:https://1151461406.iteye.com/blog/2390768
Spring Framework 4.1 mvc添加了静态资源增强处理功能.本源码仅是一个简单使用例子.详细参考;http://blog.csdn.net/xiejx618/article/details/40478275
Spring MVC 3.0新特性: 1.支持REST风格的URL ...4.对静态资源处理提供特殊支持 5.更加灵活的控制器方法签名,可完全独立于Servlet API 参考《Spring 3.x企业应用开发实战》的第15章撰写的培训材料
本篇文章主要介绍了防止SpringMVC拦截器拦截js等静态资源文件的解决方法,具有一定的参考价值,有兴趣的同学可以了解一下
数据库在项目里面的一个sql文件里面 1、采用Spring MVC的静态加载缓存功能,在首页将Javascript文件、CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度。 2、三种皮肤主题:经典、灰色和海王...
自己写的模拟在线考试系统,虽然只是个demo(其实就是木有用数据库,用的一个静态集合模拟的,方便快速部署),但是建模和架构都是完整的,包含war和源码,只需把war部署到tomcat服务器中就可以运行