Web开发这块的内容比较多,然后我打算分为两篇或者三篇文章来记录,如果有什么问题,希望大家能够指出。
目录
- SpringBoot对静态资源的映射规则
- 模板引擎
- Thymeleaf
- SpringMVC自动配置
一、SpringBoot对静态资源的映射规则
- 所有/webjars/**,都去classpath:/META-INF/resources/webjars/去找资源;
- webjars:以jar包的方式引入资源;可以去webjars的官网上去引入资源。
假如引入一个jQuery,就去webjars的官网上找到jQuery的maven依赖,然后写进项目的pom.xml文件中;引入之后可以看到他的目录结构,访问的时候可以使用localhost:8080/webjars/jquery/3.3.1/jquery.js进行访问
- 使用webjars对公共的样式进行访问就很简便;
- 在访问的时候只需要写webjars下资源的名称即可;
2. /**,访问当前项目的任何资源,都去(静态资源的文件夹)找映射
- classpath代表是项目的resourses文件夹目录;
- 我在resourses下的static里添加了如下的文件,则某一个文件的访问路径为:localhost:8080/asserts/js/Chart.mim.js
3. 欢迎页,静态资源文件夹下的所有index.html页面,被/**映射
- 当使用localhost:8080/去进行访问页面时,它找的就是静态资源文件夹下的index.html
4. 所有的**/favicon.ico,都在静态资源文件夹下找
5. 如果需要更改静态资源默认的映射处理,可以在配置文件中进行配置
spring.resourses.static-locations=classpath:/hello/,classpath:/wdd/
这样在配置文件中配置之后,再去访问之前的路径就会报404。
二、模板引擎
- 种类
- JSP
- velocity
- FreeMarker
- Thymeleaf
2. 模板引擎工作的原理
三、Thymeleaf
- SpringBoot推荐使用的是thymeleaf;
2. 引入Thymeleaf,在引入的时候要注意版本
- 下面的properties标签就是在进行对SpringBoot管理的版本号的一个覆盖
- 在提高了thymeleaf的版本之后,也要相应的提高layout布局管理的版本
3. Thymeleaf使用
- 只要我们把HTML文件放在classpath:/templates/下,thymeleaf就能自动渲染了。
- controller和文件结构
- 在使用thymeleaf的时候可以去官网上下载一个使用文档,可以对照着使用,下面的语法就是对照文档来使用的
- 假设需要在controller的时候存储一些数据,那么thymeleaf的操作步骤
①在html中导入thymeleaf的名称空间;导入之后在写thymeleaf相关语法时会有提示
②使用thymeleaf语法;如果我们不使用thymeleaf渲染的话(直接当做静态页面)就会直接显示div写的数据,但是经过了thymeleaf渲染(在程序里运行)后,就会替代那个数据,显示hello代表的值
4. Thymeleaf语法规则
- th:text 改变当前元素里面的文本内容
th:html任意属性,作用是来替换原生属性的值
- 表达式
- thymeleaf的语法规则大家可以到文档中去看,文档中有详细的介绍还有示例,下面来做一个thymeleaf应用
四、SpringMVC自动配置
- SpringBoot自动配置好了SpringMVC;以下是SpringBoot对SpringMVC的默认配置:
- Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?))
ContentNegotiatingViewResolver:组合所有的视图解析器的;
如何定制:我们可以自己给容器中添加一个视图解析器;自动的将其组合进来;
- Support for serving static resources, including support for WebJars (see below).
静态资源文件夹路 径,webjars
- Static index.html support.
静态首页访问
- Custom Favicon support (see below).
favicon.ico
- 自动注册了 of Converter , GenericConverter , Formatter beans.
Converter:转换器; public String hello(User user):类型转换使用Converter
Formatter 格式化器; 2017.12.17===Date;
自己添加的格式化器转换器,我们只需要放在容器中即可;
- Support for HttpMessageConverters (see below).
HttpMessageConverter:SpringMVC用来转换Http请求和响应的;User---Json;
HttpMessageConverters 是从容器中确定;获取所有的HttpMessageConverter;
自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中
(@Bean,@Component)
- Automatic registration of MessageCodesResolver (see below).
定义错误代码生成规则
- Automatic use of a ConfigurableWebBindingInitializer bean (see below).
我们可以配置一个ConfifigurableWebBindingInitializer来替换默认的;(添加到容器)
org.springframework.boot.autoconfifigure.web:web的所有自动场景;
2. 如何修改SpringBoot的默认配置
- SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默 认的组合起来;
- 在SpringBoot中会有非常多的xxxConfifigurer帮助我们进行扩展配置 ;
- 在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置;
3. 扩展SpringMVC
- 如果不满足SpringBoot自动配置的SpringMVC的东西,我们可以使用以下方式再来扩展MVC
编写一个配置类(@Configuration),是WebMvcConfigurerAdapter类型(继承),不能标注@EnableWebMvc
在这里我通过写代码发现,在Spring5中WebMvcConfigurerAdapter已经是一个过时的类了,Spring5之前在在使用,Spring5之后可以直接实现WebMvcConfigurer接口;WebMvcConfigurer有了defalut方法,允许子类仅覆盖那些需要的方法,所以WebMvcConfigurerAdapter这个适配器不需要了,直接实现WebMvcConfigurer接口就好了。
通过查看WebMvcConfigurer源码发现所有的方法都已经改为default修饰了,并且两个nullable方法也迁移过来了。
因为在老版本里,接口方法是不能有方法体的,所以才要有WebMvcConfigurerAdapter去包装一下,现在这个return null可以写到接口里了,所以就不用多余再写一个抽象类了。
@Nullable
既保留了SpringBoot的自动配置,也能用我们扩展的配置;
- 原理
WebMvcAutoConfiguration是SpringMVC的自动配置类;
在做其他配置时会导入:@Import(EnableWebMvcConfifiguration.class) ;
容器中所有的WebMvcConfigurer都会起作用;
我们的配置类也会被调用;
效果就是我们的配置类和自动配置类都会起作用;
4. 全面接管SpringMVC
- SpringBoot对SpringMVC的自动配置都失效了,所有的都是我们自己配置的;只需要在配置类中添加@EnableWebMvc即可。
举个自动配置失效的例子:在我们全面接管SpringMVC之后,SpringBoot自动给SpringMVC配置的一些静态资源的位置就失效了,再使用之前的浏览地址是访问不到的了。
- 原理
为什么加上@EnableWebMvc自动配置就失效了?
@EnableWebMvc的核心源码
@EnableWebMvc将WebMvcConfifigurationSupport组件导入进来;
导入的WebMvcConfifigurationSupport只是SpringMVC最基本的功能;其他的一些功能比如视图解析器之类还需要我们自己配置。
web相关的第一篇内容先介绍了一些web开发需要使用到的静态资源、模板引擎和SpringMVC的一些配置原理,下篇准备记一下一个Restful风格的web小项目的流程,如果有什么错误希望大家指出,如果喜欢我的文章,就关注我吧!