Spring Boot入门:从项目创建到请求响应实战

第一部分:Spring Boot概述

1.1 什么是Spring Boot

⭐ 老师强调 :Spring Boot可视为Spring MVC和Spring的结合体 ,核心优势在于简化了原有SSM框架的复杂配置,大幅减少需要手动编写和维护的配置文件数量。

SSM vs Spring Boot:

对比 SSM框架 Spring Boot
配置文件 大量XML配置 极少配置即可跑
依赖管理 手动管理版本冲突 官方父工程统一管理
服务器 需手动部署Tomcat 内置Tomcat
启动方式 部署到容器 main方法直接启动

⭐ 老师强调 :Spring Boot虽简化配置,但注解和请求语法规则与Spring MVC完全一致,该用的注解正常用,别误以为写法变了。

1.2 JDK版本注意

⭐ 老师强调 :Spring Boot 3要求JDK至少17 ,而咱们现在用的是1.8。软件工程并非工具越新越好------新版本未经充分测试,藏有未暴露问题;企业交付时若出新故障,常无前人方案可查。

Spring Boot版本 JDK要求
Spring Boot 2.x JDK 8+
Spring Boot 3.x JDK 17+

第二部分:创建Spring Boot项目

2.1 手动创建(推荐)

⭐ 老师强调 :手动建项目更干净------只需建个纯净的Maven项目,不起特殊模板,关键标识是有pom.xml文件。

步骤:

  1. 新建纯Maven项目(不带模板)
  2. JDK选1.8
  3. 在pom.xml中加<parent>继承Spring Boot官方父工程
  4. 引入核心启动器依赖

2.2 pom.xml配置

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.qcby</groupId>
    <artifactId>SpringBootProject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 父项目:继承Spring Boot官方父工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.18</version>
    </parent>

    <dependencies>
        <!-- Spring Boot核心基础启动器(必加) -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- 加载web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- thymeleaf模板 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>
    
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

⭐ 老师强调 :<parent>标签的作用像"认亲",让项目成为Spring Boot的子辈,从而获得其依赖与配置管理。必须加spring-boot-starter核心启动器,否则项目起不来。

2.3 主启动类

复制代码
package com.qcby;

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

@SpringBootApplication
public class SpringBootProjectApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootProjectApplication.class, args);
    }
}

⭐ 老师强调:

  • 主启动类放在com.qcby包下(所有Java程序也放这里,后续按controller、service、dao分层)
  • 类名随意,习惯叫项目名+Application
  • 必须加**@SpringBootApplication**注解
  • run()方法参数用当前类的类对象

2.4 项目结构

复制代码
src/
├── main/
│   ├── java/
│   │   └── com.qcby/
│   │       ├── SpringBootProjectApplication.java  ← 主启动类
│   │       ├── controller/                         ← 控制层
│   │       ├── service/                            ← 业务层
│   │       └── dao/                                ← 持久层
│   └── resources/
│       ├── application.yml                         ← 配置文件
│       ├── static/                                 ← 静态资源
│       │   ├── index.html
│       │   ├── css/
│       │   └── js/
│       ├── templates/                              ← 模板页面
│       │   └── suc.html
│       └── banner.txt                              ← 自定义启动图标(可选)

⭐ 老师强调:

  • static放可直接访问的静态页
  • templates放需经处理的模板页
  • 两者不能混放,否则访问不到

第三部分:注解体系

3.1 分层注解

⭐ 老师强调:项目分控制层、业务层、持久层,请求从浏览器到controller,经service再到dao操作数据库,再逐层返回,每层各有注解。

注解 对应层 说明
@Controller 控制层 接收请求
@Service 业务层 处理业务逻辑
@Repository 持久层 数据访问
@Component 通用 任意组件

⭐ 老师强调 :这些注解本质无区别 ,都是把类交给框架创建对象;约定俗成才让controller用@Controller、service用@Service。注解只管对象托管,不分层的逻辑约束。

3.2 控制反转(IOC)

⭐ 老师强调 :Java里没加static的方法属于对象级别,得先创建对象才能调用。正常得自己new对象再调,但没地方写创建代码时,就把创建对象交给Spring框架------这就是控制反转。

复制代码
@Controller  // 加在类上,Spring自动帮你创建对象
public class HelloController {
    // 不用自己new,Spring接管
}

⭐ 老师强调:原本对象创建和调用全靠自己写代码,现在靠注解"甩手"给框架,它内部悄悄完成了new的操作。

3.3 请求映射注解

复制代码
@Controller
@RequestMapping("/hello")  // 类级路径(1级目录)
public class HelloController {
    
    @RequestMapping(path = "world", method = {RequestMethod.GET}, 
                    produces = "application/json;charset=UTF-8")
    @ResponseBody
    public String hello() {
        System.out.println("hello");
        return "{\"message\":\"hello\"}";
    }
}

@RequestMapping属性:

属性 作用 说明
path / value 请求的url 二者等价
method 请求方式 GET/POST等
produces 响应头 返回数据的类型和编码

⭐ 老师强调:

  • @RequestMapping相当于之前Servlet里的@WebServlet,用来指定方法对应的访问路径
  • 类上写1级目录,方法上写2级目录,访问需一层层来
  • 项目小、方法少时全写在方法上不冲突就行;但文件多、controller多时易冲突,务必在类上挂1级目录做区分
  • pass和value等价,用哪个都行
  • 类上路径建议挂斜杠,方法上通常不挂,挂不挂都能匹配

3.4 @ResponseBody

⭐ 老师强调 :Spring MVC默认机制------若不加@ResponseBody,框架会认为要返回具体页面资源。

是否加注解 返回内容
不加 走视图解析,找页面
加@ResponseBody 直接返回数据
复制代码
// 返回数据(JSON字符串)
@RequestMapping("hello")
@ResponseBody
public String hello() {
    return "{\"message\":\"hello\"}";
}

// 返回页面(走视图解析)
@RequestMapping("test")
public String test(Model model) {
    model.addAttribute("message", "hello");
    return "suc";  // 找templatessuc.html
}

⭐ 老师强调 :直接返回的内容即便看起来像json,浏览器也只当作普通字符串,不会按json格式解析。必须设置响应格式为json (用produces),浏览器才按json处理。

第四部分:配置文件

4.1 application.yml

复制代码
#server:
#  port: 8081
#  servlet:
#    context-path: /sp2

#spring:
#  mvc:
#    static-path-pattern: /as/**

spring:
  thymeleaf:
    cache: false #关闭页面缓存
    encoding: utf-8 #编码
    prefix: classpath:/templates/ #页面映射路径
    suffix: .html #视图的后缀
    mode: HTML5 #模板模式

4.2 常用配置项

配置项 说明
server.port 端口号(默认8080)
server.servlet.context-path 项目根路径
spring.thymeleaf.cache 页面缓存(false关闭)
spring.thymeleaf.prefix 页面映射路径
spring.thymeleaf.suffix 视图后缀

⭐ 老师强调:

  • 配置文件一般命名application,有两种类型:.properties(点号分隔)和.yml(缩进)
  • yaml中冒号后必须加空格,否则识别不了
  • #表示注释,注释掉的配置不生效
  • 两种格式只是书写差异,底层配置逻辑一致

第五部分:静态资源与模板

5.1 静态资源(static)

⭐ 老师强调 :static目录就相当于项目的根目录,默认访问路径就在它下面。

访问规则:

资源 访问路径
staticindex.html http://localhost:8080/ 或 index.html
staticsuc.html http:suc.html
static/css/index.css /css/index.css

⭐ 老师强调:

  • 浏览器直接访问时无法写 /static,因为static就是根目录
  • 引入资源路径从根目录出发,不要带/static前缀
  • 默认首页都叫index.html

5.2 模板页面(templates)

⭐ 老师强调 :templates文件夹下的页面无法直接通过url访问。因为静态资源只去static里找,templates里的内容那样找根本找不到。

目录 访问方式
static 可直接url访问
templates 必须经controller返回
复制代码
@RequestMapping("test")
public String test(Model model) {
    model.addAttribute("message", "hello");
    model.addAttribute("name", "lisa");
    return "suc";  // 找templatessuc.html,拼成suc.html
}

5.3 Thymeleaf模板引擎

suc.html:

复制代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
success!!!
<p th:text="${message}"></p>
<p th:text="${name}"></p>
</body>
</html>

⭐ 老师强调:

  • 用模板引擎的好处是:边跳页边带数据
  • th:text="${message}"直接取controller传的message
  • 直接读这些数据必须引入命名空间 (xmlns:th),否则取不到
  • 用模板引擎就别手写JS赋值,多此一举

第六部分:请求参数接收

6.1 基本参数接收

复制代码
@RequestMapping("test1")
@ResponseBody
public void test1(String name, int age, 
                  @RequestParam(value = "sex", required = true) String sex) {
    System.out.println(name);  // 张三
    System.out.println(age);   // 20
    System.out.println(sex);   // 女
}

前端ajax:

复制代码
$(".btn").click(function() {
    $.ajax({
        url: "/test1",
        type: "get",
        data: {
            name: "张三",
            age: 20,
            sex: "女"
        },
        success: function(value) {
            console.log(value);
        }
    });
});

⭐ 老师强调 :用字段名直接接收参数时,系统会按名字自动一一匹配 。@RequestParam的required=false表示传不传都行,true则强制校验,不传会报错。

6.2 复杂参数(嵌套对象)

⭐ 老师强调 :JS里不能直接传对象格式,必须拆开用带引号的点语法传。

复制代码
data: {
    name: "张三",
    age: 20,
    sex: "女",
    "friends.name": "李华",   // 嵌套对象拆开
    "friends.age": 22,
    play: ['足球','篮球','羽毛球']  // 数组
}

后端接收:

复制代码
@RequestMapping("test1")
@ResponseBody
public void test1(String name, int age,
                  @RequestParam("friends.name") String fName,
                  @RequestParam("friends.age") String fAge,
                  @RequestParam("play[]") String[] play) {
    System.out.println(fName);  // 李华
    System.out.println(fAge);   // 22
    System.out.println(Arrays.toString(play));  // [足球, 篮球, 羽毛球]
}

⭐ 老师强调:

  • Java里不能写成"对象.属性"形式,因为Java没有这种变量
  • 必须重命名参数 (如fName、fAge),再用@RequestParam建立映射
  • 想识别数组,需给Play套两层中括号 (play[])
  • 实际开发中直接传值更常用,这种加中括号的用法较少见

6.3 实体类接收

User实体类:

复制代码
package com.qcby.entity;

import java.util.List;

public class User {
    private String name;
    private Integer age;
    private String sex;
    private Friends friends;
    private List<String> play;
    
    // getter/setter、toString省略
}

Friends实体类:

复制代码
package com.qcby.entity;

public class Friends {
    private String name;
    private Integer age;
    
    // getter/setter、toString省略
}

后端接收:

复制代码
@RequestMapping("test1")
@ResponseBody
public void test1(User user) {
    System.out.println(user.getName());
    System.out.println(user.getAge());
    System.out.println(user.getSex());
    System.out.println(user.getFriends().getName());
    System.out.println(user.getFriends().getAge());
    List<String> playList = user.getPlay();
    for (String play : playList) {
        System.out.println(play);
    }
}

⭐ 老师强调:

  • 简单字段可包进User实体
  • Friends属于嵌套结构,需再嵌套别的实体
  • 集合需循环打印,直接打印看不到内容

6.4 JSON格式传参

⭐ 老师强调 :get请求只能传简单数据,无法传json格式 这类复杂数据包。想传json对象这种复杂数据,必须换成post请求。

前端(JSON格式):

复制代码
$(".btn").click(function() {
    var obj = {
        name: "张三",
        age: 20,
        sex: "女",
        friends: {
            name: "李华",
            age: 22
        },
        play: ['足球','篮球','羽毛球']
    };
    $.ajax({
        url: "/test1",
        type: "post",
        contentType: "application/json",
        data: JSON.stringify(obj),
        success: function(value) {
            console.log(value);
        }
    });
});

后端接收:

复制代码
@RequestMapping("test1")
@ResponseBody
public void test1(@RequestBody User user) {
    System.out.println(user.getName());
    // ...
}

⭐ 老师强调:

  • 要用JSON模块的JSON.stringify()把obj转成json格式
  • 加contentType: "application/json"声明传递的是json数据
  • 后端用@RequestBody专门解析JSON格式
  • 不加@RequestBody就读不到,参数会是空
  • 必须换成post请求

6.5 参数接收方式对比

方式 适用 前端写法 后端接收
表单键值 简单数据 data: {name, age} 直接参数名
嵌套拆开 嵌套对象 "friends.name": "李华" @RequestParam("friends.name")
实体类 整体封装 同上 User user
JSON 复杂数据 JSON.stringify(obj) @RequestBody User user
Servlet 传统方式 - HttpServletRequest

第七部分:Spring MVC页面跳转与数据传递

7.1 Model传数据

复制代码
@RequestMapping("test")
public String test(Model model) {
    model.addAttribute("message", "hello");
    model.addAttribute("name", "lisa");
    return "suc";  // 返回templatessuc.html
}

suc.html:

复制代码
<p th:text="${message}"></p>  <!-- 输出 hello -->
<p th:text="${name}"></p>     <!-- 输出 lisa -->

⭐ 老师强调 :model.addAttribute把数据带到页面,模板引擎用th:text="${变量名}"直接取。

第八部分:自定义启动图标(Banner)

8.1 自定义banner

⭐ 老师强调:Tomcat启动时的banner图标默认是官方样式,但可以自定义。

步骤:

  1. 在resource目录下建banner.txt

  2. 把自定义图案粘贴进去

  3. 启动时自动读取该文件

    // 方式1:默认自动读取banner.txt
    SpringApplication.run(SpringBootProjectApplication.class, args);

    // 方式2:手动设置关闭banner
    SpringApplication springApplication = new SpringApplication(SpringBootProjectApplication.class);
    springApplication.setBannerMode(Banner.Mode.OFF); // OFF=关闭
    springApplication.run(args);

设置 效果
无banner.txt 走官方图标
有banner.txt 用自己的
Banner.Mode.OFF 关闭图标

⭐ 老师强调:有个网站能生成各类图标------上方修改时下方自动实时更新,改了设置立刻生效。

附录一:核心注解速查表

注解 作用
@SpringBootApplication 主启动类标识
@Controller 控制层
@Service 业务层
@Repository 持久层
@Component 通用组件
@RequestMapping 建立url请求映射
@ResponseBody 返回数据(非页面)
@RequestParam 接收请求参数
@RequestBody 接收JSON数据

@RequestMapping属性

属性 说明
path / value 请求url(等价)
method 请求方式
produces 响应头

@RequestParam属性

属性 说明
value 参数名
required 是否必传(true/false)
相关推荐
马剑威(威哥爱编程)1 小时前
【AI全栈后端12-02】Spring Boot 跑通第一个 AI 对话接口:HR 政策问答机器人实战
java·人工智能·spring boot·机器人
摇滚侠2 小时前
《Spring Boot 3:高级与架构设计》第 2 章 IOC 容器的高级机制 编程式驱动 IOC 阅读笔记 7
java·spring boot·笔记
不停喝水3 小时前
【前端转全栈java速通课】 项目实战④-1 Spring Boot 创建项目-定义接口-请求参数处理-分层规范-依赖注入
java·前端·spring boot
FYKJ_20104 小时前
springboot鲜花销售系统91056-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·mysql·django·课程设计
Wx-bishekaifayuan4 小时前
Springcloud中学在线学习平台58883-计算机课程设计、毕业设计
java·vue.js·spring boot·学习·spring·spring cloud·课程设计
JavaEdge.5 小时前
Redis 连接断开后的自动重连操作
spring boot·redis·后端·lettuce·tcp keepalive
EatFan13 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
凤山老林19 小时前
Spring Boot 集成 iText 7 实现动态 PDF 生成与电子签章:合同、报表场景实战
spring boot·后端·pdf·itext7·电子签章
卓怡学长20 小时前
w204基于springbo旅行社签证代理服务系统
java·spring boot·spring·intellij-idea