Java Web 开发详细流程

🧭 一、项目立项与需求分析阶段(0%)


1.1 商业需求确认

  • 与产品经理沟通核心业务目标
    • 目标:构建一个图书管理系统
    • 用户:图书管理员、普通用户
    • 功能:登录、查看、增删改图书、权限控制、分页、搜索

1.2 输出文档

  • PRD(产品需求文档)
  • ER图(数据建模)
  • UML 用例图
  • 接口草图(API Mock 文档)
  • 项目甘特图 / 工作排期(Jira/TAPD)

🧱 二、系统设计与环境准备阶段(10%)


2.1 技术栈选择(通用、可复用)

层级技术选型
前端模板引擎Thymeleaf、Bootstrap
控制层Spring Boot Web MVC
服务层Spring @Service + AOP
DAO 层Spring Data JPA + Hibernate
数据库MySQL(可选 PostgreSQL)
安全模块Spring Security + Session/Cookie
配置管理application.yml + profiles
单元测试JUnit5 + Mockito
集成测试MockMvc + TestContainers

2.2 开发工具准备

工具类型建议
IDEIntelliJ IDEA Ultimate
构建工具Maven
版本控制Git + GitHub/GitLab
数据库MySQL 8 + Navicat
开发数据库dev_bookdb
浏览器插件Postman / REST Client
日志工具Logback + JSON Format

2.3 项目初始化(Spring Boot)

使用 Spring Initializr 初始化:

  • Group:com.example
  • Artifact:bookmanager
  • Packaging:Jar
  • Java:17
  • Dependencies:
    • Spring Web
    • Spring Data JPA
    • Thymeleaf
    • MySQL Driver
    • Spring Boot DevTools
    • Lombok(可选)

📐 三、数据库设计与模型映射(20%)


3.1 数据库设计

用 Navicat 或 dbdiagram.io 画出 ER 图:

  • 用户表(users)
  • 图书表(books)
  • 管理员角色表(roles)
sql复制编辑CREATE TABLE users (id BIGINT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100),role ENUM('USER', 'ADMIN')
);CREATE TABLE books (id BIGINT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(100),author VARCHAR(100),price DOUBLE
);

3.2 实体类映射

使用 JPA 实体类标注:

java复制编辑@Entity
public class Book {@Id @GeneratedValueprivate Long id;private String title;private String author;private Double price;
}

⚙️ 四、项目分层架构设计(30%)


4.1 分层思想(经典 4 层架构)

javascript复制编辑Controller(Web控制层) ← 接收请求、返回视图或 JSON
↓
Service(业务逻辑层) ← 处理事务逻辑
↓
Repository(数据访问层) ← 连接数据库
↓
Entity(数据模型层) ← POJO、映射表

4.2 包结构设计

bash复制编辑com.example.bookmanager
├── controller       # 控制器
├── service          # 业务逻辑
├── repository       # 数据库访问
├── entity           # 数据模型
├── config           # 配置类
├── security         # 登录权限
└── BookManagerApplication.java

🛠️ 五、模块开发详细步骤(40%~70%)


5.1 编写实体类 BookUser

配合数据库映射使用 @Entity@Column@Id 注解

5.2 编写 Repository 接口

java复制编辑public interface BookRepository extends JpaRepository<Book, Long> {List<Book> findByTitleContaining(String keyword);
}

5.3 编写业务 Service 层

java复制编辑@Service
public class BookService {@Autowiredprivate BookRepository repo;public List<Book> listAll() {return repo.findAll();}public void save(Book book) {repo.save(book);}
}

5.4 编写控制器 Controller 层

java复制编辑@Controller
public class BookController {@Autowiredprivate BookService service;@GetMapping("/")public String viewHomePage(Model model) {model.addAttribute("listBooks", service.listAll());return "index";}@PostMapping("/save")public String saveBook(@ModelAttribute("book") Book book) {service.save(book);return "redirect:/";}
}

5.5 页面开发(Thymeleaf 模板)

resources/templates/ 下:

  • index.html:主页
  • new_book.html:添加页面
  • edit_book.html:编辑页面

🔐 六、登录权限管理模块(80%)


6.1 集成 Spring Security

xml复制编辑<!-- pom.xml -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

6.2 配置用户名密码

yaml复制编辑spring:security:user:name: adminpassword: admin123

或自定义认证逻辑 + 数据库存储用户密码 + BCrypt 加密。


🔍 七、测试、异常处理、优化阶段(90%)


7.1 单元测试

java复制编辑@SpringBootTest
class BookServiceTest {@Autowired BookService service;@Testvoid testListAll() {List<Book> books = service.listAll();assertFalse(books.isEmpty());}
}

7.2 异常处理(全局异常)

java复制编辑@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public String handleException(Exception e, Model model) {model.addAttribute("error", e.getMessage());return "error";}
}

📦 八、构建、部署、上线(100%)


8.1 项目打包

bash复制编辑
mvn clean package

生成 bookmanager-0.0.1-SNAPSHOT.jar

8.2 运行方式

bash复制编辑
java -jar target/bookmanager-0.0.1-SNAPSHOT.jar

8.3 Docker 化部署

dockerfile复制编辑FROM openjdk:17
ADD target/bookmanager.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
bash复制编辑docker build -t bookmanager .
docker run -p 8080:8080 bookmanager

8.4 发布流程(传统方式)

  1. 上传 Jar 到服务器
  2. 使用 systemd 管理后台进程
  3. nginx 做反向代理,绑定域名

📊 九、整体项目节奏与时间分布(实际开发)

阶段时间占比说明
需求分析与设计10%通常 1~2 天
环境准备与初始化5%项目生成 + 配置 + DB连接
模块开发40%重点开发,持续集成
页面开发 + 安全15%UI 渲染、登录校验
测试与优化20%单元、接口、异常、性能
构建 + 部署上线10%Docker 或 Jar 发布

🧩 十、高级功能

🔍 1. 搜索与分页功能(Spring Data JPA + Thymeleaf)


✅ 功能目标:
  • 支持用户按关键字搜索图书
  • 每页显示固定数量(如 10 条)
📦 依赖:

Spring Boot 已内置分页支持,无需额外依赖

🧠 Service 层实现:
java复制编辑public Page<Book> listAll(int pageNum, String keyword) {Pageable pageable = PageRequest.of(pageNum - 1, 10); // 第0页起if (keyword != null && !keyword.isEmpty()) {return repo.findByTitleContaining(keyword, pageable);}return repo.findAll(pageable);
}
📚 Repository 接口:
java复制编辑
Page<Book> findByTitleContaining(String keyword, Pageable pageable);
🌐 Controller 控制器:
java复制编辑@GetMapping("/")
public String viewHomePage(@RequestParam(defaultValue = "1") int page,@RequestParam(required = false) String keyword,Model model) {Page<Book> bookPage = service.listAll(page, keyword);model.addAttribute("bookPage", bookPage);model.addAttribute("currentPage", page);model.addAttribute("keyword", keyword);return "index";
}
🖼️ 页面模板 index.html(简化):
html复制编辑<form method="get" action="/"><input type="text" name="keyword" placeholder="搜索书名" value="${keyword}"><button type="submit">搜索</button>
</form><div th:each="book : ${bookPage.content}"><p th:text="${book.title}"></p>
</div><div><span th:text="'第 ' + ${currentPage} + ' 页'"></span><a th:href="@{'/?page=' + (${currentPage} - 1) + '&keyword=' + ${keyword}}">上一页</a><a th:href="@{'/?page=' + (${currentPage} + 1) + '&keyword=' + ${keyword}}">下一页</a>
</div>

🧵 2. 文件上传(Multipart + 本地存储)


✅ 功能目标:
  • 图书添加时上传封面图
📦 Maven 依赖(已内置)

Spring Boot 自动启用 Multipart

🧠 配置文件:
yaml复制编辑spring:servlet:multipart:enabled: truemax-file-size: 2MBmax-request-size: 5MBupload:dir: uploads/
📂 Controller 示例:
java复制编辑@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) throws IOException {String uploadDir = "uploads/";String filename = UUID.randomUUID() + "_" + file.getOriginalFilename();Path path = Paths.get(uploadDir + filename);Files.createDirectories(path.getParent());Files.write(path, file.getBytes());return "redirect:/?uploadSuccess=true";
}
📋 HTML 上传表单:
html复制编辑<form method="post" action="/upload" enctype="multipart/form-data"><input type="file" name="file" /><button type="submit">上传</button>
</form>

🛡️ 3. JWT 用户认证(前后端分离准备)


✅ 功能目标:
  • 用户登录后返回 JWT
  • 前端携带 token 访问接口
📦 添加依赖:
xml复制编辑<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version>
</dependency>
🧠 JWT 工具类:
java复制编辑public class JwtUtil {private static final String SECRET_KEY = "secret123";public static String generateToken(String username) {return Jwts.builder().setSubject(username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + 86400000)) // 1天.signWith(SignatureAlgorithm.HS512, SECRET_KEY).compact();}public static String extractUsername(String token) {return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();}
}
🚪 登录接口返回 JWT:
java复制编辑@RestController
public class AuthController {@PostMapping("/api/login")public ResponseEntity<?> login(@RequestBody LoginRequest login) {if (login.getUsername().equals("admin") && login.getPassword().equals("1234")) {String token = JwtUtil.generateToken(login.getUsername());return ResponseEntity.ok(Map.of("token", token));}return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");}
}
🔐 使用 JWT 做权限过滤器:

自定义 OncePerRequestFilter 解码并设置 SecurityContextHolder,可在需要认证的接口中通过 @AuthenticationPrincipal 拿用户。


🚦 4. 接口限流(Rate Limiting)


✅ 功能目标:
  • 每 IP 每分钟最多请求 N 次(比如 20 次)
📦 方法一:使用 Bucket4j(令牌桶)
xml复制编辑<dependency><groupId>com.github.vladimir-bukhtoyarov</groupId><artifactId>bucket4j-core</artifactId><version>8.4.0</version>
</dependency>
💡 拦截器实现(伪代码):
java复制编辑@Component
public class RateLimitInterceptor extends HandlerInterceptorAdapter {private final Map<String, Bucket> ipBucketMap = new ConcurrentHashMap<>();private Bucket resolveBucket(String ip) {return ipBucketMap.computeIfAbsent(ip, key ->Bucket4j.builder().addLimit(Bandwidth.classic(20, Refill.greedy(20, Duration.ofMinutes(1)))).build());}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {String ip = request.getRemoteAddr();Bucket bucket = resolveBucket(ip);if (bucket.tryConsume(1)) {return true;}response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());response.getWriter().write("Rate limit exceeded");return false;}
}

然后注册到 WebMvcConfigurer 的 addInterceptors()


🏁 整体功能架构整合图

plaintext复制编辑[Spring Boot + Spring Security + JPA]↓            ↓            ↓JWT认证     分页搜索      文件上传↓            ↓            ↓REST风格接口  HTML页面    本地磁盘↓接口限流(Bucket4j)

✅ 总结:完整流程图(开发视角)

plaintext复制编辑[需求 → 技术选型 → 架构 → 实体建模 → DB设计]↓[项目初始化 → 多层结构 → Controller/Service/Repo]↓[页面开发 + Thymeleaf + Bootstrap]↓[登录权限 + 测试 + 异常处理]↓[Maven打包 + Docker部署 + 上线发布]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习路之PHP--easyswoole_panel安装使用

学习路之PHP--easyswoole_panel安装使用 一、新建文件夹二、安装三、改配置地址四、访问 IP:Port 自动进入index.html页面 一、新建文件夹 /www/wwwroot/easyswoole_panel 及配置ftp 解压easyswoole_panel源码 https://github.com/easyswoole-panel/easyswoole_panel 二、安…

软件设计综合知识

software-design 软考中级-软件设计师-综合知识&#xff1a;计算机系统基础、操作系统、计算机网络与信息安全、程序语言基础、数据库基础、数据结构与算法、软件工程基础知识、标准与知识产权等。 —— 2025 年 3 月 5 日 甲辰年二月初六 惊蛰 目录 software-design1、计算机基…

海思 35XX MIPI读取YUV422

1.项目背景&#xff1a; 使用海思芯片&#xff0c;接收FPGA发送的MIPI数据&#xff0c;不需要ISP处理&#xff0c;YUV图像格式为YUV422。 2.移植MIPI驱动 修改IMX347的驱动远吗&#xff0c;将I2C读写的部分注释&#xff0c;其他的不用再做修改。 int imx347_slave_i2c_init(ot…

算力租赁革命:弹性模式如何重构数字时代的创新门槛​

一、算力革命&#xff1a;第四次工业革命的核心驱动力​ 在科技飞速发展的当下&#xff0c;我们正悄然迎来第四次工业革命。华为创始人任正非在一场程序设计竞赛中曾深刻指出&#xff0c;这场革命的基础便是大算力。随着 5G、人工智能、大数据、物联网等信息技术的迅猛发展&am…

改写自己的浏览器插件工具 myChromeTools

1. 起因&#xff0c; 目的: 前面我写过&#xff0c; 自己的一个浏览器插件小工具 最近又增加一个小功能&#xff0c;可以自动滚动页面&#xff0c;尤其是对于那些瀑布流加载的网页。最新的代码都在这里 2. 先看效果 3. 过程: 代码 1, 模拟鼠标自然滚动 // 处理滚动控制逻辑…

深度学习篇---OC-SORT简介

OC-SORT&#xff08;Observation-Centric SORT&#xff09;是一种以观测为中心的多目标跟踪算法&#xff0c;旨在解决传统 SORT 算法在目标遮挡、外观变化和复杂交互场景下关联准确性不足的问题。以下是其详细介绍&#xff1a; 核心创新点 以观测为中心的在线平滑&#xff08…

硬件工程师笔记——二极管Multisim电路仿真实验汇总

目录 1 二极管基础知识 1.1 工作原理 1.2 二极管的结构 1.3 PN结的形成 1.4 二极管的工作原理详解 正向偏置 反向偏置 multisim使用说明链接 2 二极管特性实验 2.1 二极管加正向电压 2.2 二极管加反向电压 2.3 二极管两端的电阻 2.4 交流电下二级管工作 2.5 二极…

vscode中让文件夹一直保持展开不折叠

vscode中让文件夹一直保持展开不折叠 问题 很多小伙伴使用vscode发现空文件夹会折叠显示, 让人看起来非常难受, 如下图 解决办法 首先打开设置->setting, 搜索compact Folders, 去掉勾选即可, 如下图所示 效果如下 看起来非常爽 ! ! !

设计模式学习笔记

设计模式 一&#xff1a;分类&#xff1a; 创建型模式 用于描述“怎样创建对象”&#xff0c;它的主要特点是“将对象的创建与使用分离”。GoF&#xff08;四人组&#xff09;书中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。 结构型模式 用于描述如何将…

Kaggle-Predict Calorie Expenditure-(回归+xgb+cat+lgb+模型融合+预测结果)

Predict Calorie Expenditure 题意&#xff1a; 给出每个人的基本信息&#xff0c;预测运动后的卡路里消耗值。 数据处理&#xff1a; 1.构造出人体机能、运动相关的特征值。 2.所有特征值进行从新组合&#xff0c;注意唯独爆炸 3.对连续信息分箱变成离散 建立模型&#x…

第十二篇:MySQL 分布式架构演进与云原生数据库探索

本篇聚焦 MySQL 在互联网架构演进过程中的角色变化&#xff0c;探讨其从单体向分布式、再向云原生架构转型的关键技术路径与实践建议。 一、传统单体架构下的 MySQL 应用模式 在早期项目中&#xff0c;MySQL 多用于中小型应用&#xff1a; 单节点部署&#xff1b; 水平扩展难…

JVM——回顾:JVM的起源、特性与系统构成

引入 在当今数字化时代&#xff0c;Java语言及其运行环境Java虚拟机&#xff08;JVM&#xff09;在软件开发领域占据着举足轻重的地位。从大型企业级应用到各类移动应用&#xff0c;JVM凭借其独特的特性和强大的功能&#xff0c;为开发者提供了高效且稳定的运行环境。 JVM的起…

大疆上云API+流媒体服务器部署实现直播功能

根据官网文档上云API&#xff0c;先将官方提供的Demo部署起来&#xff0c;后端和前端服务环境搭建请参考官方文档。因为官方文档没有对直播这块的环境搭建进行说明&#xff0c;所以下面主要对直播功能环境搭建做一个记录&#xff0c;仅供参考&#xff0c;如有不足之处&#xff…

计算机网络 HTTP篇常见面试题总结

HTTP各版本区别 HTTP 1.0 无状态、无连接&#xff1a;每次请求都需要建立新的 TCP&#xff0c;处理完后立即关闭&#xff0c;导致开销较大。队头阻塞&#xff1a;每个请求必须按照顺序依次处理&#xff0c;前面的请求未完成&#xff0c;后面的请求只能等待&#xff0c;减低了…

目标检测:YOLO 模型详解

目录 一、YOLO&#xff08;You Only Look Once&#xff09;模型讲解 YOLOv1 YOLOv2 (YOLO9000) YOLOv3 YOLOv4 YOLOv5 YOLOv6 YOLOv7 YOLOv8 YOLOv9 YOLOv10 YOLOv11 YOLOv12 其他变体&#xff1a;PP-YOLO 二、YOLO 模型的 Backbone&#xff1a;Focus 结构 三、…

开源 FcDesigner 表单设计器组件事件详解

FcDesigner 是一款基于Vue的开源低代码可视化表单设计器工具&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 …

关于 smali:2. 从 Java 到 Smali 的映射

一、对照 Java 代码与 Smali 代码差异 1.1 方法调用差异&#xff1a;Java vs Smali Java 方法分类&#xff1a; 方法类型Java 示例Smali 指令特点说明静态方法Utils.print("hi")invoke-static没有 this 指针实例方法obj.show()invoke-virtual有 this&#xff0c;虚…

2025年05月29日Github流行趋势

项目名称&#xff1a;agenticSeek 项目地址url&#xff1a;https://github.com/Fosowl/agenticSeek项目语言&#xff1a;Python历史star数&#xff1a;11898今日star数&#xff1a;2379项目维护者&#xff1a;Fosowl, steveh8758, klimentij, ganeshnikhil, apps/copilot-pull-…

Dubbo高频面试题

引言 作为分布式服务框架的标杆&#xff0c;Dubbo凭借其高性能RPC通信、灵活的服务治理能力和丰富的容错机制&#xff0c;成为Java技术栈中微服务领域的核心考点。本文系统梳理Dubbo高频面试核心知识点&#xff0c;涵盖容错策略、负载均衡、注册中心原理、服务上下线感知等关键…

氮气吹扫电磁阀

一、氮气吹扫电磁阀的概述 氮气吹扫电磁阀是一种重要的工业自动控制设备&#xff0c;用于对工业设备中出现的杂质和沉淀物进行清理&#xff0c;以保证生产线的畅通和生产效率的稳定。其作用是在需要吹扫清洗的工业设备中&#xff0c;通过控制气源的气压&#xff0c;打开电磁阀…