Vue 如何传递 List 到 Java 后端

在现代 Web 开发中,前后端分离已经成为一种主流的开发架构。在这种架构中,前端负责用户界面和交互,而后端负责业务逻辑和数据处理。今天我们将探讨如何使用 Vue.js 将一个列表(List)传递到 Java 后端,并解决实际开发中的问题。

实际问题

假设我们正在开发一个任务管理应用,前端使用 Vue.js 编写,用户可以创建一系列任务。在用户创建任务后,我们希望将这些任务信息传递给后端 Java 应用以进行存储和后续操作。

初步设计

在我们的方案中,前端将构造一个任务列表,每个任务都有标题和描述。用户输入任务后,点击“提交”按钮,列表将通过 HTTP POST 请求发送给后端。后端将接收这个任务列表(List)并将其存储到数据库中。

系统状态图

为了清晰展示系统的状态转换,我们使用状态图来描述前端与后端之间的交互过程。下面是任务管理应用的状态图:

stateDiagram
    [*] --> Idle
    Idle --> AddingTasks
    AddingTasks --> TasksAdded
    TasksAdded --> Idle
    TasksAdded --> Error
    Error --> Idle

在这个状态图中:

  • 应用开始于 Idle 状态。
  • 用户添加任务后,状态转为 AddingTasks
  • 一旦任务成功添加,状态变为 TasksAdded;如果发生错误,则转至 Error 状态。

前端实现(Vue.js)

让我们看看如何在 Vue.js 中实现这个功能。

1. 项目结构

我们创建一个 Vue 组件,名为 TaskManager.vue

<template>
    <div>
        任务管理
        <input v-model="newTask.title" placeholder="任务标题" />
        <input v-model="newTask.description" placeholder="任务描述" />
        <button @click="addTask">添加任务</button>
        <ul>
            <li v-for="(task, index) in taskList" :key="index">
                {{ task.title }}: {{ task.description }}
            </li>
        </ul>
    </div>
</template>

<script>
export default {
    data() {
        return {
            newTask: {
                title: '',
                description: ''
            },
            taskList: []
        };
    },
    methods: {
        addTask() {
            if (this.newTask.title && this.newTask.description) {
                this.taskList.push({ ...this.newTask });
                this.sendTasksToBackend();
                this.newTask.title = '';
                this.newTask.description = '';
            }
        },
        async sendTasksToBackend() {
            try {
                const response = await fetch('http://localhost:8080/tasks', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    body: JSON.stringify(this.taskList)
                });
                if (!response.ok) throw new Error('网络错误');
                const result = await response.json();
                console.log('任务上传成功:', result);
            } catch (error) {
                console.error('任务上传失败:', error);
            }
        }
    }
};
</script>

2. 解释

  • 使用 v-model 绑定输入框,获取用户输入的任务标题和描述。
  • 当用户点击“添加任务”按钮时,触发 addTask 方法,先进行简单的验证,确保任务信息完整。
  • 任务信息将被添加到 taskList 中,并通过 sendTasksToBackend 方法发送到 Java 后端。
  • 使用 Fetch API 发送 HTTP POST 请求,Content-Type 设置为 application/json,并将任务列表转为 JSON 字符串。

后端实现(Java Spring Boot)

我们在 Java 后端使用 Spring Boot 接收这个列表并存储到数据库中。

1. Maven 依赖

首先,确保你的 pom.xml 文件中包含 Spring Boot 和相关库的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

2. 创建模型和控制器

接下来,我们创建任务模型和控制器:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String description;

    // Getters and setters...
}
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/tasks")
public class TaskController {

    @PostMapping
    public List<Task> addTasks(@RequestBody List<Task> tasks) {
        // 保存到数据库的逻辑
        // taskRepository.saveAll(tasks);
        return tasks; // 返回给前端
    }
}

3. 说明

  • 我们创建了一个 Task 实体类,用于表示任务信息。
  • TaskController 接收列表,并通过 @RequestBody 注解将 JSON 数据映射成 List<Task> 类型。
  • 你可以根据需要实现数据库存储逻辑。

总结

在这篇文章中,我们介绍了如何使用 Vue.js 将任务列表通过 HTTP 请求发送到 Java 后端。我们详细讲解了前端和后端的具体实现,包括状态图的设计,确保了代码逻辑的清晰与结构的完整。这样的实现方式可以帮助开发者理解前后端分离的理念,并在实际项目中更好地应用这一技术。在今后的开发中,我们期望不断优化数据交互流程,提升用户体验。