• springboot项目开发实战


    文章目录

    springboot项目开发实战之后端流程详解

    一、创建简单的springboot之web项目

    1、简单springboot框架环境搭建

    step1:
    在这里插入图片描述
    step2:
    在这里插入图片描述
    step3:
    在这里插入图片描述
    step4:
    在这里插入图片描述
    step5:
    在这里插入图片描述
    备注:所有的资源配置文件都要放到resource下面,如后面xxxMybatis.xml也是要在此目录下创建文件夹放置的,这样正规;

    2、相关jar包的导入

    在这里插入图片描述

    3、配置文件yaml的设置

    4、框架结构的梳理如过滤器和拦截器

    5、代码结构的书写

    1)controller层书写

    创建User类
    在这里插入图片描述
    创建controller
    在这里插入图片描述

    6、搭建此项目出现的问题小结

    第一:注意搭建环境时候的目录结构设置;
    第二:注意搭建环境的启动类的位置;
    第三:注意我们实体化类时候,务必构造器和get,set,tostring方法一起写,防止出错找不到;因为框架中构造器好像是依赖get方法的;
    第四:注意返回的参数类型,要在响应头中可以查看到;

    二、创建简单的springboot之web项目基础上用打包的jar包进行cmd启动

    1、web项目打包为jar包

    在这里插入图片描述
    打包所到的目录位置描述参考如下:
    在这里插入图片描述

    2、启动web项目的jar包

    target目录下:
    在这里插入图片描述
    注意:之前的工具eclipse,都是需要把项目打包jar后,然后部署到tomcat中,启动tomcat后才可以进行访问;而springboot中是没有部署到tomcat这个环节,我认为是因为springboot项目中自带了tomcat,所以就可以自动的不需要部署了直接访问;
    至于调试的时候为何都是直接调试就可以了,暂时不知道;
    eclipse的打包流程回头再补充对比再此;

    三、创建简单的springboot之web项目基础上引入框架结构即引入框架相关类形成体系的类关系结构

        原理说明:因为简单的web项目并不足以支撑我们复杂的业务结构;因此引入了别人写好的框架类,这些框架类可以有效的实现我们的业务结构层次清晰如controller层,service层,dao层,entity层或者domain层,以及类之间的解耦性,所以我们要引入这些类,就需要在pom导入jar包和配置文件(springMVC中是xml形式的配置文件来实例化类及串联起各个类之间的关系及类中参数的设置,而springBoot中是用java类文件加注解充当配置文件来实例化类及串联起各个类之间的关系,而用yml文件来进行各个类中参数的配置);
    
    • 1

    1、常用框架jar包导入:

    1)yml中有提示需要的jar包

    yaml文件配置参数的方式时候,要引入配置执行器jar包,因为只有引入它了,yaml文件中写配置时候,才会有提示;当然你不配置它也不会影响运行;具体描述如下网站
    在这里插入图片描述
    在这里插入图片描述

    2)

    2、常用框架配置文件注解:

    1)springboot中模拟springmvc中xml配置文件产生的注解:

    1、@Configuration作用于类上,相当于一个xml配置文件;
    2、@Bean作用于方法上,相当于xml配置中的;
    3、@Import注解 在创建配置文件之后可以引入其它的配置文件
    4、@ComponentScan(“com.sxt”)配置扫描(上面启动类已经举例)
    [1、我的理解是,它就是tomcat服务器启动时候,会首先加载的容器文件,(在springboot项目中,就是这个项目启动后,带动了tomcat服务器启动,然后首先会加载的容器文件,)然后这个容器中各个相关的框架类会根据框架依赖逻辑相继加载,各个类的参数也会在设置后相继加载;至于springboot项目的启动流程具体始末是什么,后续再论]
    (2、我的理解是,它就是框架类的实例化,或者自定义类的实例化)
    (3、我的理解是,它就是各个配置文件之间的串起来所用注解)
    (4、我的理解是,它就是启动类要寻找加载的相关文件夹和文件)
    在这里插入图片描述
    上面配置的方式中要给实例化的类注入参数的方式,是在此需要参数注入的对象上面使用注解@ConfigurationProperties,然后再yml文件配置中注入参数即可:
    在这里插入图片描述

    2)springboot中模拟springmvc中xml配置文件产生的注解基础上,进行框架改良升级,即等价于用一个注解可以实例化对象,用一个注解就可以在yml中进行参数配置;

    1、@Component,相当于xml配置文件+bean;
    2、@ConfigurationProperties(prefix=“student”);相当于xml中的参数set设置;
    3、@Autowired,相当于容器的注入,即get设置;
    在这里插入图片描述
    注意:@ConfigurationProperties注解虽然对yml也适用,但是yml里面书写时候要注意其相应格式,只有其自己的格式才会生效;具体见下面3所述;此简述如下,要key变色说明格式才对:
    在这里插入图片描述
    4、@Validated,相当于对注入值进行格式的校验;
    5、@Email,就是对注入值进行格式的校验为邮箱的格式校验,即配合4来完成,具体的代码书写如下,注意此4和5只能是@ConfigurationProperties(prefix=“student”);这种类参数设置的方式;不能是@Value这种主动获取类参数的设置方式,否则校验是无效的;
    在这里插入图片描述
    6、注意的是校验注解,除了jdk自带的注解外,也可以是第三方插件的注解,也可以是自己编写的注解;
    在这里插入图片描述

    3、常用框架相关类参数配置,当然配置也包括相关类参数的启用设置(涉及到yml赋值两种配置语法):

    application.properties参数赋值配置语法一:见上面2),另外其类的各种数据格式在yml中的赋值语法如下:
    在这里插入图片描述
    注意1:有一点要明白,既然左边加注解后已经到容器中了,后面参数配置后可以给对象设置值,说明右边的yml文件也是被读入到框架容器中了,不然二者怎么对接的上呢!
    注意2:配置也包括相关类参数的启用设置,意思是有些jar包引入后,因为是框架内部对相关类参数已经进行了设置,所以我们在yml文件中只需要对参数进行启用设置即如xxx.enable=true;即可;举例如插件thymeleaf;
    在这里插入图片描述
    application.yml参数赋值配置语法二:
    在这里插入图片描述

    4、常用框架相关类参数配置(涉及到yml赋值两种配置语法)之扩展:

    1)扩展1,不涉及到xml的纯springboot场景:

    上面的注入,所有的配置都是写在appliaction.properties或application.yml这两种固定名字的文件里,要是我们想要写在名字不一样的文件中怎么办?
    1、@PropertySource(“classpath:student.properties”)
    注意:若上面注解后,同时出现注解 @ConfigurationProperties(prefix=“student”)时候,所在的配置都是优先注入appliaction.properties或application.yml里面的数据,所以要区分出各个配置到底要取哪个配置文件的数据,就必须修改配置文件引入的前缀;
    在这里插入图片描述

    2)扩展2,涉及到xml的混合MVC和springboot场景:

    实质依然是xml文件方式来配置实例化对象和参数的设置,唯一的就是在springboot项目启动类上,加了加载xml文件到框架容器的注解而已;其余都是一样引入@Autowired注解去获取实例化对象;
    在这里插入图片描述

    3)扩展3,生产环境和开发环境的切换配置及配置文件加载的优先级

    (1)在项目上配置yml文件

    在这里插入图片描述
    注意:在 application.properties中是不能有#这个注解的,否则配置失效;

    (2)在已经打包好jar包上,cmd启动方式配置选择哪个yml文件

    在这里插入图片描述

    5、常用框架结构类代码阐述:

    1)、前端html模版引擎Thymeleaf,目的是让前端页面就网络在线离线情况下,均可以展示出效果;

    概念1:模版引擎就是把模版html进行启动加载,如此则可以让美工和后端人员有明确的视觉效果;
    概念2:Thymeleaf插件的产生让我们前端页面书写不再用jsp,而是直接采用html来进行书写;
    概念3:项目前后端没有进行分离时候,后续采用的技术就是Thymeleaf方案,其中后端和前端数据反馈的时候就涉及到了页面和数据格式两种方式;若项目前后端分离,则后端和前端数据反馈的时候就仅涉及到了数据格式一种方式;
    Thymeleaf的使用:
    1、Thymeleaf的开启,即后端模版引擎的开启,故可以支持html页面的解析;
    2、Thymeleaf后端和前端数据反馈的时候涉及到跳转页面的使用;
    3、Thymeleaf后端和前端数据反馈的时候涉及到数据格式在页面的使用;(注意:因为前后端分离的时候,我们后端都是直接的返回数据json给前端的,因此我们后端只需要@RestController;但是若前后端不是分离的项目时候,我们后端会跳转到指定的页面即如上2即可,换言之就是用注解@Controller即可;但是我们可能这个页面上也需要获取数据,那么我们怎么办,此注解只能反馈找页面,要是改注解为@RestController,则就直接变为返回数据json了,肯定不行;如何前后端未分离项目,既可以找到页面,又可以在此页面得到后端的数据呢?如需要引入参数Model,用model.addAttribute(“student”,student));这种方式来把数据返回到前端中;
    前端页面寻找场景一:
    动态资源加载即后端服务器内部转发寻找的资源页面是在templates目录结构下(注意:static是放置静态资源的目录,即前端可以直接访问的页面)
    在这里插入图片描述
    前端页面寻找场景二:
    当我们用Thymeleaf引擎加载器加载页面,不想加载默认目录下面的动态资源时候,希望加载指定目录下面的动态资源则:
    在这里插入图片描述
    注意:return “index”;后缀是自动加了.html的;即index.html;(这就是视图解析器中加前缀后缀的问题)
    前端页面国际化场景三:
    因为后端引入了Thymeleaf的jar包,因此后端yml文件设置数据时候,是可以自己创建两个文件,一个是中文文件,一个是英文文件的,这样前端页面在获取后端的该数据时候,会根据系统所在环境,自动的选择中文文件或者英文文件,从而实现中英文翻译;实战举例如下:
    备注:前端代码要想写的时候有提示功能,需要前端安装对应的Thymeleaf软件,注意这个软件只是前端代码书写时候起到提示功能的,不要和后端的这个jar包混淆;该软件安装步骤如下:
    附加:基于Thymeleaf前后端未分离项目的编写
    (1) html的编写;
    (2) js的编写;(核心就是ajax的写法)
    (3) css的编写;
    (4) 在上面基础上对成熟组件的应用如layui,easyui;bootstrap等
    注意:既然后端是用Thymeleaf引擎来加载前端页面html的,那么后端在前后端未分离项目中寻找到html页面后,就要对页面进行加载,自然需要引入Thymeleaf相关的头文件,如此方可以用Thymeleaf相关语法和加载此html页面;那么使用Thymeleaf的语法各种情况如下:
    语法一:前端${}对后端model存字符串的使用:
    在这里插入图片描述
    语法二:前端对后端model存对象的使用:
    在这里插入图片描述

    语法三:前端对后端model存集合的使用:
    在这里插入图片描述
    语法四:前端除了上面讲的标签html对数据的获取外,还有js对后端数据的获取语法如下:
    在这里插入图片描述
    语法五:前端从三大对象中取数据
    在这里插入图片描述
    分界点理解记忆:上面是前端从后端中获取数据用的是$符号;下面是前端从yml中取值用的是#符号;

    语法六:1)语法从yml中取值的应用及从从后端读取数据链接的用法:
    在这里插入图片描述
    语法六:2)在上面语法1)读取properties文件基础上,做国际化翻译:
    在这里插入图片描述
    注意:第一种自动默认的目录下做国际化翻译自动场景识别练习成功以外,后面的没有成功过,有时间再试试;注意国际化配置文件名字的格式,可以改头,中,尾三个位置:
    在这里插入图片描述
    注意:要是不分英文还是中文的yml,则都从同一个yml中取值的时候,yml中配置的是中文,则取的是中文,配的是英文,取的是英文;
    语法六:3)让页面访问yml中数据时候,顺便把参数填入补充
    在这里插入图片描述

    2)、过滤器和拦截器和监听器

    过滤器框架组件使用:
    在这里插入图片描述
    拦截器框架组件使用:
    在这里插入图片描述
    监听器框架组件使用:
    在这里插入图片描述
    servlet框架组件使用:
    在这里插入图片描述

    3)、切面类AOP

    在这里插入图片描述

    4)、视图解析器

    就是Thymeleaf中的页面前后缀的设置;

    5)、配置外部的tomcat

    要是我们用jsp就需要配置外部的tomcat,要是不用,就不必了;暂时不补充;

    6)、如何配置数据源

    概念1:数据源是我们来链接数据库的第三方类,通过它来进行数据库的连接沟通处理;
    概念2:常见的数据源有很多,但是因为和数据库连接是开销比较大的,因此比较好的数据源我们常用阿里的druid数据源;
    在这里插入图片描述
    附加数据源代理类源码和yml源码配置供借用方便:
    package com.example;

    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    import java.util.ArrayList;
    import java.util.Collection;

    @Configuration
    @ConditionalOnClass({DruidDataSource.class})
    public class DruidConfig {

    @Value("${spring.datasource.druid.loginUsername}")
    private String loginUsername;    //登陆名
    @Value("${spring.datasource.druid.loginPassword}")
    private String loginPassword;    //密码
    @Value("${spring.datasource.druid.allow}")
    private String allow;     //白名单  
    @Value("${spring.datasource.druid.deny}")
    private String deny;  // 黑名单 
    @Value("${spring.datasource.druid.druidRegistrationUrl}")
    private String druidRegistrationUrl;  //请求地址
    
    @Value("${spring.datasource.druid.exclusions}")
    private String exclusions;   //过滤器的过滤规则
    @Value("${spring.datasource.druid.filtersUrlPatterns}")
    private String filtersUrlPatterns;  //url
    
    /**
     * 创建DruidDataSource对象并设置其它属性
     */
    @Bean(initMethod="init")
    @ConfigurationProperties(prefix="spring.datasource.druid")
    public DruidDataSource getDrudiDataSource() {
    	return new DruidDataSource();
    }
    
    /**
     * 配置监控页面  注册StatViewServlet
     */
    @Bean
    public ServletRegistrationBean getStatViewServlet(){
    	//创建Servlet的对象
    	StatViewServlet servlet=new StatViewServlet();
    	//创建注册器
    	ServletRegistrationBean registrationBean=new ServletRegistrationBean<>();
    	//注册
    	registrationBean.setServlet(servlet);
    	//设置其它参数
    	registrationBean.addInitParameter("loginUsername", loginUsername);
    	registrationBean.addInitParameter("loginPassword", loginPassword);
    	registrationBean.addInitParameter("allow", allow);//
    	registrationBean.addInitParameter("deny", deny);
    	
    	registrationBean.addUrlMappings(druidRegistrationUrl);
    	registrationBean.setLoadOnStartup(-1);
    	return registrationBean;
    	
    }
    
    /**
     * 注册过滤器WebStatFilter
     */
    @Bean
    public FilterRegistrationBean getWebStatFilter(){
    	WebStatFilter statFilter=new WebStatFilter();
    	
    	FilterRegistrationBean registrationBean=new FilterRegistrationBean<>();
    	
    	registrationBean.setFilter(statFilter);
    	
    	registrationBean.addInitParameter("exclusions", exclusions);
    	
    	Collection urlPatterns=new ArrayList<>();
    	urlPatterns.add(filtersUrlPatterns);
    	registrationBean.setUrlPatterns(urlPatterns);
    	
    	return registrationBean;	
    }	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    }

    #druid的配置
    spring:
    datasource:
    type: com.alibaba.druid.pool.DruidDataSource #指定数据源的类型 druid
    druid:
    url: jdbc:mysql://127.0.0.1:3306/test
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    initialSize: 3
    minIdle: 3
    maxActive: 30
    maxWait: 15000
    timeBetweenEvictionRunsMillis: 120000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT ‘x’
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: false
    maxPoolPreparedStatementPerConnectionSize: 20
    removeAbandoned: true
    removeAbandonedTimeoutMillis: 20000
    logAbandoned: true
    logDifferentThread: true
    #filters: log4j,stat
    #connectionProperties: druid.stat.mergeSql=true;druid.stat.logSlowSql=true;druid.stat.slowSqlMillis=3000
    useGlobalDataSourceStat: true
    # Druid 监控 Servlet 配置参数
    druidRegistrationUrl: /druid/*
    loginUsername: root #监控后台登录名称
    loginPassword: 123456 #监控后台登录密码
    allow:
    deny:
    # Druid 监控过滤相关配置参数
    filtersUrlPatterns: /*
    exclusions: ‘.js,.gif,.jpg,.jpeg,.png,.css,.ico,.jsp,/druid/*’

    #mybatis的配置
    mybatis:
    mapper-locations: #配置mybatis的映射文件地址 注意一般放到resources里面
    - classpath:mapper/*Mapper.xml
    configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    7)、项目应用基于上面6)数据源后,项目写sql的方式

    项目写sql的方式一:jdbcTemplate的使用
    在这里插入图片描述
    项目写sql的方式二:集成mybatis纯注解的方式
    在这里插入图片描述
    备注1:basePackages={“A”,“B”};看到{}顾名思义都可以知道是可以加多个的
    备注2:数据库同方式一;测试结果如下:
    在这里插入图片描述
    备注3:当Mapper接口类不能实例化注入到容器时候,则会@Autowired下面的实例对象打印为null,因此需要在接口类上加@Mapper来进行实例化;
    备注4:这个注解方法采用与数据库交流后获取的数据,其映射关系是直接体现在sql语句上的,如select sys_name as name,就是查询到的数据库的sys_name字段,是映射到实体类name上的;
    附加:
    利用注解的方式
    @JsonProperty就是直接的映射到实体类上,不用向备注4一样映射到sql上,不过本人目前不清楚怎么搞;但是公司类似的可以看明白直接应用,当然公司的肯定有封装了的,因为要涉及机密;

    项目写sql的方式三:集成mybatis使用xxxMapper.xml文件
    在这里插入图片描述

    四、框架类中引入的插件辅助优化类

    1、热部署插件

    在这里插入图片描述

    2、log4j插件使用

    其目的是,让应用与sql交互时候,其执行的sql语句可以在控制台以sql形式打印出来;
    方式一:也是最简单的方式,只需要改下配置即可;
    在这里插入图片描述

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    软考 系统架构设计师系列知识点之基于架构的软件开发方法ABSD(6)
    Day2多种抓包工具介绍以及使用封包监听工具找到挑战数据包实现发送数据包进行挑战
    Spring系列文章:Bean的获取⽅式
    vue+element-ui的el-steps组件二次封装(步骤组件)
    c++模板的概念全新解释
    21 - 数据接口与selenium的基本用法
    淘宝购物车的测试用例
    flutter:监听路由的变化
    多线程开发中,多用消息传递,少用锁
    SpringBoot2运维实用篇(二)—— 配置高级
  • 原文地址:https://blog.csdn.net/m0_67392126/article/details/126115938