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视图返回