- 创建SpringBoot 应用,选中我们需要的模块
从autoconfigur 的jar 包中就能找到对应的配置文件配置:
2)选完以后,我们就能直接使用里面的模块了,因为SpringBoot 已经帮我们配置好了,所以我们直接在配置文件中进行相关配置,就能直接使用了。如果忘了相关模块的配置怎么写,可以去autuoconfigure jar 包下直接找对应的类,然后找到@EnableConfigurationProperties 这个注释,点进去就能看见相关配置怎么写了。
3)自己编写业务代码:
完成功能:完成一个Restful 风格的CURD ,利用Bootstrap 框架显示在页面上。
目前只需要web 模块
2、SpringBoot对静态资源的映射规则;
源码:
先看这一段:
翻译过来就是:所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源;
这个webjars 是一个提供了一个包结构规范,然后里面还包含了很多我们想要的组件依赖的的一个包。
webjars 是以jar包的方式引入静态资源。通过这个网站:https://www.webjars.org/ 找到。
比如我们导入一个webjars 包结构的jquery 依赖:
按照SpringBoot 配置的webjars 的访问规则:我们要访问juqery 的资源(classpath:/META-INF/resources/webjars/) ,访问路径了就是:localhost:端口号/webjars/jquery/3.3.1/jquery.js
能访问到js 的资源:
以上我们访问SpringBoot 配置的静态资源访问形式,那如果使用我们自己写的静态资源,该如何访问?
点进:staticPathPattern
结合以上源码得出:
“/**” 访问当前项目的任何资源,都去(静态资源的文件夹)找映射
“classpath:/META‐INF/resources/” :可以在resources 中创建一个META‐INF 文件夹,里面还可以包含一个resources 目录,这是能访问到的,。
“classpath:/resources/”:resources 文件夹下还能再由一个resources,这是能访问到的,。
“classpath:/static/”,
“classpath:/public/” “/”:当前项目的根路径
在我们项目中,java 包下和resources 包下都是classpath: 的根路径
比如现在想访问一个asserts 文件下的静态资源:
注意:如果引入了webjars 依赖,那么要访问webjars 中的资源的话,路径就是/META-INF/resuorces/webjars/ 下找了
3)、欢迎页; 静态资源文件夹下的所有index.html页面;被"/**"映射;
比如我想访问index.html 首页:http://localhost:8080/index.html
4)、所有的 **/favicon.ico 都是在静态资源文件下找;
**/favicon.ico :这个是SpringBoot 用来定位图片资源的。即不用我们发送请求去访问这个图片资源,SpringBoot 会帮我们去找这个 /favicon.ico
可以通过spring.mvc.favicon.enabled= false; 来关闭这个功能。这个功能是默认开启的。
当访问Index.html 时:
自定义SpringBoot 的静态资源路径:
模板引擎:
引入thymeleaf 依赖:
引入的thymeleaf 版本:2.1.6,有点低。那应该怎么更换版本呢?
换成3.0.9 版本的,这样就能覆盖掉之前引入的版本
布局功能的支持程序,thymeleaf 3主程序 适配layout2以上版本
thymeleaf2 适配 layout1
如何使用thymeleaf?
去到autofigure 包中查看相关配置:
可以看到:只要把页面写在templates 文件下,就能使用thymeleaf 功能。
要访问templates 文件下的success 页面
success 页面:
访问路径:http://localhost:8080/success
在要使用thymeleaf 页面上引入thymeleaf 的模板引擎:
简单模拟后端传输到thymeleaf 页面显示:
success 页面:
thymeleaf 语法规则:
thymeleaf 的语法遇到html 的语法,前者数据会覆盖后者数据
thymeleaf 属性的优先级(优先解析):
表达式:
SprignMVC 自动配置原理:
- Spring MVC auto-configuration
以下是SpringBoot对SpringMVC的默认配置:(WebMvcAutoConfiguration)
Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans
自动配置了ViewResolver(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何 渲染(转发?重定向?))
ContentNegotiatingViewResolver:组合所有的视图解析器的;
ContentNegotiatingViewResolver:组合所有的视图解析器的;
视图解析器从哪来?
从BeanFactoryUtils 中获取到所有的ViewResolver。所以如果我们想自定义视图解析器,我们就可以往BeanFactoryUtils (即容器中)添加视图解析器,ContentNegotiatingViewResolver 就会拿到所有的视图解析器并作用。
自定义视图解析器,并加入到容器中
验证自定义视图解析器是否有加入到容器中,去DispatcherServlet 中看,这个类是所有请求一进来,都由它来转发。
让项目运行,然后前端发送一个请求。
Support for serving static resources, including support for WebJars (see below).静态资源文件夹路 径,webjars
Static index.html support. 静态首页访问
Custom Favicon support (see below). favicon.ico
自动注册了 Converter , GenericConverter , Formatter beans
Converter:转换器; public String hello(User user):前端数据传来,要数据类型要转换成后端数据类型,类型转换使用Converter
Formatter 格式化器; 2017.12.17===Date;
如果在配置文件中date-format 属性进行格式设置的话,那Formatter 才能生效。
把生成的Formatter 注入到容器中。
Support for HttpMessageConverters (see below)
HttpMessageConverter:SpringMVC用来转换Http请求和响应的;User—Json;
自己给容器中添加HttpMessageConverter,只需要将自己的组件注册容器中 (@Bean,@Component)
Automatic registration of MessageCodesResolver (see below).定义错误代码生成规则
Automatic use of a ConfigurableWebBindingInitializer bean (see below). 我们可以配置一个ConfigurableWebBindingInitializer来替换默认的;(添加到容器)。ConfigurableWebBindingInitializer :用来绑定请求数据和JavaBean 之间的数据,之间的数据类型转换,格式化都会用到上面的Converter,和Formatter组件
2、扩展SpringMVC
以前SpringMVC 的配置文件
编写一个配置类(@Configuration),是WebMvcConfigurerAdapter类型;不能标注@EnableWebMvc;
既保留了所有的自动配置,也能用我们扩展的配置;
原理:
在WebMvcAutoConfiguration 中,有一个内部类:WebMvcAutoConfigurationAdapter。这个类就继承了WebMvcConfigurerAdapter,然后SpringBoot 就会实现它的一些方法。
在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)
把所有的WebMvcConfigurer 都拿来加到容器中。
3)、容器中所有的WebMvcConfigurer都会一起起作用;
4)、我们的配置类也会被调用; 效果:SpringMVC的自动配置和我们的扩展配置都会起作用;
3、全面接管SpringMVC;
SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己配置;所有的SpringMVC的自动配置都失效了(连静态资源都访问不了) 我们需要在配置类中添加@EnableWebMvc即可;
原理:
为什么@EnableWebMvc自动配置就失效了;
点进@EnableWebMvc
再看WebMvcAutoConfiguration:
4)、@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;
5)、导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;
5、如何修改SpringBoot的默认配置
模式: 1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如 果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默 认的组合起来;
2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
在开发时,使用到thymeleaf 渲染的页面不要放在static 文件夹下,SpringBoot 不会帮你渲染的,要放在templates 下。
6)RestfulCRUD
项目一启动,就访问到templates 文件夹下的index 页面
在Controller 中让方法直接返回一个字符串,就会得到thymeleaf 引擎的解析,就回去templates 文件夹下找index.html页面。
但是每次都只是为一次简单请求就写一个Controller 空方法,这很浪费资源,那么可以用快捷的方法:
可以把所有的路径映射都放在一个WebMvcConfigurerAdapter 中,也可以肯定不同的请求页面,创建不同的WebMvcConfigurerAdapter ,再放到容器中。
首页的Bootstrap 引用:因为发送了请求访问了/webjars/ ,所以SpringBoot 就会转发到/META-INF/resources/webjars/ 下的路径,再拼接我们后面写的路径,就是正确的资源访问路径了。
用@{/,} 来进行项目资源定位的好处:如果我们该了项目访问路径,那么我们在浏览器访问项目时就要加上/crud ,但@{}会帮我们自动识别这个路径,然后帮我们加上。
国际化:通过在浏览器设置的语言信息,来动态显示页面的语言效果
以前用SpringMVC 的配置步骤:
1、编写国际化配置文件夹:
当你创建国际化资源文件时,比如你创建了login_zh_CN.properties ,idea 会识别出你要做国际化,然后就会弹出一个文件夹"Resource Bundle ‘login’"。下一次创建国际化资源文件时,
在创建另一个国际化资源文件时,只需要写上特殊的语言标识,idea 就会自动的帮你创建同类型的文件
在登录页面中,需要国际化的地方是:Please sign in, Username,Password,remember me。这四个地方
随便点一个资源文件
以上国际化资源文件就配置好了。记住国际化资源文件的命名规则:zh_CN 是中文。en_US 是英文
SpringBoot 自动配好了管理国际化资源文件的组件:
这里要拿到国际化资源文件的名称。
Springboot 默认帮我们起的名就叫message,所以如果我们配置的资源文件叫message.properties 的话,直接放在类路径下,就能直接使用了。
现在我们放在了i18n 文件夹下的login 文件中(只需要写资源文件的基础名就行,en_CN 它会帮我们自动识别这些文件的)
现在就可以在页面使用这个功能了。因为用的是thymeleaf 模板引擎,所以要遵守thymeleaf 的使用规则来使用:
只要用#{},来取出在资源文件中配置的语言规则,就能使用了。
出现乱码:
要把idea 中的中文进行编码,编成ascii
设置idea 其他Project 都使用这个编码:
设置页面语言信息:
实现功能:
当点击页面的“中文”,页面就显示中文信息。当点击"English",页面就显示英文信息。
SpringBoot 之所以能通过浏览器不同的信息切换国际化,原理:
国际化Locale(区域信息对象);LocaleResolver(获取区域信息对象);
默认的就是根据请求头带来的区域信息获取Locale进行国际化。如果我们要实现点击连接切换国际化,那么我们就得覆盖SpringBoot 的默认接收Locale 信息的方法。自定义一个接受Locale 的方法。
请求头中的语言信息
自定义LocalResolver
geDefault() :如果发送请求什么都不带,就默认用操作系统的语言设置
添加到容器中:
看源码,当我们往容器中加一个自定义的LocaleResolver 时,SpringBoot 给我们默认的LocaleResolver 就会失效:
所以我们就在配置类中加入自定义组件即可:
完成登录功能: 从登录页面到dashborad 页面
解决表单重复提交问题:
将请求转发变成请求重定向
但是重定向的数据又要经过thymeleaf 的渲染,即经过SpringBoot 的SpringMvc 层面,所以就要在MVC 适配器中添加重定向的路径,然后添加对应的页面。
但是又有一个问题,就是如果我们直接发送/main.html 请求,也能直接跳到dashboard 页面,那登录页面不是没用了么,所以得用一个拦截器。
public class LoginHandlerInterceptor implements HandlerInterceptor {
/**
* 目标方法执行之前
* @param
* @param
* @param o
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
HttpSession session = request.getSession();
Object user = session.getAttribute("loginUser");
if (user == null){
//未登录,利用request 的转发器返回登录页面
request.setAttribute("msg","没有权限,请先登录");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else{
//已登录,放行请求
return true;
}
}
把拦截器注入到SpringMVC 中