Part02 ☀️

YangeIT大约 12 分钟AIIOT物联网SpringBoot微信小程序华为云中州养老AIIOT版本MysqlApifoxServletHTTPGETPOST

Part02 ☀️

今日目标

  • SpringBoot概述和入门
  • Maven入门
  • SpringBoot进阶案例
  • JSON格式
  • SpringBoot获取参数方式
  • 统一结果集

1 SpringBoot入门 ✏️ ❤️

1.1 Boot概述 🍐

SpringBoot

在没有正式的学习SpringBoot之前,我们要先来了解下什么是Spring。

我们可以打开Spring的官网(https://spring.ioopen in new window),去看一下Spring的简介:Spring makes Java simple。

Spring的官方提供很多开源的项目,我们可以点击上面的projects,看到spring家族旗下的项目,按照流行程度排序为:

image-20231122163315170
image-20231122163315170

Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能。而我们在项目开发时,一般会偏向于选择这一套spring家族的技术,来解决对应领域的问题,那我们称这一套技术为spring全家桶

而Spring家族旗下这么多的技术,最基础、最核心的是SpringFramework。其他的spring家族的技术,都是基于SpringFramework的,SpringFramework中提供很多实用功能,如:依赖注入、事务管理、web开发支持、数据访问、消息服务等等。

而如果我们在项目中,直接基于SpringFramework进行开发,存在两个问题:配置繁琐、入门难度大。

所以基于此呢,spring官方推荐我们从另外一个项目开始学习,那就是目前最火爆的SpringBoot。

通过springboot就可以快速的帮我们构建应用程序,所以springboot呢,最大的特点有两个

  • 简化配置
  • 快速开发

Spring Boot 可以帮助我们非常快速的构建应用程序、简化开发、提高效率 。


image
image

SpringBoot 几乎霸占了整个微服务市场, 所以,大家在日常工作学习过程中,还是要学习SpringBoot

接下来,我们就直接通过一个SpringBoot的web入门程序,让大家快速感受一下,基于SpringBoot进行Web开发的便捷性。🎯

总结

课堂作业

  1. 为什么要学习Springboot?(提示:定义和作用、市场占有率、企业招聘要求)
  2. Spring Boot最大的特点是什么?🎤

1.2 Maven入门 ✏️

Maven入门

在创建SpringBoot项目之前,先要熟悉一下Maven的作用

Maven是一个项目管理工具,可以对Java项目进行构建、依赖管理。

Maven幻灯片

  1. Maven解决了什么问题?
  2. Maven的本地仓库中存的是什么?
  3. Maven中央仓库中有世界上所有的代码吗?

1.3 Boot入门程序 ✏️

入门程序

需求:基于SpringBoot的方式开发一个web应用,浏览器发起请求/hello后,给浏览器返回字符串 "Hello World ~"。

image-20231122163417687

代码操作

开发步骤

第1步:创建SpringBoot工程并添加启动类

第2步:定义HelloController类,添加方法hello,并添加注解

第3步:测试运行

项目放到非中文路径中~ 1、创建一个项目

imageimage

image
image

2、检查Maven配置是否正确

image
image

3. 项目创建成功后,在pom.xml中添加<parent></parent>父依赖,企业中使用2.7.4以下版本较多

  <!-- springboot父工程-->
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.0</version>
        <relativePath/>
</parent>

然后在引入依赖管理和插件

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
            <!-- lombok的依赖,能免除get和set方法 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.5.0</version>
            </plugin>
        </plugins>
    </build>

4. 整体效果如下:image

5. 然后在src-java下创建包名cn.yangeit(也可以是你自己公司域名的反写),并在包下创建启动类 👇

package cn.yangeit;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
        System.out.println("项目启动成功!!!!");

    }
}

image
image

总结

课堂作业

  1. 参考上述的讲义完成SpringBoot入门案例,理解SpringBoot简洁的特性🎤

同学们,一定要自己动手,不要复制粘贴,一定要自己敲代码,一定要自己敲代码,一定要自己敲代码!!!

完成后,将练习代码截图提交到任务平台,直接作为实训分数!

1.4 SpringBoot入门程序解析 🍐

入门程序我们已经搞定了,接下来,我们就一起来解析一下我们所编写的入门程序。

入门程序解析

Tomcat,是一个开源的Web应用服务器。 它可以看作是一个“小型网站服务器”,主要用于运行Java编写的网站

image
image

1. main方法如何启动Tomcat

image
image

因为我们在创建springboot项目的时候,选择了web开发的起步依赖 spring-boot-starter-web。而spring-boot-starter-web依赖,又依赖了spring-boot-starter-tomcat,由于maven的依赖传递特性,那么在我们创建的springboot项目中也就已经有了tomcat的依赖,这个其实就是springboot中内嵌的tomcat。

而我们运行引导类中的main方法,其实启动的就是springboot中内嵌的Tomcat服务器。 而我们所开发的项目,也会自动的部署在该tomcat服务器中,并占用8080端口号 。

image
image

1.5 SpringBoot进阶程序之响应数据结构 ❤️

SpringBoot进阶程序

访问boss直聘、百度等网站,发现返回的数据,不是简单的字符串,而是类似这样的,👇 https://www.zhipin.com/wapi/zpCommon/data/getCityShowPositionopen in new windowimage

上面这种特殊字符串叫做JSON,是企业中常用的前端后端交互的数据格式!!

下图是我们中州养老的部署图,发现,数据是来自数据库,数据库中的数据是一条条的,类似一个个对象,因此返回也是JSON格式 image

接下来,做一个案例,来体验SpringBoot项目的简便特性!!

代码操作

相关信息

  1. 创建User类,定义变量
  2. 根据HelloController的样子,创建UserController,将参数和返回值进行修改
  3. 运行测试,访问

创建User类,定义变量

@Data
public class User {
//    id,name,age,password,department,description,hobby
    private Integer id;
    private String name;
    private Integer age;
    private String password;
    private String department;
    private String description;
    private String hobby;
}

1.6 JSON格式的特点 ✏️🍐

JSON格式的特点

  • JSON:让数据传输更优雅
  • 在前后端进行交互时,如果是比较复杂的参数,前后端通过会使用JSON格式的数据进行传输。
image
image

学习Json,主要关注点:

  1. 在发送请求时,如何传递json格式的请求参数
  2. 在服务端的controller方法中,如何接收json格式的请求参数

在线Json转换网站open in new window

总结

课堂作业

  1. JSON格式有何用途?🎤

1.7. SpringBoot获得参数和数据响应 ✏️🍐

SpringBoot获得参数和数据响应

本节,我们主要讲解,如何接收页面传递过来的请求数据

  • 接收普通类型参数传递
  • 接收路径参数
  • 接收json数据参数

响应

  • 返回一般Json数据

请求参数获取实操

代码操作

🎯 1. 普通类型参数

简单参数 :在向服务器发起请求时,向服务器传递的是一些普通的请求数据。

参数格式:http://localhost:8848/users/simpleParam?name=韩立&age=188

路径上的参数名字和方法的形参必须一模一样,类型也要一致

操作步骤流程: 👇👇

image
image

🎯 2. 接收路径参数

路径参数:

参数格式:http://localhost:8848/users/112

  • 前端:通过请求URL直接传递参数
  • 后端:使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数
image
image

🎯 3. JSON传参

JOSN参数:

JSON格式:http://localhost:8848/users/jsonParam

  • 前端:通过请求体传递json参数
  • 后端:使用@RequestBody获取json参数

因为浏览器无法直接发送POST请求,所以需要借助Apifox工具,发送POST请求

json参数如下:

{
  "id": 3,
  "name": "韩立",
  "age": 188,
  "password": 1314,
  "department": "黄枫谷",
  "description": "一名修士",
  "hobby": "跑路"
}

后端代码: 👇

image
image

注意:传过来的JSON和后端定义的实体类,属性名必须一致 ,否则无法转换

测试图解:👇

image
image

响应数据实操

SpringBoot工程,Controller中的方法返回值对象,自动转成了Json字符串

image
image

总结

课堂作业

  1. 根据上述提示,完成路径参数和普通参数和JSON参数的传值(JSOn参数可以先练习,后续再练习),可以参考上述的代码🎤

完成后,将练习代码截图提交到任务平台,直接作为实训分数!

1.8 统一结果集 ✏️🍐

统一结果集

通过观察百度搜索结果,发现百度搜索结果,返回的JSON数据格式,发现很相似,几乎都含有以下字段:

{
  "code": 200,
  "message": "操作成功",
  "data": {}
}

code: 状态码,200表示成功,500表示失败 message: 提示信息 data: 返回的数据

统一结果集的作用:

  1. 统一返回格式,方便前端处理,无论是查询还是新增,修改,删除,返回的JSON格式都一样

那我们如何在我们项目中实现统一结果集呢?

  1. 导入一个AjaxResult类,用于封装返回结果
  2. 在Controller中,使用AjaxResult类封装返回结果

AjaxResult类:

package cn.yangeit;
import java.util.HashMap;
import java.util.Objects;
public class AjaxResult extends HashMap<String, Object>
{
    public static final int SUCCESS = 200;
    public static final int WARN = 601;
    public static final int ERROR = 500;

    private static final long serialVersionUID = 1L;

    /** 状态码 */
    public static final String CODE_TAG = "code";

    /** 返回内容 */
    public static final String MSG_TAG = "msg";

    /** 数据对象 */
    public static final String DATA_TAG = "data";

    /**
     * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
     */
    public AjaxResult()
    {
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param code 状态码
     * @param msg 返回内容
     */
    public AjaxResult(int code, String msg)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     * 
     * @param code 状态码
     * @param msg 返回内容
     * @param data 数据对象
     */
    public AjaxResult(int code, String msg, Object data)
    {
        super.put(CODE_TAG, code);
        super.put(MSG_TAG, msg);
        if (data!= null)
        {
            super.put(DATA_TAG, data);
        }
    }

    /**
     * 返回成功消息
     * @return 成功消息
     */
    public static AjaxResult success()
    {
        return AjaxResult.success("操作成功");
    }

    /**
     * 返回成功数据
     */
    public static AjaxResult success(Object data)
    {
        return new AjaxResult(SUCCESS, "操作成功", data);
    }

    /**
     * 返回警告消息
     */
    public static AjaxResult warn(String msg, Object data)
    {
        return new AjaxResult(WARN, msg, data);
    }

    /**
     * 返回错误消息
     */
    public static AjaxResult error()
    {
        return new AjaxResult(ERROR, "操作失败");
    }

}

Controller中:

//请求路径:http://localhost:8848/user?id=1
@RequestMapping("/user")
public AjaxResult getUserById(Integer id){
    //模拟数据库查询,是假数据
    User user = new User();
    user.setId(id);
    user.setName("张三");
    user.setAge(20);
    user.setDescription("张三很帅");
    user.setDepartment("研发部");
    user.setHobby("打篮球");
    return AjaxResult.success(user);
}

代码和测试图解:👇

image
image