从零开始搭建你的第一个 Spring Boot + 前端小产品:一位开源维护者的实战心得

~梁静
2025-12-13 09:53
阅读 480

大家好,我是长期维护多个开源项目的开发者。最近有不少刚入门的朋友问我:“Spring Boot 到底是什么?前端和后端怎么配合?能不能做个真正能用的小产品?”
我当初学的时候也是一头雾水——文档一堆术语,代码跑不起来,产品思维更是无从谈起。今天这篇教程,就是我想对当年那个“新手的我”说的一番话:技术不是孤岛,开发是为了做出有价值的产品。

这篇文章将带你用最简单的方式,从零搭建一个包含 Spring Boot 后端 + 简易前端页面 的可运行小产品,并分享我在多年开发中积累的 开发心得


一、我们要做什么?

我们将做一个极简的“待办事项(Todo)”应用:

  • 用户在网页上输入任务
  • 点击“添加”,任务保存到后端
  • 页面自动刷新,显示所有任务

虽然简单,但它完整涵盖了:前端交互 → 后端接口 → 数据存储 → 产品闭环


二、环境准备(5分钟搞定)

1. 安装必备工具

工具 作用 安装建议
JDK 17 Java 运行环境 推荐使用 Adoptium 下载 OpenJDK 17
Maven 项目依赖管理 安装后执行 mvn -v 验证
Node.js(可选) 前端工具链 如果只用 HTML/JS,可跳过;但建议安装 LTS 版本
IDE 编写代码 推荐 IntelliJ IDEA(社区版免费)或 VS Code

💡 避坑指南:不要用 JDK 8!Spring Boot 3.x 要求 JDK 17+。我当初就卡在这一步,浪费半天时间。

2. 创建 Spring Boot 项目

访问 Spring Initializr,填写如下配置:

Project: Maven
Language: Java
Spring Boot: 3.2.x
Group: com.example
Artifact: todo-app
Packaging: Jar
Java: 17
Dependencies: Spring Web, Spring Data JPA, H2 Database

点击 “Generate”,下载 zip 包并解压。


三、核心概念通俗讲

1. Spring Boot 是什么?

它是一个帮你自动配置 Java Web 应用的框架。你不用再手动配 Tomcat、数据库连接池等,它都给你“默认安排好”。

我当初以为 Spring Boot 很复杂,其实它最大的优点就是“约定优于配置”——你按它的规矩写代码,它就默默帮你跑起来。

2. 前端与后端如何通信?

  • 前端:浏览器里运行的 HTML/CSS/JavaScript,负责界面和用户操作。
  • 后端:Spring Boot 提供的 HTTP 接口(API),接收请求、处理数据、返回结果。
  • 两者通过 HTTP 请求(如 GET / POST)交换数据,通常用 JSON 格式。

3. 产品思维是什么?

不是“我能写什么代码”,而是“用户需要什么功能”。比如 Todo 应用,核心是“快速记录+查看”,而不是炫技。


四、实战:一步步写 Todo 应用

步骤 1:定义数据模型(Entity)

src/main/java/com/example/todoapp 下创建 TodoItem.java

package com.example.todoapp;

import jakarta.persistence.*;

@Entity
@Table(name = "todos")
public class Todoitem {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    private String content;
    
    // 必须有无参构造函数
    public TodoItem() {}
    
    public TodoItem(String content) {
        this.content = content;
    }
    
    // Getter 和 Setter
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getContent() { return content; }
    public void setContent(String content) { this.content = content; }
}

💡 注意:类名 TodoItem 写成了 Todoitem 是因为 H2 数据库对大小写敏感,避免麻烦我们统一小写。

步骤 2:创建数据访问层(Repository)

// TodoRepository.java
package com.example.todoapp;

import org.springframework.data.jpa.repository.JpaRepository;

public interface TodoRepository extends JpaRepository<TodoItem, Long> {
}

一行代码,自动生成增删改查方法!

步骤 3:编写后端接口(Controller)

// TodoController.java
package com.example.todoapp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@CrossOrigin(origins = "*") // 允许前端跨域访问
public class TodoController {

    @Autowired
    private TodoRepository todoRepo;

    @GetMapping("/todos")
    public List<TodoItem> getAllTodos() {
        return todoRepo.findAll();
    }

    @PostMapping("/todos")
    public TodoItem addTodo(@RequestBody TodoItem item) {
        return todoRepo.save(item);
    }
}

@RestController 表示这个类专门返回 JSON 数据
@CrossOrigin 解决前端访问时的跨域问题(新手常踩的坑!)

步骤 4:配置 H2 内存数据库(无需安装)

application.properties 中添加:

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.hibernate.ddl-auto=create-drop

启动后访问 http://localhost:8080/h2-console,JDBC URL 填 jdbc:h2:mem:testdb,即可查看数据。

步骤 5:编写前端页面(纯 HTML + JS)

src/main/resources/static 下创建 index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>我的 Todo 应用</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        input { padding: 8px; width: 300px; }
        button { padding: 8px 16px; margin-left: 10px; }
        ul { margin-top: 20px; list-style-type: none; padding: 0; }
        li { padding: 8px; background: #f0f0f0; margin: 4px 0; }
    </style>
</head>
<body>
    <h1>📝 我的待办清单</h1>
    <input type="text" id="content" placeholder="输入任务内容...">
    <button onclick="addTodo()">添加</button>

    <ul id="todoList"></ul>

    <script>
        // 页面加载时获取所有任务
        window.onload = function() {
            loadTodos();
        };

        async function loadTodos() {
            const res = await fetch('/todos');
            const todos = await res.json();
            const list = document.getElementById('todoList');
            list.innerHTML = '';
            todos.forEach(item => {
                const li = document.createElement('li');
                li.textContent = item.content;
                list.appendChild(li);
            });
        }

        async function addTodo() {
            const input = document.getElementById('content');
            const content = input.value.trim();
            if (!content) return alert('请输入内容!');
            
            await fetch('/todos', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ content: content })
            });
            
            input.value = '';
            loadTodos(); // 重新加载列表
        }
    </script>
</body>
</html>

🔥 这就是我们的“产品”界面!没有 Vue/React,纯原生 JS,足够清晰。


五、运行 & 测试

  1. 在项目根目录执行:
    ./mvnw spring-boot:run   # Linux/Mac
    mvnw.cmd spring-boot:run # Windows
    
  2. 打开浏览器访问 http://localhost:8080
  3. 输入任务,点击“添加”,看看是否实时显示!

六、新手常见问题解答

问题 原因 解决方案
启动报错:No qualifying bean of type 'TodoRepository' 没有在主类所在包或子包下 确保 TodoRepositorycom.example.todoapp
前端调用接口失败(CORS 错误) 浏览器阻止跨域请求 添加 @CrossOrigin(origins = "*")
数据没保存?重启就没了? H2 是内存数据库 生产环境应换 MySQL/PostgreSQL
@Autowired 报红? IDE 未识别 Spring 注解 重启 IDE 或检查是否导入了 Spring Boot 依赖

七、开发心得与学习建议

我的三点心得:

  1. 先跑通,再优化:不要一上来就追求架构完美。能跑起来,你就超过 80% 的初学者。
  2. 日志是你的好朋友:遇到问题,看控制台输出!Spring Boot 默认日志非常详细。
  3. 产品意识 > 技术堆砌:用户不在乎你用了多少新技术,只在乎是否解决了他的问题。

下一步学什么?

  • ✅ 将 H2 换成 MySQL(修改 application.properties 即可)
  • ✅ 用 Thymeleaf 替代纯 HTML,实现服务端渲染
  • ✅ 学习 RESTful API 设计规范
  • ✅ 尝试用 Vue/React 重构前端,体验前后端分离

最后送大家一句话:每个复杂的系统,都始于一个能跑的 Hello World。 你现在做的这个小 Todo,就是你技术产品的起点。

祝你编码愉快!如果这个项目对你有帮助,欢迎去 GitHub 给我点个 Star 😊

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝