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
繁體地址,請注明出處:http://hk.pswp.cn/web/81864.shtml
英文地址,請注明出處:http://en.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;打開電磁閥…