Spring Boot 学习笔记整理

2023-11-08

spring boot 笔记

1.配置文件

1.application.properties

2.application.yml

作用:修改spring boot的默认设置

YAML:比XML和JSON更适合做配置文件,以数据为中心

2.YAML

使用yaml语法可以将yml配置文件的属性绑定在JavaBean中,JavaBean中必须用两个注解

@Component//将JavaBean添加到容器中才能使用这个功能
@ConfigurationProperties(prefix = "person")//将yml配置文件中的person部分与JavaBean绑定
person:
  name: zhangsan
  age: 19
  boss: false
  birthday: 2021/11/11
  maps: {k1: v1,k2: 12}
  lists: [lisi,wangwu]
  dog:
    name: 小黑
    age: 2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cZooSoAi-1623409489785)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210323212940086.png)]

@PropertySource(value = {"classpath:person.properties"})

@PropertySource注解可以指定加载的配置文件,而不仅仅只从全局配置文件中加载

指定开发环境配置

在我们的开发过程中可能会有很多模式:开发模式、生产模式、测试模式

我们不同的模式可能会有不同的端口,我们可以指定不同模式使用不同的端口

一、properties文件的方式的话就是创建多个application-xxx.properties文件,不同文件有不同的端口,但是默认会使用application.properties文件的端口,如果要指定端口的话我们可以使用spring.profiles.active=xxx来指定模式

二、也可以用yml的文档语言

server:
  port: 8080
spring:
  profiles:
    active: prod
---
server:
    port: 8081
spring:
  profiles: dev
---
server:
  port: 8083
spring:
  profiles: prod

加载组件

我们可以为组件创建一个配置类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vhPLbhhk-1623409489787)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210325211442692.png)]

在这个配置类中用到@Configration 注解

在方法中用@Bean注解可以返回一个容器

@Configuration//注明这是一个配置器类
public class MyConfig {
    //将方法的返回值添加到容器中
    @Bean
    public HelloServer helloServer()
    {
        return new HelloServer();
    }
}

指定访问路径

如果我们希望请求的路径可以自己指定而不是我们的项目名可以在主配置文件中使用

server.servlet.context-path=""

配置文件的加载位置

spring.config.location=""指定配置文件位置

不同等级的配置文件会一起起作用,起一个互补功能,高优先级的配置文件只能是覆盖一部分配置,剩下没有被覆盖的配置文件依然起作用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Of6CifgM-1623409489801)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210325212549749.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d8fVzo6j-1623409489802)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210328100045732.png)]

spring-boot自动配置原理

精髓:

​ 1.spring-boot启动会加载大量的自动配置类

​ 2.我们看我们需要的功能有没有spring-boot默认写好的自动配置类

​ 3.我们再来看这个自动配置类中到底配置了哪些组件(只要我们要用的组件有,我们就不需要再来配置了)

​ 4.给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值

总的思路是

首先我们先看一下xxxAutoConfiguration

然后进入xxxAutoConfiguration中看一下xxxproperties文件,打开properties文件,看它都有什么属性,我们可以根据自己的需要进行更改

自动配置报告

在application.properties 中使用debug=true

可以在控制台上打印了使用了什么自动配置类

日志框架

日志框架的接口选用:SLF4J

实现选用:logback

我们在使用日志框架的时候要先把其他的日志都替换成为slf4j框架,都在starter依赖中,spring boot已经为我们考虑到了

如果我们要引入其他的框架我们要把这个框架的默认日志依赖移除掉====

spring boot开发web

我们可以从webjars官网找到我们需要的前端框架,然后把依赖注入到pom.xml中,然后我们在访问的时候只需要写webjars下面资源的名字即可

静态资源文件夹

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VpvCO5At-1623409489802)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210328202722823.png)]

首页放在静态资源下

需要渲染的页面放在thymeleaf文件夹下

thymeleaf是一个渲染模板,可以渲染页面,比jsp更高级

thymeleaf语法

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>操作成功!</h1>
<!--th:text将div里面的文本内容设置为我们自己设置的内容 -->
<div th:text="${name}"></div>
</body>
</html>

可以使用thymeleaf的th属性来替换div中的默认的值,

<div id="div01" class="mydiv" th:id="${name}" th:class="${name}" th:text="${name}"></div>
//使用th来替换div中的id和class

thymeleaf语法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4peq8ANo-1623409489803)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210329145228308.png)]

thymeleaf表达式:

Simple expressions: Variable Expressions: ${...} Selection Variable Expressions: *{...}Message Expressions: #{...}Link URL Expressions: @{...} Fragment Expressions: ~{...}

在thymeleaf中可以遍历,使用th:each 遍历,例子

<h4 th:text="${user}" th:each="user:${users}"> </h4>这个代码的意思是,通过遍历将users中的属性保存到自定义的user变量中,如果要输出用th:text,此时输出的元素就是user(我们自定义的元素)
<h4>    <span th:each="user:${users}">[[${user}]]</span></h4>//如果想要在一行中直接输出而不用th:text那么可以用 [[...]] or [(...)]

扩展springmvc 的方法,创建一个configuration类,是WebMvcConfigurerAdapter类型,不能有@EnableWebMvc注解

@Configuration//用configuration注解标注public class MyMvcConfig extends WebMvcConfigurerAdapter {    //重写里面的方法   实现页面跳转机制    @Override    public void addViewControllers(ViewControllerRegistry registry) {        registry.addViewController("/zd").setViewName("success");    }}

spring boot中有很多xxxconfigurer 帮助我们进行扩展配置

springboot国际化操作

通过我们的thymeleaf模板语言来进行国际化操作

首先我们需要在主配置类application.properties中,添加spring.messages.basename=包+基础名

可以使用thymeleaf的语法th:text="#{}"取出messages

通过点击链接来切换,实际上是通过请求头来控制

自己配置一个区域化解析器,然后我们还需要将他们放在自己的配置类中

public class MyLocaleResolver implements LocaleResolver {    @Override    public Locale resolveLocale(HttpServletRequest request) {        String l = request.getParameter("l");        Locale locale=Locale.getDefault();        if(!StringUtils.isEmpty(l))        {            String[] s = l.split("_");            locale=new Locale(s[0],s[1]);        }        return locale;    }

登录的时候要配置一个拦截器,在配置拦截器之前,首先在登录控制器中参数中添加一个Httpsession对象,让它来保存一个用户名,让拦截器获取,如果获取到了就登录,获取不到就返回登陆界面重新登录,然后还要把自己写的拦截器组件在自己的配置类中注册

//登录处理器@Controllerpublic class LoginController {    @PostMapping("/user/login")    public String login(@RequestParam("username") String username, @RequestParam("password") String password, Map<String ,Object> map, HttpSession session) {                if(!StringUtils.isEmpty("username") &&"123456".equals("password"))                {                    session.setAttribute("LoginUser","username");                    return "redirect:/main.html";                }                else                {                    map.put("msg","用户名密码错误");//这个map是向登录页面传递数据,登陆页面来获取map的数据                    return "login";                }    }}
//登录拦截器public class LoginInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        Object user = request.getSession().getAttribute("LoginUser");        if(user == null)        {            //登录失败            request.setAttribute("msg","没有权限请登录");            request.getRequestDispatcher("/").forward(request,response);//转发器            return false;        }        else        {            return true;        }    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {    }}
//注册拦截器public WebMvcConfigurerAdapter webMvcConfigurerAdapter()    {        WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter()        {            @Override            public void addInterceptors(InterceptorRegistry registry) {                registry.addInterceptor(newLoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/","/user/login");            }        };return  adapter;

重要知识整理

在用Spring Boot 开发web项目的时候,我们要先在main文件中创建几个包 1.controller(存放处理器) 2.config(存放配置类) 3.compoent(存放自己写的组件,比如:拦截器,区域解析器等) 4.dao类 等

错误信息定制

如果是浏览器访问的话返回的就是错误页面;如果是其他的客户端访问的话返回的就是json数据

浏览器访问返回错误页面:

有模板引擎的情况下

我们可以==在tymeleaf下新建一个error文件夹==,然后我们把我们自己定制的错误页面放在这个文件夹中。其中我们既可以定制精确状态码的错误页面,也可以定制4xx和5xx的错误页面,其中错误页面中可以自己指定的属性有

1.status :状态码==

2.timestamp :时间戳

**3.error ** :错误提示

**4.expection ** :异常对象

**5.message ** :异常消息

**6.errors ** :JSR303数据校验的错误都在这里

在模板引擎中可以用行内语法取出来 例如[[${status}]]

        <main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">            <h1>status:[[${status}]]</h1>            <h2>timestamp:[[${timestamp}]]</h2>            <h2>error:[[${error}]]</h2>            <h2>exception:[[${exception}]]</h2>            <h2>message:[[${message}]]</h2>            <h2>errors:[[${errors}]]</h2>        </main>

没有模板引擎的情况下(模板引擎找不到这个错误页面)

那就在静态资源文件中找

如果都找不到错误页面,那就默认来到spring boot的默认错误提示页面

其他客户端访问返回json数据

定制返回的json数据:

在controller包中创建一个异常错误处理器

@ControllerAdvice//异常处理器需要用这个注解标注public class MyExceptionHandle {    @ResponseBody    @ExceptionHandler(NotUserExist.class)    public Map<String,Object> handleException(Exception e,HttpServletRequest request){        Map<String,Object> map=new HashMap<>();        request.setAttribute("javax.servlet.error.status_code",404);//用来自定义错误界面,否则就是202错误        map.put("code","user.notexist");        map.put("message",e.getMessage());        return map;    }}

但是这个有缺陷,上面两个方法都不能实现在浏览器访问返回错误页面,在其他客户端返回json的目的,

下面我们来实现一个自适应的错误处理机制,让它浏览器访问的时候可以返回我们自己定制的错误页面,其他客户端访问的时候可以返回我们定制的json 数据

我们要向容器中添加一个组件 MyErrorAttributes

@Componentpublic class MyErrorAttributes extends DefaultErrorAttributes {    @Override    public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {        Map<String, Object> map = super.getErrorAttributes(webRequest, options);        map.put("company","com.nuc");        Object ext = webRequest.getAttribute("ext", 0);//0是取出的方式就request请求方式        map.put("ext",ext);        return map;    }}

一.下面我们来详细的梳理一下自定义错误处理数据

1)、 自定义浏览器访问时的错误页面

在tymeleaf文件夹下创建一个error文件夹或者静态资源文件夹下创建一个error文件夹,创建我们自己的响应代码错误页面,比如:404.html 4xx.html 5xx.html 500.html等

目录层次是:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5yAtzVSs-1623409489804)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210404211430086.png)]

2)、自定义其他客户端访问时的json数据错误页面

在controller文件夹中创建一个错误处理器,比如MyErrorHandle 在这个处理器中存放我们自定义输出的json数据,首先还需要创建一个exception文件夹,然后在这个文件夹中创建一个自己的异常类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4s59kIz-1623409489804)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210404212152199.png)]

package com.nuc.springweb02.exception;public class NotUserExist extends RuntimeException{    public NotUserExist() {        super("用户不存在");    }}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnQSUc6F-1623409489805)(C:\Users\86130\AppData\Roaming\Typora\typora-user-images\image-20210404211725009.png)]

@ControllerAdvice//这个注解说明是一个错误处理器public class MyExceptionHandle  {    @ExceptionHandler(NotUserExist.class)//指定你需要处理哪个错误类    public String myException(Exception e, HttpServletRequest request){        Map<String, Object> map=new HashMap<>();//map中放我们自定义的json数据        request.setAttribute("javax.servlet.error.status_code",404);//这里一定注意,要自己手动指定状态码,要不然就默认是200        map.put("code","123456");        map.put("message",e.getMessage());//这里的message方法就是我们自己写的错误类中的super()中的数据        request.setAttribute("ext",map);//把我们自定义的code和message传给MyErrorAttribute        return "forward:/error";//注意一定要有这个,不然你自己手动定义的状态码不起作用    }}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 学习笔记整理 的相关文章

随机推荐

  • gym102263 problem J Thanos Power (dp)

    链接 题意 给出一个大数 有两种操作 加 1 0 x 10 x 10x和减 1 0
  • Ceph中一些PG相关的状态说明和基本概念说明、故障模拟

    Ceph中一些PG相关的状态说明和基本概念说明 最近公司有个Ceph集群出了点问题 于是也参与了修复的过程 过程中最让人头疼的就是一堆不明所以的状态了 所以看了看文档 也找了一些参考 整理了一下Ceph PG的一些状态以及相关的概念说明 做
  • 图片特征提取整理(持续更新....)

    这篇文章写的比较匆忙 还有很多算法没有写进去 而且也有很多算法没有写完整 大家可以先看看我下面放的参考文献 也可以先收藏我的文章 我在后续的学习中还会更新完善这篇文章 谢谢大家的支持 目录 Harris角点检测原理详解 1 算法基本思想 2
  • Java同步方法及代码块

    同步方法及代码块 synchronized 同步方法 由于我们可以通过private关键字来保证数据对象只能被方法访问 所以我们只需要针对方法提出一套机制 这套机制就是synchronized关键字 它包括两种用法 synchronized
  • yolov5目标检测算法解析:基础网络模块

    Yolov5的模型定义分两个阶段 分别是基础模块设计阶段和完整模型搭建阶段 基础模块设计阶段 是基于pytorch架构的基本神经网络算子 进一步构造成具有特定功能和含义的自定义神经网络模块 完整模型搭建阶段 是通过结构化文件 利用基础模块
  • 初学者学习 JavaScript – JS 基础知识手册2023新版

    本手册的目的是迅速向你介绍JavaScript的基础知识 以便你可以开始编写应用程序 它并不包括JavaScript的所有理论和概念 而是只教授语言中最重要的构件 它包括变量 数据类型 函数 对象 数组和类 你还将学习如何结合它们来构建小型
  • ipad上有没有html编辑器,推荐:iPad上6款非常值得一试的工作软件

    得益于苹果出色的工业设计和优秀的用户体验 iPad已经成为了用户数量最多 最受欢迎的平板电脑 同时苹果App Store创造的一个良好的生态环境 也不断吸引越来越多的应用开发者为用户提供更多的优秀应用 下面为iPad用户介绍的 六款软件 都
  • 如何寻找二叉树任意处p、q的公共祖先

    算法思想 使用非递归的后序遍历 假设p在q的左边用栈保存二叉树的指针 栈 S 中全部元素都是当前指针 p 的祖先们 判断方法 先将栈复制到一个辅助栈 tempS 中 继续遍历到结点 q 的时候 将栈中元素从栈顶开始逐个和辅助栈 tempS
  • 力扣博文链接

    目录 树 堆 模拟 枚举 组合 链表 递归 宽搜 指针 进制 图论 分析 贪心 数学 构造 概率 排序 日期 KMP RMQ Trie树 对顶堆 扫描线 自动机 格雷码 字符串 思维题 逆序对 回文串 全排列 离散化 线段树 平衡树 单调栈
  • windows里的vscode 通过ssh远程到Linux服务器,显示matplotlib图形

    本地vscode安装插件 PYQT Integration 右键 py 选择 Run Current File in interactive Window 一些使用PyQt的步骤 conda activate py38 在自己的conda环
  • 用虚拟机安装linux程序

    其实这是一个很简单的工作 大牛不要嘲笑 这里只是写一个简单的流程 首先 是使用的软件 虚拟机程序Oracle VM VirtualBox http www oracle com technetwork server storage virt
  • IP地址的分类及子网掩码的计算

    目录 一 什么是IP地址 IP地址的作用及其种类 二 分类的IP地址 三 无分类编址 四 网络号 主机号和子网掩码的计算 一 1 IP地址 整个互联网中 分配给每一个主机在全世界范围内唯一的32位二进制码 2 IP地址的表示方法 为了可读性
  • Mybatis-Plus的详细使用

    一 MyBatisPlus概述 需要的基础 MyBatis Spring SpringMVC学完 为什么要学习呢 它可以节省我们大量的工作时间 所有的JDBC都可以自动化完成 JPA tk mapper MyBatisPlus 简介 是什么
  • 线上流量特训营:暴力引流10W+中小卖家流量破局技巧等

    新标题 突破流量瓶颈 线上流量特训营助力中小卖家引爆10W 流量的破局技巧 文章 引言 100字 线上流量特训营是一项旨在帮助中小卖家突破流量瓶颈的破局技巧 通过学习特训营提供的精选流量引爆策略 中小卖家可以迅速吸引超过10W的流量 实现业
  • L1-5 试试手气 (15 分)

    我们知道一个骰子有 6 个面 分别刻了 1 到 6 个点 下面给你 6 个骰子的初始状态 即它们朝上一面的点数 让你一把抓起摇出另一套结果 假设你摇骰子的手段特别精妙 每次摇出的结果都满足以下两个条件 1 每个骰子摇出的点数都跟它之前任何一
  • FWT 详解 知识点

    前言 扯淡 可以跳过 其实去年清华集训之后就想写这篇文章了 但是写了一会发现有点说不明白话 于是受限于语文水平一直没有写 前几天给人当面讲了一遍 感觉大概可以BB明白些了 picks的博客里就写着fwt怎么做 然而他并没有写为什么这样是对的
  • 【微服务架构】面向故障设计微服务架构

    微服务架构可以通过定义明确的服务边界隔离故障 但就像在每个分布式系统中一样 网络 硬件或应用程序级别问题的可能性更高 由于服务依赖关系 任何组件都可能对其消费者暂时不可用 为了最大限度地减少部分中断的影响 我们需要构建可以优雅地响应某些类型
  • 爬取上交所和深交所的年报问询函到Excel

    注意事项 需要安装一些包 如pdfminer pdfminer3k pdfplumber等 pdfminer不能解析上交所问询函 使用解析功能更为强大的pdfplumber可以解析 但是内容上可能会出现个别字重复的现象 pdfminer3k
  • 区间预测

    区间预测 MATLAB实现基于QRCNN BiGRU Multihead Attention多头注意力卷积双向门控循环单元多变量时间序列区间预测 目录 区间预测 MATLAB实现基于QRCNN BiGRU Multihead Attenti
  • Spring Boot 学习笔记整理

    spring boot 笔记 1 配置文件 1 application properties 2 application yml 作用 修改spring boot的默认设置 YAML 比XML和JSON更适合做配置文件 以数据为中心 2 Y