在这里插入图片描述

🍃 予枫个人主页

📚 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常

💻 Debug 这个世界,Return 更好的自己!

引言

对于Java入门者来说,最头疼的莫过于“学完基础却没项目可练”,要么项目太复杂无从下手,要么太简单达不到实战效果。今天就带大家做一个闭环实战项目——Java版极简智能问答助手,整合Spring Boot+极简前端,实现会话历史、多轮对话核心功能,代码完整可运行,还会分享进阶学习路径,帮新手快速打通“理论→实战→部署”的链路~ 👍 建议点赞收藏,跟着步骤走,入门也能写出可落地的项目!

一、项目需求与架构设计

1.1 核心需求(新手友好版)

作为入门级项目,我们不追求复杂功能,聚焦“能用、易懂、可扩展”,核心需求如下:

  • 基础对话:用户输入问题,后端接收并返回回答(暂用模拟数据,后续可无缝对接AI接口);
  • 会话管理:记录用户会话历史,支持多轮对话(比如用户追问“刚才的问题再解释下”,能关联上下文);
  • 极简前端:无需复杂UI,一个输入框+对话展示区即可,降低开发门槛;
  • 异常处理:处理空输入、会话超时等常见问题,提升用户体验;
  • 可运行部署:提供打包教程,本地可直接运行,支持后续二次开发。

1.2 技术架构选型

考虑到入门友好性,技术栈均选用主流、易上手的框架,避免冷门技术增加学习成本:

  • 后端:Spring Boot(简化配置,快速搭建后端服务);
  • 前端:HTML+CSS+JavaScript(极简写法,无需框架,新手也能看懂);
  • 数据存储:HashMap(临时存储会话历史,入门阶段无需数据库,降低复杂度);
  • 交互方式:前后端通过HTTP接口通信,简单直观。

1.3 架构流程图 📊

核心流程:用户输入 → 前端提交请求 → 后端接收并处理(会话管理+模拟回答) → 后端返回结果 → 前端展示(含历史记录)

新会话

已有会话

用户

前端页面

Spring Boot后端

会话判断

创建会话ID,存储历史

获取会话历史,关联上下文

生成模拟回答

返回结果(回答+历史记录)

二、核心功能开发(附完整代码)

2.1 项目初始化(Step 1:搭建Spring Boot项目)

2.1.1 初始化步骤

  1. 打开IDEA,新建Spring Boot项目,选择“Spring Initializr”;
  2. 填写项目信息(Group、Artifact自行定义,比如group=com.yufeng,artifact=qa-assistant);
  3. 勾选依赖:Spring Web(用于开发HTTP接口);
  4. 完成项目创建,删除默认的DemoApplication以外的无用文件,整理目录结构。

2.1.2 目录结构(极简版)

qa-assistant/
├── src/
│   ├── main/
│   │   ├── java/com/yufeng/qa/
│   │   │   ├── controller/  // 接口层,接收前端请求
│   │   │   ├── service/     // 业务层,处理会话和回答逻辑
│   │   │   ├── model/       // 实体类,存储会话和消息
│   │   │   └── QaAssistantApplication.java  // 启动类
│   │   └── resources/
│   │       ├── static/      // 存放前端页面
│   │       └── application.properties  // 配置文件
│   └── test/  // 测试类,入门阶段可暂不编写
└── pom.xml  // 依赖配置

2.2 实体类开发(Step 2:定义核心数据模型)

新建实体类,用于存储会话信息和消息内容,代码简洁,注释详细,新手可直接复制:

2.2.1 会话实体(Session.java)

package com.yufeng.qa.model;

import lombok.Data;
import java.util.ArrayList;
import java.util.List;

/**
 * 会话实体类,存储单个用户的会话信息
 * 新手提示:@Data注解是Lombok的功能,可自动生成getter/setter,无需手动编写
 * 如需使用,需在pom.xml中添加Lombok依赖(下文会给出)
 */
@Data
public class Session {
    // 会话ID(唯一标识,用于区分不同用户的会话)
    private String sessionId;
    // 会话创建时间(毫秒级,用于后续会话超时判断)
    private Long createTime;
    // 会话历史消息列表(存储用户和助手的所有消息)
    private List<Message> messageList = new ArrayList<>();
}

2.2.2 消息实体(Message.java)

package com.yufeng.qa.model;

import lombok.Data;

/**
 * 消息实体类,存储单条对话消息
 */
@Data
public class Message {
    // 消息发送方(USER:用户,ASSISTANT:助手)
    private String sender;
    // 消息内容
    private String content;
    // 消息发送时间
    private Long sendTime;
}

2.2.3 补充Lombok依赖(pom.xml)

在pom.xml中添加Lombok依赖,简化实体类开发:

<!-- Lombok依赖,简化实体类getter/setter -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

2.3 业务层开发(Step 3:实现会话管理和回答逻辑)

业务层是核心,负责处理会话的创建、查询、更新,以及模拟回答生成,代码逻辑清晰,适合新手理解:

2.3.1 会话服务接口(SessionService.java)

package com.yufeng.qa.service;

import com.yufeng.qa.model.Message;
import com.yufeng.qa.model.Session;

import java.util.List;

/**
 * 会话服务接口,定义核心业务方法
 */
public interface SessionService {
    // 创建新会话,返回会话ID
    String createSession();

    // 根据会话ID获取会话信息
    Session getSessionById(String sessionId);

    // 新增会话消息(用户提问/助手回答)
    void addMessage(String sessionId, Message message);

    // 模拟生成回答(入门阶段用固定逻辑,后续可替换为AI接口)
    String generateAnswer(String question, List<Message> history);
}

2.3.2 会话服务实现类(SessionServiceImpl.java)

package com.yufeng.qa.service.impl;

import com.yufeng.qa.model.Message;
import com.yufeng.qa.model.Session;
import com.yufeng.qa.service.SessionService;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * 会话服务实现类,核心业务逻辑
 */
@Service
public class SessionServiceImpl implements SessionService {

    // 用HashMap存储会话信息,key=会话ID,value=会话对象(入门阶段无需数据库)
    private final Map<String, Session> sessionMap = new HashMap<>();

    /**
     * 创建新会话
     * UUID.randomUUID():生成唯一会话ID,无需手动维护
     */
    @Override
    public String createSession() {
        Session session = new Session();
        String sessionId = UUID.randomUUID().toString().replace("-", "");
        session.setSessionId(sessionId);
        session.setCreateTime(System.currentTimeMillis());
        sessionMap.put(sessionId, session);
        return sessionId;
    }

    /**
     * 根据会话ID获取会话,若会话不存在则创建新会话
     */
    @Override
    public Session getSessionById(String sessionId) {
        // 会话不存在或为空,创建新会话
        if (sessionId == null || sessionId.isEmpty() || !sessionMap.containsKey(sessionId)) {
            return sessionMap.get(createSession());
        }
        return sessionMap.get(sessionId);
    }

    /**
     * 新增会话消息,添加到会话历史中
     */
    @Override
    public void addMessage(String sessionId, Message message) {
        Session session = getSessionById(sessionId);
        message.setSendTime(System.currentTimeMillis());
        session.getMessageList().add(message);
        sessionMap.put(sessionId, session);
    }

    /**
     * 模拟生成回答(新手可修改这里的逻辑,实现自定义回答)
     * 这里简单处理:如果提问包含“你好”“哈喽”,则回复问候;否则回复默认内容
     */
    @Override
    public String generateAnswer(String question, List<Message> history) {
        // 模拟关联上下文:如果历史中有“什么是Java”,后续追问“它的特点”,则针对性回复
        boolean hasJavaQuestion = history.stream()
                .anyMatch(msg -> msg.getContent().contains("什么是Java"));

        if (question.contains("你好") || question.contains("哈喽") || question.contains("hi")) {
            return "你好呀~ 我是Java极简智能问答助手,有什么问题可以问我哦!😊";
        } else if (hasJavaQuestion && (question.contains("特点") || question.contains("特性"))) {
            return "Java的核心特点有:跨平台、面向对象、安全性高、可移植性强,非常适合入门学习~";
        } else if (question.contains("Java") || question.contains("java")) {
            return "Java是一门面向对象的编程语言,广泛用于后端开发、移动开发等领域,是入门编程的好选择!";
        } else {
            return "抱歉,我还在学习中~ 目前只能回答关于Java的基础问题哦,你可以试试问“什么是Java”~";
        }
    }
}

2.4 接口层开发(Step 4:编写前后端交互接口)

接口层负责接收前端请求,调用业务层方法,返回结果,这里提供2个核心接口:创建会话、发送消息,代码简洁,带异常处理:

2.4.1 问答接口(QaController.java)

package com.yufeng.qa.controller;

import com.yufeng.qa.model.Message;
import com.yufeng.qa.model.Session;
import com.yufeng.qa.service.SessionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * 问答接口控制器,接收前端请求
 */
@RestController
public class QaController {

    @Autowired
    private SessionService sessionService;

    /**
     * 接口1:创建新会话
     * 前端初始化时调用,获取会话ID
     */
    @PostMapping("/createSession")
    public Map<String, String> createSession() {
        Map<String, String> result = new HashMap<>();
        try {
            String sessionId = sessionService.createSession();
            result.put("code", "200"); // 成功状态码
            result.put("sessionId", sessionId);
            result.put("msg", "会话创建成功");
        } catch (Exception e) {
            result.put("code", "500"); // 异常状态码
            result.put("msg", "会话创建失败:" + e.getMessage());
        }
        return result;
    }

    /**
     * 接口2:发送消息,获取回答
     * 用户输入问题时调用,携带会话ID和问题内容
     */
    @PostMapping("/sendMessage")
    public Map<String, Object> sendMessage(
            @RequestParam(required = false) String sessionId,
            @RequestParam String question
    ) {
        Map<String, Object> result = new HashMap<>();
        try {
            // 1. 校验输入(异常处理:空问题直接返回提示)
            if (question == null || question.trim().isEmpty()) {
                result.put("code", "400");
                result.put("msg", "请输入您的问题哦~");
                return result;
            }

            // 2. 获取会话,新增用户消息
            Session session = sessionService.getSessionById(sessionId);
            Message userMessage = new Message();
            userMessage.setSender("USER");
            userMessage.setContent(question.trim());
            sessionService.addMessage(session.getSessionId(), userMessage);

            // 3. 生成助手回答,新增助手消息
            String answer = sessionService.generateAnswer(question.trim(), session.getMessageList());
            Message assistantMessage = new Message();
            assistantMessage.setSender("ASSISTANT");
            assistantMessage.setContent(answer);
            sessionService.addMessage(session.getSessionId(), assistantMessage);

            // 4. 返回结果(会话ID、回答、历史消息)
            result.put("code", "200");
            result.put("sessionId", session.getSessionId());
            result.put("answer", answer);
            result.put("history", session.getMessageList());
            result.put("msg", "消息发送成功");
        } catch (Exception e) {
            result.put("code", "500");
            result.put("msg", "消息处理失败:" + e.getMessage());
        }
        return result;
    }
}

2.5 前端页面开发(Step 5:极简页面,快速实现交互)

前端无需复杂框架,用纯HTML+CSS+JavaScript实现,放在resources/static目录下,命名为index.html,打开即可使用:

<!DOCTYPE html>
Java极简智能问答助手Java极简智能问答助手(入门实战版)

2.6 配置文件优化(application.properties)

简化配置,设置端口号(避免默认端口冲突),添加日志配置,方便调试:

# 服务器端口号,可自行修改(比如8081、8082)
server.port=8080

# 日志配置,打印接口请求日志,方便调试
logging.level.org.springframework.web=INFO
logging.level.com.yufeng.qa=DEBUG

三、项目打包与运行教程(新手必看)

3.1 本地运行(IDEA中直接运行)

  1. 打开QaAssistantApplication.java(启动类),点击右上角的“运行”按钮(绿色三角);
  2. 启动成功后,控制台会显示“Started QaAssistantApplication in xxx seconds”;
  3. 打开浏览器,输入地址:http://localhost:8080(端口号与配置文件一致),即可看到问答助手页面,开始测试。

3.2 打包成JAR包(可在任何电脑运行)

3.2.1 打包步骤

  1. 在IDEA右侧,找到“Maven”面板,展开“Lifecycle”;
  2. 双击“clean”,清理项目编译文件;
  3. 双击“package”,开始打包,打包成功后,控制台会显示“BUILD SUCCESS”;
  4. 找到打包后的JAR包,路径:项目根目录/target/qa-assistant-0.0.1-SNAPSHOT.jar(名称根据你的项目配置而定)。

3.2.2 运行JAR包

  1. 将JAR包复制到任意文件夹(比如桌面);
  2. 打开cmd(Windows)或终端(Mac/Linux),进入JAR包所在目录;
  3. 输入命令:java -jar qa-assistant-0.0.1-SNAPSHOT.jar(替换为你的JAR包名称);
  4. 运行成功后,打开浏览器输入http://localhost:8080,即可使用。

💡 新手提示:如果运行失败,大概率是JDK版本问题,建议使用JDK8或JDK11(Spring Boot的兼容版本),无需安装其他软件。

四、入门阶段总结与进阶路径规划

4.1 项目总结(核心收获)

这个项目是Java入门的“闭环实战”,看似简单,但覆盖了后端开发的核心流程:

  • 掌握Spring Boot项目的搭建、配置和运行;
  • 理解前后端交互的基本原理(HTTP接口调用);
  • 学会会话管理、异常处理等基础业务逻辑的实现;
  • 掌握项目打包部署的基本方法,实现“写得出、跑起来”;
  • 学会用极简前端快速实现交互,不用纠结复杂UI。

👍 小提示:这个项目虽然是入门级,但可扩展性极强,后续只需修改少量代码,就能对接ChatGPT、百度文心一言等AI接口,实现真正的智能问答,建议大家动手实践,不要只看不动手!

4.2 进阶学习路径(新手友好)

如果想进一步提升,从入门走向进阶,可按照以下路径学习,循序渐进:

  1. 基础强化:熟练掌握Java基础(集合、多线程、IO)、Spring Boot核心注解和配置;
  2. 数据存储:学习MySQL数据库,将项目中的HashMap替换为数据库,实现会话持久化;
  3. 接口优化:学习RESTful接口规范,添加接口文档(Swagger),优化异常处理;
  4. AI对接:学习调用ChatGPT/文心一言API,替换项目中的模拟回答,实现真正的智能对话;
  5. 前端升级:学习Vue.js,开发更美观的前端页面,添加更多功能(如会话切换、消息删除);
  6. 部署优化:学习Docker容器化,将项目部署到云服务器(如阿里云、腾讯云),实现公网访问。

结尾

本文通过一个极简智能问答助手项目,带大家完成了Java入门的闭环实战,从架构设计、代码开发到打包部署,每一步都有详细说明和完整代码,新手也能轻松上手。这个项目的核心价值在于“落地性”,让大家摆脱“只会看不会写”的困境,真正感受到Java开发的乐趣。


✨ 最后,如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我(CSDN博主:予枫),后续会分享更多Java入门实战项目和进阶技巧,一起从新手成长为资深开发者!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐