Java SpringMVC 集成静态资源的方式你了解吗

目录
  • 1、本文内容
  • 2、静态资源 & jsp 是被谁处理的?
  • 3、如何让 springmvc 处理所有请求?
  • 4、问题来了:静态资源 404 了
  • 5、方案 1:使用
  • 6、方案 2:使用
  • 7、总结

1、本文内容

  • 静态资源 & jsp 是被谁处理的?
  • 如何让 springmvc 处理所有请求?
  • springmvc 如何处理静态资源?
  • springmvc 处理静态资源的 2 种方案、区别、原理详解

2、静态资源 & jsp 是被谁处理的?

不知大家是否注意了一个问题,我们将 web 项目发布到 tomcat 后,可以直接访问 jsp 后缀的文件,或者直接访问项目中的静态资源(js/css/图片之类的文件),只要路径写的没有问题,都可以正常在浏览器中显示,大家是否思考过,是谁在处理这个请求呢?

tomcat 是一个 servlet 容器,servlet 容器中通常有 servlet 来处理各种请求,那么当我们访问静态资源或者 jsp 的时候,当然也是由 servlet 来处理这些请求的,但是我们并没有在 web.xml 中配置由哪个 servlet 来处理这些请求啊,这是因为 tomcat 中自动帮我们配置了一些默认的 servlet 来处理这类的请求。

tomcat 的安装目录中有个 web.xml 文件,位于(apache-tomcat-9.0.46\conf\web.xml),这个文件相当于对发布到 tomcat 中的所有 web 项目的默认配置,我们来看一下这个文件,有几个重要的 servlet 配置信息,这些 servlet 可以用来处理 jsp 后置的文件或者静态资源,抽取部分配置如下

<servlet>
 <servlet-name>defaultservlet-name>
 <servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
 <load-on-startup>1load-on-startup>
servlet>
<servlet>
 <servlet-name>jspservlet-name>
 <servlet-class>org.apache.jasper.servlet.JspServletservlet-class>
 <load-on-startup>3load-on-startup>
servlet>
<servlet-mapping>
 <servlet-name>defaultservlet-name>
 <url-pattern>/url-pattern>
servlet-mapping>
<servlet-mapping>
 <servlet-name>jspservlet-name>
 <url-pattern>*.jspurl-pattern>
 <url-pattern>*.jspxurl-pattern>
servlet-mapping>

配置中主要定义了 2 个 servlet

JspServlet 用来处理 jsp 文件

DefaultServlet 会处理/开头的请求,这里重点说下这个 servlet 的处理逻辑,它会处理所有其他 servlet 不匹配的请求,当一个请求过来之后,会先去匹配其他的 servlet,当找不到匹配的 servlet 的时候,才会走 DefaultServlet

我们可以在项目中的 web.xml 中对 tomcat/config/web.xml 中的配置进行覆盖,即项目中的 web.xml 相对于 tomcat 中的 web.xml 有更高的优先级。

3、如何让 springmvc 处理所有请求?

如果我们想让 springmvc 来处理所有的请求,怎么做呢?只需修改 web.xml 中的配置,将 springmvc 这个 servlet 的 url-pattern 的值设置为/就可以了,此时所有的请求都会被 springmvc 处理,即所有的请求都会被DispatcherServlet处理。

4、问题来了:静态资源 404 了

当我们将上面 springmvc 的 url-pattern 改为/时,大家可以自己去试试,此时再访问静态资源的时候,如下图,会报 404,这个请求被 DispatcherServlet 接收了,但是这个 servlet 默认情况下并没有处理静态资源的能力,即找不到请求的资源,所以才会报 404

springmvc 提供了 2 种解决方案,来看下。

5、方案 1:使用

在 springmvc 的配置文件中添加下面配置

<mvc:annotation-driven/>
<mvc:default-servlet-handler/>

这里说一下原理

1、加入配置后,框架会创建DefaultServletHttpRequestHandler对象,这个对象会将请转发给 tomcat 的 default 这个 servlet 处理,所以静态资源就可以正常访问了

2、注意:配置中的第 1 行也必须加上,如果不加上,@RequestMapping 的请求就无法处理了

3、这种用法有个前提是,web 容器中需要有 default 这个 servlet,且这个 servlet 可以处理静态资源

6、方案 2:使用

从 spring3.0 版本后,spring 定义了专门处理静态资源访问请求的处理器ResourceHttpRequestHandler,并且添加了标签,用来处理静态资源无法访问的问题。

需要在 springmvc 配置文件中添加如下配置

<mvc:annotation-driven/>
<mvc:resources mapping="/imgs/**" location="/static/imgs/"/>
<mvc:resources mapping="/css/**" location="/static/css/"/>
<mvc:resources mapping="/js/**" location="/static/js/"/>

mvc:resource 标签用来指定请求的静态资源的 url 和本地地址的映射关系

mapping:用来指定请求的地址的,比如/imgs/**:可以匹配任何以 imgs 开头的 url,如:/imgs/1.jpg、/imgs/2.jpg、/imgs/order/3.jpg

location:用来指定静态资源所在项目中的目录

注意:配置中的第 1 行也必须加上,如果不加上,@RequestMapping 的请求就无法处理了

这种用法不依赖于 web 容器,所以比第一种方案要好一些,也建议大家用这种方案。

上面代码中配置了 3 行 mvc:resources,可以优化下,如下

<mvc:resources mapping="/static/**" location="/static/"/>
</mvc:resources mapping=

7、总结

tomcat 默认能够处理 jsp 和静态资源,是因为 tomcat 中默认有 2 个 servlet:default jsp

到此我们已经知道如何让 springmvc 来处理所有请求了,只需要在 web.xml 中调整一下 url-pattern 的值为/就可以了

默认情况下,springmvc 无法处理静态资源,本文介绍了 2 种方式,大家可以回头在再去看看,第一种需要依赖于 web 容器中的 default 这个 servlet,使用上面对 web 容器有依赖作用;而第 2 种方式是 springmvc 推荐的方式,更好一些,对 web 容器没有依赖

不管用那种方式,都不要忘记了这个注解,否则咱们自定义的 controller 中的@RequestMapping 就无效了

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java SpringMVC 异常处理SimpleMappingExceptionResolver类详解

    Spring3.0 对异常的处理方式总共有两种: 一种是使用 HandlerExceptionResolver 接口,并且 Spring 已经提供默认的实现类 SimpleMappingExceptionResolver. 第二种方法是在 Controller 内部实现,灵活性更高. 从目前的调查结果来看,这两种方式不能共存.我们一般在项目中使用第一种方法. 下面分别描述一下这两种使用方式: 一.基于 HandlerExceptionResolver 接口的方式 使用这种方式只需要实现 reso

  • 一篇文章带你了解Java SpringMVC返回null

    目录 1.回顾一下 2.思考一个问题 3.springmvc 的处理流程 4.使用场景 5.总结 1.回顾一下 大家有没有注意到,目前讲到的所有 controller 中的方法接收到请求之后,都是有返回值的,返回值主要有 2 种类型: 1. 输出的是页面:也就是视图(会向客户端输出页面),此时方法的返回值可以是 String(视图名称).ModelAndView(页面中有数据的情况) 2.输出的是 json 格式的数据:需要用到@ResponseBody 注解 这 2 种情况中,都是 sprin

  • Java SpringMVC异步处理详解

    目录 1.本篇内容 2.看段代码,分析问题 3.springmvc 中异步处理 4.模拟非超时请求 5.模拟超时请求 6.总结 1.本篇内容 本文让大家掌握 springmvc 中异步处理请求,特别牛逼的一个功能,大家一定要掌握. 2.看段代码,分析问题 @ResponseBody @RequestMapping("/async/m1.do") public String m1() throws InterruptedException { long st = System.curre

  • Java SpringMVC拦截器与异常处理机制详解分析

    目录 拦截器(interceptor)的作用 拦截器快速入门 案例:用户登录权限控制 拦截器方法说明 SpringMVC异常处理 异常处理的思路 异常处理两种方式 拦截器(interceptor)的作用 Spring MVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain).在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用.拦截器也是AOP思

  • Java SpringMVC异常处理机制详解

    目录 异常处理的思路 测试环境准备 异常处理两种方式 方式一:简单异常处理器 方式二:自定义异常处理器 总结 异常处理的思路 测试环境准备 首先写一个DemoController控制层的类作为测试访问的控制器 package com.itheima.controller; import com.itheima.exception.MyException; import com.itheima.service.DemoService; import org.springframework.bean

  • Java SpringMVC自学自讲

    目录 SpringMVC 参考博客 MVC SpringMVC 概述 SpringMVC优点 创建maven工程 配置web.xml 创建请求控制器 创建springMVC的配置文件 测试HelloWorld 总结 @RequestMapping注解 @RequestMapping注解的params属性(了解) @RequestMapping注解的headers属性(了解) SpringMVC支持路径中的占位符(重点) @RequestParam @RequestHeader @CookieVa

  • Java Spring MVC获取请求数据详解操作

    目录 1. 获得请求参数 2. 获得基本类型参数 3. 获得POJO类型参数 4. 获得数组类型参数 5. 获得集合类型参数 6. 请求数据乱码问题 7. 参数绑定注解 @requestParam 8. 获得Restful风格的参数 9. 自定义类型转换器 1.定义转换器类实现Converter接口 2.在配置文件中声明转换器 3.在<annotation-driven>中引用转换器 10. 获得Servlet相关API 11. 获得请求头 11.1 @RequestHeader 11.2 @

  • Java SpringMVC 集成静态资源的方式你了解吗

    目录 1.本文内容 2.静态资源 & jsp 是被谁处理的? 3.如何让 springmvc 处理所有请求? 4.问题来了:静态资源 404 了 5.方案 1:使用 6.方案 2:使用 7.总结 1.本文内容 静态资源 & jsp 是被谁处理的? 如何让 springmvc 处理所有请求? springmvc 如何处理静态资源? springmvc 处理静态资源的 2 种方案.区别.原理详解 2.静态资源 & jsp 是被谁处理的? 不知大家是否注意了一个问题,我们将 web 项目

  • Java 实现简单静态资源Web服务器的示例

    需求 有时候我们想快速通过http访问本地的一些资源,但是安装一些web服务器又很费时和浪费资源,而且也不是长期使用的. 这时候我们可以启动一个小型的java服务器,快速实现一个http的静态资源web服务器. 难点 其实没什么难点,主要是注意请求头和返回头的处理.然后将请求的文件以流的方式读入返回outputstream即可. 代码 直接上代码吧- import java.io.IOException; import java.io.InputStream; import java.io.Ou

  • SpringMVC访问静态资源的三种方式小结

    如果你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截"/",拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了. 目的:可以正常访问静态文件,不要找不到静态文件报404. 方案一:激活Tomcat的defaultServlet来处理静态文件 <servlet-mapping> <servlet-name>default</servlet-name&g

  • SpringBoot加载静态资源的方式

    在SpringBoot中加载静态资源和在普通的web应用中不太一样.默认情况下,spring Boot从classpath下一个叫/static(/public,/resources或/META-INF/resources)的文件夹或从ServletContext根目录提供静态内容.下面我们来写个例子看一下就会一目了然了:首先看一下项目的目录结构: 我们在resources下面的templates目录下建一个home.html的文件,完整目录为:src/main/resources/templa

  • SpringMVC访问静态资源的方法

    在SpringMVC中常用的就是Controller与View.但是我们常常会需要访问静态资源,如html,js,css,image等. 默认的访问的URL都会被DispatcherServlet所拦截,但是我们希望静态资源可以直接访问.该肿么办呢? 在配置文件:web.xml可以看到: <!-- Processes application requests --> <servlet> <servlet-name>appServlet</servlet-name&

  • Spring Boot 静态资源处理方式

    Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性. 建议大家使用Spring Boot的默认配置方式,如果需要特殊处理的再通过配置进行修改. 如果想要自己完全控制WebMVC,就需要在@Configuration注解的配置类上增加@EnableWebMvc(@SpringBootApplication 注解的程序入口类已经包含@Configuration),增加该注解以后WebMvcAutoConfiguration中配

  • Spring Boot实战之静态资源处理

    前两章我们分享了Spring boot对Restful 的支持,不过Restful的接口通常仅仅返回数据.而做web开发的时候,我们往往会有很多静态资源,如html.图片.css等.那如何向前端返回静态资源呢?以前做过web开发的同学应该知道,我们以前创建的web工程下面会有一个webapp的目录,我们只要把静态资源放在该目录下就可以直接访问.但是,基于Spring boot的工程并没有这个目录,那我们应该怎么处理? 一.最笨的方式 我们首先来分享一种最笨的办法,就是将静态资源通过流直接返回给前

  • springboot访问静态资源遇到的坑及解决

    目录 访问静态资源遇到的坑及解决 直接访问静态资源的问题 SpringBoot 默认静态资源访问配置 引入shiro 或 security后的拦截过滤 访问静态资源遇到的坑及解决 开始是以这种结构进行的,结果页面上一篇红,访问的页面是这样的 最终找出来问题,虽然每次调整路径都不对,最终查看多种方法可以看到了: 增加: package com.example.demo.config; import org.springframework.stereotype.Component; import o

  • SpringMVC 拦截器不拦截静态资源的三种处理方式方法

    SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决: 方案一.拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/*.js"/> <mvc:resources location="/" mapping=&quo

  • 详解springmvc拦截器拦截静态资源

    springmvc拦截器interceptors springmvc拦截器能够对请求的资源路径进行拦截,极大的简化了拦截器的书写.但是,千万千万要注意一点:静态资源的放行. 上代码: <mvc:resources mapping="/resources/**" location="/static/resources" /> <mvc:resources mapping="/static/css/**" location=&quo

随机推荐