SpringBoot学习笔记
🌏🌏🌏
SpringBoot项目实践,国际化配置,拦截器,CRUD…
MVC自动配置原理
查看源码,看SpringBoot对我们的SpringMVC还做了哪些配置,包括如何扩展,如何定制。
1 | Spring MVC Auto-configuration |
仔细对照一下,它告诉我们SpringBoot已经帮我们自动配置好了SpringMVC;
一. 内容协商视图解析器
自动配置了ViewResolver,就是我们之前学习的SpringMVC的视图解析器;
即根据方法的返回值取得视图对象(View),然后由视图对象决定如何渲染(转发,重定向)。
我们去看看这里的源码:我们找到 WebMvcAutoConfiguration , 然后搜索ContentNegotiatingViewResolver。找到如下方法!
1 |
|
我们可以点进这类看看!找到对应的解析视图的代码;
1 | // 注解说明:@Nullable 即参数可为null |
我们继续点进去看,他是怎么获得候选的视图的呢?
getCandidateViews中看到他是把所有的视图解析器拿来,进行while循环,挨个解析!
1 | Iterator var5 = this.viewResolvers.iterator(); |
既然它是在容器中去找视图解析器,那我们自己就可以给容器中去添加一个视图解析器;这个类就会帮我们自动的将它组合进来;
我们在我们的主程序中去写一个视图解析器来试试;
1 | //如果你想自定义一些功能,只要写这个组件,就可以将他交给springboot,springboot就会帮我们自动装配 |
1 | //如果你想自定义一些功能,只要写这个组件,就可以将他交给springboot,springboot就会帮我们自动装配 |
二. 修改SpringBoot的默认配置
SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(如果用户自己配置@bean),如果有就用用户配置的,如果没有就用自动配置的;
如果有些组件可以存在多个,比如我们的视图解析器,就将用户配置的和自己默认的组合起来!
扩展使用SpringMVC 官方文档如下:
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components.
我们要做的就是编写一个@Configuration注解类,并且类型要为WebMvcConfigurer,还不能标注@EnableWebMvc注解;我们去自己写一个;我们新建一个包叫config,写一个类MyMvcConfig;
1 | //应为类型要求为WebMvcConfigurer,所以我们实现其接口 |
我们去浏览器访问一下:

确实也跳转过来了!所以说,我们要扩展SpringMVC,官方就推荐我们这么去使用,既保SpringBoot留所有的自动配置,也能用我们扩展的配置!
我们可以去分析一下原理:
1、WebMvcAutoConfiguration 是 SpringMVC的自动配置类,里面有一个类WebMvcAutoConfigurationAdapter
2、这个类上有一个注解,在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)
3、我们点进EnableWebMvcConfiguration这个类看一下,它继承了一个父类:DelegatingWebMvcConfiguration
这个父类中有这样一段代码:
1 | public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport { |
4、我们可以在这个类中去寻找一个我们刚才设置的viewController当做参考,发现它调用了一个
1 | protected void addViewControllers(ViewControllerRegistry registry) { |
5、我们点进去看一下
1 | public void addViewControllers(ViewControllerRegistry registry) { |
所以得出结论:所有的WebMvcConfiguration都会被作用,不止Spring自己的配置类,我们自己的配置类当然也会被调用;
三. 全面接管SpringMVC
官方文档:
1 | If you want to take complete control of Spring MVC |
全面接管即:SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己去配置!
只需在我们的配置类中要加一个@EnableWebMvc。
我们看下如果我们全面接管了SpringMVC了,我们之前SpringBoot给我们配置的静态资源映射一定会无效,我们可以去测试一下;
不加注解之前,访问首页:

给配置类加上注解:@EnableWebMvc

我们发现所有的SpringMVC自动配置都失效了!回归到了最初的样子;
当然,我们开发中,不推荐使用全面接管SpringMVC
思考问题?为什么加了一个注解,自动配置就失效了!我们看下源码:
1、这里发现它是导入了一个类,我们可以继续进去看
1 | ({DelegatingWebMvcConfiguration.class}) |
2、它继承了一个父类 WebMvcConfigurationSupport
1 | public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport { |
3、我们来回顾一下Webmvc自动配置类
1 | (proxyBeanMethods = false) |
总结:@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;
而导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能!
项目实践
一. 页面配置
1). 默认访问首页
1 |
|
2). 修改页面中样式路径
引入命名空间xmlns:th="http://www.thymeleaf.org",@{/XXX}引入文件路径
1 |
|
二. 国际化配置
1). 设置properties的编码问题

2). 添加语言配置文件
在resources资源文件下新建一个i18n目录,存放国际化配置文件;

login.properties :默认
1 | =登录 |
login_en_US.properties
1 | =Sign in |
login_zh_CN.properties
1 | =登录 |
3). 配置文件中设置路径
1 | # 关闭模板引擎thymeleaf的缓存 |
4). 修改页面文件
#{XXX}获取国际化文件属性;
1 | <body class="text-center"> |
5). 配置国际化解析
如果想点击链接让我们的国际化资源生效,就需要让我们自己的Locale生效!
修改一下前端页面的跳转连接:
1 | <a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a> |
再写一个处理的LocaleResolver组件类
1 | public class MyLocaleResolver implements LocaleResolver { |
然后需要配置一下这个组件!在我们自己的MvcConofig下添加bean;
1 |
|
三. 登录功能
1). 登录验证
添加一个登录控制类
1 |
|
登录页面
- 文本框添加名字,添加提示信息
1 | <body class="text-center"> |
在配置类中添加主页面路径
1 |
|
2). 登录拦截器
新建登录拦截类
1 | public class LoginHandlerInterceptor implements HandlerInterceptor { |
登录控制类添加session判断
1 |
|
配置类中配置拦截器
1 |
|
3). 注销用户
注销按钮
1 | <a class="nav-link" th:href="@{/user/logout}">注销</a> |
控制类注销用户
1 | //注销用户 |
四. 增删改查
1). 查询控制
添加查询控制器
1 |
|
点击跳转
1 | <li class="nav-item"> |
员工列表
1 | <table class="table table-striped table-sm"> |
2). 抽取公用代码
新建一个公用代码存储页面
1 |
|
3). 点击高亮显示
在主页和员工列表引用代码
1 | <!--导入顶部导航栏--> |
1 | <!--插入导航栏--> |
在公用代码中获取参数,实现高亮
1 | <li class="nav-item"> |
1 | <li class="nav-item"> |
4). 添加员工
在员工列表上新建一个添加按钮
1 | <a style="float:right" class="btn btn-sm btn-success" th:href="@{/emp}">添加员工</a> |
新建一个添加页面
1 | <!--插入导航栏--> |
控制层中的添加方法
1 | ("/emp") |
5). 修改员工
在员工列表上添加修改按钮
1 | <td> |
新建一个修改页面
1 | <!--插入导航栏--> |
控制层中的修改方法
1 | //跳转修改页面 |
6). 删除员工
在员工列表上添加删除按钮
1 | <td> |
控制层中的删除方法
1 | //删除操作 |

- 本文作者:
腾飞
- 本文链接:
https://www.tengfei.eu.org/article/82243bc0.html
- 版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!