springboot访问静态资源两种情况

1.springboot自身访问静态资源
2.springboot结合第三方模版引擎访问静态资源

先贴上一个项目

springboot自身访问静态资源

1.在springboot项目中,访问静态资源是怎么配置的?哪里体现?
springboot默认访问静态资源路径是
(1)classpath:/META-INF/resources/
(2)classpath:/resources/
(3)classpath:/static/
(4)classpath:/public/
注意:上面这四个默认的静态资源路径,是 springboot认可的,静态资源如果不放在这四个默认的路径中,springboot是找不到的,当然也可以更改静态资源路径
从依赖spring-boot-autoconfigure入手,因为springboot很多自己默认的配置都可以从这个依赖入手找
首先找自动配置类WebMvcAutoConfiguration,然后搜索location,跟着就会找到ResourceProperties,就会看到上面的路径

要明白两个要点
一、视图
视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
为了实现视图模型和具体实现技术的解耦,Spring 在org.springframework.web.servlet 包中定义了一个高度抽象的View接口:
在这里插入图片描述
视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题
在这里插入图片描述
二、视图解析器
SpringMVC 为逻辑视图名的解析提供了不同的策略,可以在Spring WEB 上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。

视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。

所有的视图解析器都必须实现ViewResolver 接口:
在这里插入图片描述
常用的视图解析器实现类

在这里插入图片描述
每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高;

SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出ServletException 异常。
看看使用的视图解析器
在这里插入图片描述
从springboot启动说起
springboot启动时,会到类路径下的spring-boot-autoconfigure.jar包中找spring.factories加载众多配置类中的WebMvcAutoConfiguration配置类
在这里插入图片描述
在这配置类中,创建默认的视图解析器InternalResourceViewResolver对象放到springIOC容器中.InternalResourceViewResolver类的父类中维护了一个属性viewClass,在创建InternalResourceViewResolver对象的时候,根据源码知道,就设置了viewClass=InternalResourceView,说明默认的视图是InternalResourceView,同时debug时看看这些对象的属性有什么东西

补充:了解到springMVC中重要的是视图和视图解析器,那么怎么了解这两个类?
首先一定要想到看这两个东西是接口还是类,然后可以对其中的相关的方法打断点debug,看看它们对象是怎么创建,创建后调用什么方法.
这是一种思想,学习任何一个技术,了解原理后,从接口开始,看类在哪个地方创建或者调用接口哪个方法

springboot结合第三方模版引擎访问静态资源
在这里插入图片描述
Thymeleaf 常用的表达式、标签和函数
1.常用表达式

• ${...}变量表达式。
•* { .. . } 选择表达式。
• #{...}消息文字表达式。
• @ {} 链接url 表达式。
• #maps 工具对象表达式。

2.常用标签

• th:action 定义后台控制器路径。
• th:each 1,盾环语-句。
• th:field 表单字段绑定。
• th:href 定义超链接。
• th:id div 标签中的ID 声明,类似HTML 标签中的归属性。
• th:if 条件判断语句。
• th:include 布局标签,替换内容到引入文件。
• th :企agment 布局标签,定义一个代码片段,方便其他地方引用。
• th:object 替换对象。
• th:src 图片类地址引入。
• th:text 显示文本。
• th:value 属性赋值。

3.常用函数

• #dates 日期函数。
• #lists 列表函数。
• #arrays 数组函数。
• #strings 字符串函数。
• #numbers 幸生字函捷生。
• #ca lendars 日历函数。
• #objects 对象函数。
• #bools 逻辑函数。

创建一个maven项目测试
在这里插入图片描述
POM文件

spring:
  #springboot自身访问静态资源
  mvc:
    #spring.mvc.static-path-pattern代表的含义是我们应该以什么样的路径来访问静态资源,
    #换句话说,只有静态资源满足什么样的匹配条件,Spring Boot才会处理静态资源请求
    #例子:如果spring.mvc.static-path-pattern=/static/**,那么浏览器就要输入http://localhost:8080/static/index.html
    #所以访问静态资源,一定要URL中加( /static/ )来访问
    static-path-pattern: /**
    view:
      prefix:
      suffix: .html
  #spring.resources.static-locations用于告诉Spring Boot应该在何处查找静态资源文件,
  #这是一个列表性的配置,查找文件时会依赖于配置的先后顺序依次进行
  #比如说,访问http://localhost:8080/static/index.html,index.html页面并没有真正的在static目录下,但是
  #springboot会到( classpath:/resources/ ) 找到index.html
  resources:
    static-locations: classpath:/resources/,classpath:/static/,classpath:/template

  #一下使用thymeleaf模版引擎
  thymeleaf:
    #模板的模式,支持 HTML, XML TEXT JAVASCRIPT
    mode: HTML5
    #编码 可不用配置
    encoding: UTF-8
    #开发配置为false,避免修改模板还要重启服务器
    cache: false
    #配置模板路径,默认是templates,可以不用配置
    #这里前缀一定要配置好,要不然找不到页面( /templates/ ),而不能是( /templates )
    prefix: classpath:/templates/
    suffix: .html
    #内容类别,可不用配置
    servlet:
      content-type: text/html

测试controller

package com.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
public class SpringBootSelfController {

    /** 使用springboot原生访问静态资源,下面两个方法都出现问题
     * 说明不可以通过controller访问静态资源(有模版引擎的情况下)
     * */
    @GetMapping("/aa")
    public String aa(){
        return "index";
    }
    @GetMapping("/bb")
    public String bb(){
        return "html/aa";
    }
    @GetMapping("/tt")
    public String tt(){
        return "tt";
    }

    /** 通过controller重定向,这种已经不使用,已经使用模版引擎了,访问页面的后缀一定要加.html */
    @GetMapping("/redirect")
    public void hello(HttpServletResponse response) throws Exception {
        response.sendRedirect("/html/redirect.html");
        //response.sendRedirect("/gogo");//也可以重定向到一个访问方法
    }

    /** 通过controller转发,这种已经不使用,已经使用模版引擎了,访问页面的后缀一定要加.html */
    @GetMapping("/forward")
    public void forward(HttpServletRequest request,HttpServletResponse response) throws Exception {
        request.getRequestDispatcher("/html/forward.html").forward(request,response);
    }

    @GetMapping("/gogo")
    public String gogo(){
        return "/html/hello";
    }

}

springboot如果和第三方引擎结合(比如thymeleaf),就会替代springmvc原有的视图解析器,原来的一些规则就不起作用了,要按照模版引擎的来

当引入依赖spring-boot-starter-thymeleaf时,查找到ThymeleafAutoConfiguration这个自动配置类,然后找到thymeleafViewResolver这个方法。这个方法向容器返回一个thymeleaf的视图解析器,这个视图解析器会替换掉SpringMVC默认的视图解析器。
怎么替代SpringMVC默认的视图解析器InternalResourceViewResolver?如下:
在这里插入图片描述
可知到,thymeleaf的自动配置类ThymeleafAutoConfiguration是在WebMvcAutoConfiguration配置类后面生效的,但是thymeleaf优先级更高
在这里插入图片描述
注意:优先级低的视图解析器会无效,就是说,当springboot加入thymeleaf模版引擎后,之前通过controller访问静态资源不生效了,要按照thymeleaf模版方式
看看thymeleaf属性配置类
在这里插入图片描述
ThymeleafViewResolver这个类,找到createView这个方法
总结:thymeleaf把springmvc的视图解析器组件给换了,然后这个组件会根据你填写的返回值来判断是重定向还是请求转发,然后调用的是原生的Servlet的重定向方法。

当没有找到符合的view视图时,会创建error视图返回

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值