序web开发需要解决的问题

  • 静态资源访问,如css文件,HTML文件
    • css,js等文件一般称为静态文件 html则称为模板文件
    • 静态资源我们一般习惯于放在resources/static中,模板文件则放resources/templates
  • 需要一个主页,而不是进入服务器就是默认的错误页面
    • 跟拦截器差不多吧,都是在某些情况下跳特定页面
  • 因为springboot无对jsp的支持,我们使用模板引擎(Thymeleaf)替代jsp,jsp本质也是模板引擎,而且模板引擎比jsp功能强大。没必要在springboot中配置jsp支持了
    • 模板引擎也是实现前后端分离的一种方式。因为现在的业务基本都是动态的,前端显示什么动西往往要根据后端返回的信息来决定。以往采用字符串拼接的方法,这种方法不适合复杂的拼接
  • 装配扩展SpringMVC
  • 拦截器

    原理解析

    关于springboot里MVC的自动配置都在WebMvcAutoConfiguration 这个配置类里面;
    配置类里有一适配器类:WebMvcAutoConfigurationAdapter() 这个类有一个注解@EnableConfigurationProperties({WebMvcProperties.class,ResourceProperties.class})
    我们可以去看看 WebMvcAutoConfigurationAdapter 中有很多配置方法;
    该方法种存在着许多配置和方法。其中有一个方法名叫**addResourceHandlers()**意为添加资源处理器 注意该方法注释
    该方法意为如果这个静态资源(resourceProperties)已经被自定义(isAddMapping)了,就禁用默认
    那么,如何自定义呢?去WebMvcProperties这个配置里查看配置信息 这个配置有一个staticPathpattern的字段,意为静态资源,然后我们到配置文件中配置这个即可 其他配置原理也是这样的,不断找,最终找到对应的配置信息类,然后根据配置信息去配置文件中配置

WebMvcAutoConfigurationAdapter的部分代码

  1. @Override //该方法意为如果这个静态资源(resourceProperties)已经被自定义(isAddMapping)了,就返回退出(return)
  2. //那么,如何自定义呢?去WebMvcProperties这个配置里查看配置信息 这个配置有一个staticPathpattern的字段,意为静态资源,然后我们到配置文件中配置这个即可
  3. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  4. if (!this.resourceProperties.isAddMappings()) {
  5. logger.debug("Default resource handling disabled");//禁用默认资源处理
  6. return;
  7. }
  8. // 缓存控制
  9. Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
  10. CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
  11. // webjars 配置
  12. if (!registry.hasMappingForPattern("/webjars/**")) {
  13. customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
  14. .addResourceLocations("classpath:/META-INF/resources/webjars/")
  15. .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
  16. } //这一段代码表示先注册一个webjars/**的东西。如果pathpattern下有webjars,就可以将静态资源添加到webjars webjars可以放的第一个位置是 classpath:/META-INF/resources/webjars/

导入静态资源的方式如下:

通过maven引入静态资源 (webjars)

Webjars本质就是以jar包的方式引入我们的静态资源 , 我们以前要导入一个静态资源文件,直接导入即可。现在导入方式为通过maven引入。
webjars放在classpath:/META-INF/resources/webjars/

  • 引入webjars:www.webjars.org 里面有着许多前端框架和工具的maven依赖。如bootstrap,vue,npm

导入的webjars结构如下
image.png

  • 访问webjars的方式只需要在浏览器中输入**webjars/****即可。会自动映射到META-INF/resources/webjars/localhost:8080/webjars/jquery/3.4.1/jquery.js

    导入自己的资源

    我们去找staticPathPattern发现第二种映射规则 :/**, 访问当前的项目任意资源,它会去找 resourceProperties 这个类,我们可以发现

    1. private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
    2. "classpath:/META-INF/resources/",
    3. "classpath:/resources/", //是resources/resources
    4. "classpath:/static/",
    5. "classpath:/public/"
    6. };

    即表示/**会被映射为这4个路径 classpath表示类路径,但是不包括src,单指resources
    这四个路径没有的就创建
    /不包括类项目下的文件,只支持类目录下的文件夹下的文件**

  • 在浏览器中可以直接访问的任意文件 如**loacalhost:8080/1.js**即可访问到resource/public/1.js

    • 假如接口路径与静态资源路径同名,控制器的优先级更高,请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面
  • 当存在同名文件时,按路径优先级访问 resources>static>public


配置文件中修改静态资源过滤与位置

  1. spring.resources.static-locations=路径 修改默认静态资源位置 默认位置为代码块中的那四个位置
  2. spring.resources.static-locations=classpath:/coding/,classpath:/kuang/
  3. spring.mvc.static-path-pattern=路径 静态资源过滤 只有所属路径的才能访问(即处理请求)
  4. spring.mvc.static-path-pattern=/static/**注意这个** 一定要有这个符号,可以是*,**,***....

此时访问任意资源都需要加上/static/ (注意资源过滤=staitc并不是只能访问static了,其他依旧可以访问,只是必须加上static请求) 如localhost:8080/``static``/1.js 原来可以直接...8080/1.js
**