一、SpringBoot Web 入門開發
SpringBoot 簡化了傳統 Spring 應用的配置流程,通過 "約定大于配置" 的理念實現快速開發。以下是入門核心要點:
1. 工程創建與依賴配置
- 工程初始化:通過 Spring Initializr 創建工程,選擇Spring Web依賴(內置 Tomcat 服務器和 Spring MVC 核心組件)。
- 核心依賴:在pom.xml中引入 SpringBoot 父工程和 Web 起步依賴,自動管理版本兼容:
<parent> ????<groupId>org.springframework.boot</groupId> ????<artifactId>spring-boot-starter-parent</artifactId> ????<version>3.5.0</version> </parent> <dependencies> ????<dependency> ????????<groupId>org.springframework.boot</groupId> ????????<artifactId>spring-boot-starter-web</artifactId> ????</dependency> </dependencies> |
- 依賴作用:spring-boot-starter-web包含 Spring MVC、嵌入式 Tomcat、JSON 解析等 Web 開發必需組件,無需手動配置。
2. 核心注解與啟動機制
- @RestController:組合@Controller和@ResponseBody,標識類為請求處理控制器,方法返回值直接作為響應體(對象會自動轉為 JSON)。
- @RequestMapping:映射請求路徑,指定方法處理的 URL(如@RequestMapping("/hello")處理/hello請求)。
- @SpringBootApplication:啟動類核心注解,包含組件掃描(@ComponentScan)、自動配置等功能,需放在項目根包下以確保注解掃描生效。
- 啟動流程:通過SpringApplication.run(啟動類.class, args)啟動內置 Tomcat,自動部署應用并監聽默認端口(8080)。
3. 基礎請求處理示例
// 控制器類 @RestController public class HelloController { ????// 處理GET請求:/hello?name=xxx ????@RequestMapping("/hello") ????public String hello(String name) { ????????return "Hello " + name + " ~"; ????} } // 啟動類 @SpringBootApplication public class Application { ????public static void main(String[] args) { ????????SpringApplication.run(Application.class, args); ????} } |
啟動后訪問http://localhost:8080/hello?name=Java,將返回Hello Java ~。
二、HTTP 協議核心解析
HTTP(超文本傳輸協議)是 Web 通信的基礎,規范了瀏覽器與服務器的數據交互格式。
1. 請求數據格式
HTTP 請求由請求行、請求頭、請求體三部分組成:
- 請求行:包含請求方法、資源路徑、協議版本(如GET /hello?name=Java HTTP/1.1)。
- 請求頭:鍵值對格式,描述請求附加信息(如Host: localhost:8080、User-Agent: 瀏覽器標識)。
- 請求體:僅 POST 請求包含,存放請求參數(如 JSON 字符串)。
常見請求方法區別:
方法 | 特點 | 適用場景 |
GET | 參數在 URL 中,無請求體,大小有限制(1-18KB) | 數據查詢 |
POST | 參數在請求體中,無大小限制 | 數據提交(如表單、新增數據) |
2. 響應數據格式
HTTP 響應由響應行、響應頭、響應體三部分組成:
- 響應行:包含協議版本、狀態碼、描述(如HTTP/1.1 200 OK)。
- 響應頭:鍵值對格式,描述響應附加信息(如Content-Type: application/json)。
- 響應體:服務器返回的實際數據(如 HTML、JSON)。
狀態碼分類:
- 1xx:臨時響應(如 100 Continue)。
- 2xx:成功(如 200 OK)。
- 3xx:重定向(如 302 Found)。
- 4xx:客戶端錯誤(如 404 Not Found、401 Unauthorized)。
- 5xx:服務器錯誤(如 500 Internal Server Error)。
3. 請求與響應數據處理
- 獲取請求數據:通過HttpServletRequest對象獲取請求行、頭、體數據:
@RequestMapping("/request") public String handleRequest(HttpServletRequest request) { ????String method = request.getMethod(); // 請求方法(GET/POST) ????String uri = request.getRequestURI(); // 資源路徑(/request) ????String userAgent = request.getHeader("User-Agent"); // 請求頭 ????String name = request.getParameter("name"); // 請求參數 ????return "Method: " + method + ", URI: " + uri; } |
- 設置響應數據:兩種常用方式:
- 基于HttpServletResponse:
@RequestMapping("/response1") public void setResponse(HttpServletResponse response) throws IOException { ????response.setStatus(401); // 狀態碼:未授權 ????response.setHeader("Custom-Header", "value"); // 響應頭 ????response.getWriter().write("<h1>Hello Response</h1>"); // 響應體 } |
- 基于ResponseEntity(更優雅的響應封裝):
@RequestMapping("/response2") public ResponseEntity<String> setResponse() { ????return ResponseEntity.status(401) ????????????.header("Custom-Header", "value") ????????????.body("<h1>Hello Response</h1>"); } |
三、SpringBoot Web 案例實踐
以 "用戶列表展示" 為例,掌握數據讀取、解析、響應的完整流程。
1. 工程結構與依賴
- 核心依賴:除 Web 依賴外,添加 Lombok(簡化實體類)和 Hutool(工具類庫):
<dependencies> ????<!-- Lombok --> ????<dependency> ????????<groupId>org.projectlombok</groupId> ????????<artifactId>lombok</artifactId> ????</dependency> ????<!-- Hutool工具類 --> ????<dependency> ????????<groupId>cn.hutool</groupId> ????????<artifactId>hutool-all</artifactId> ????????<version>5.8.28</version> ????</dependency> </dependencies> |
- 靜態資源存放:前端頁面(如 HTML、JS)需放在src/main/resources/static目錄下,SpringBoot 會自動映射訪問。
2. 實體類定義
使用 Lombok 注解簡化 get/set、構造方法等代碼:
import lombok.Data; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; import java.time.LocalDateTime; @Data // 生成get/set/toString等方法 @NoArgsConstructor // 無參構造 @AllArgsConstructor // 全參構造 public class User { ????private Integer id; ????private String username; ????private String password; ????private String name; ????private Integer age; ????private LocalDateTime updateTime; } |
3. 數據讀取與響應
從文件讀取用戶數據并解析為 JSON 響應:
@RestController public class UserController { ????@RequestMapping("/list") ????public List<User> getUserList() { ????????// 1. 讀取文件(user.txt放在resources目錄下) ????????InputStream in = UserController.class.getClassLoader().getResourceAsStream("user.txt"); ????????List<String> lines = IoUtil.readUtf8Lines(in, new ArrayList<>()); // Hutool工具類 ???????? ????????// 2. 解析數據為User對象 ????????List<User> userList = new ArrayList<>(); ????????for (String line : lines) { ????????????String[] parts = line.split(","); ????????????User user = new User(); ????????????user.setId(Integer.valueOf(parts[0])); ????????????user.setUsername(parts[1]); ????????????user.setPassword(parts[2]); ????????????user.setName(parts[3]); ????????????user.setAge(Integer.valueOf(parts[4])); ????????????// 字符串轉LocalDateTime ????????????user.setUpdateTime(LocalDateTime.parse(parts[5], ????????????????DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); ????????????userList.add(user); ????????} ????????return userList; // 自動轉為JSON數組響應 ????} } |
訪問http://localhost:8080/list將返回用戶列表 JSON 數據,前端頁面可通過 AJAX 請求渲染。
四、分層架構與解耦設計
為提高代碼復用性和可維護性,采用三層架構設計,遵循 "高內聚、低耦合" 原則。
1. 三層架構職責劃分
- Controller(控制層):接收前端請求,調用 Service 層處理業務,響應數據(專注請求 / 響應)。
- Service(業務邏輯層):實現核心業務邏輯,協調 Dao 層數據操作(專注邏輯處理)。
- Dao(數據訪問層):負責數據讀寫操作(如文件、數據庫),提供數據接口(專注數據訪問)。
2. 分層實現示例
(1)Dao 層:數據訪問接口與實現
// 接口 public interface UserDao { ????List<String> readUserLines(); // 讀取原始數據行 } // 實現類 public class UserDaoImpl implements UserDao { ????@Override ????public List<String> readUserLines() { ????????InputStream in = UserDaoImpl.class.getClassLoader().getResourceAsStream("user.txt"); ????????return IoUtil.readUtf8Lines(in, new ArrayList<>()); ????} } |
(2)Service 層:業務邏輯處理
// 接口 public interface UserService { ????List<User> getUserList(); // 獲取用戶列表 } // 實現類 public class UserServiceImpl implements UserService { ????private UserDao userDao = new UserDaoImpl(); // 依賴Dao層 ???? ????@Override ????public List<User> getUserList() { ????????List<String> lines = userDao.readUserLines(); // 調用Dao獲取數據 ????????// 解析邏輯(同之前的解析過程) ????????List<User> userList = new ArrayList<>(); ????????// ... 解析代碼 ... ????????return userList; ????} } |
(3)Controller 層:請求處理
@RestController public class UserController { ????private UserService userService = new UserServiceImpl(); // 依賴Service層 ???? ????@RequestMapping("/list") ????public List<User> list() { ????????return userService.getUserList(); // 調用Service獲取數據 ????} } |
3. 分層優勢
- 單一職責:每層專注自身職責,降低代碼復雜度。
- 復用性高:Service 和 Dao 層邏輯可被多個 Controller 復用。
- 便于維護:需求變更時只需修改對應層代碼(如數據來源從文件改為數據庫,僅需修改 Dao 層)。
五、IOC 與 DI:控制反轉與依賴注入
Spring 的核心思想是控制反轉(IOC)?和依賴注入(DI),解決層間高耦合問題。
1. 核心概念
- IOC(控制反轉):對象的創建權從代碼轉移到 Spring 容器,由容器統一管理對象生命周期。
- DI(依賴注入):容器在運行時自動將依賴對象注入到需要的類中,無需手動new對象。
- Bean:被 IOC 容器管理的對象稱為 Bean。
2. IOC 注解:將對象交給容器管理
使用注解聲明 Bean,容器自動創建并管理:
注解 | 作用 | 適用場景 |
@Component | 基礎注解,聲明 Bean | 通用類 |
@Controller | @Component 衍生注解 | 控制層類 |
@Service | @Component 衍生注解 | 業務層類 |
@Repository | @Component 衍生注解 | 數據訪問層類 |
示例:
@Repository // Dao層Bean public class UserDaoImpl implements UserDao { ... } @Service // Service層Bean public class UserServiceImpl implements UserService { ... } @RestController // Controller層Bean(組合@Controller和@ResponseBody) public class UserController { ... } |
3. DI 注解:依賴注入實現
通過注解讓容器自動注入依賴對象,消除手動new的耦合:
- @Autowired:默認按類型注入,容器自動查找對應類型的 Bean。
@Service public class UserServiceImpl implements UserService { ????@Autowired // 注入UserDao類型的Bean ????private UserDao userDao; // 無需手動new } |
- 多 Bean 沖突解決:當同一類型有多個 Bean 時,需指定注入目標:
- @Primary:在 Bean 上標記優先注入。
@Primary // 優先注入該Bean @Service public class UserServiceImpl implements UserService { ... } |
- @Autowired + @Qualifier:按 Bean 名稱注入。
@Service("userServiceA") // 指定Bean名稱 public class UserServiceImpl implements UserService { ... } @RestController public class UserController { ????@Autowired ????@Qualifier("userServiceA") // 按名稱注入 ????private UserService userService; } |
- @Resource:JavaEE 規范注解,默認按名稱注入,支持指定名稱。
@RestController public class UserController { ????@Resource(name = "userServiceA") // 按名稱注入 ????private UserService userService; } |
4. 組件掃描
- @ComponentScan:指定容器掃描 Bean 的包路徑,默認掃描啟動類所在包及其子包。
- @SpringBootApplication:已包含@ComponentScan,無需額外配置。
六、總結與最佳實踐
- SpringBoot Web 開發:通過起步依賴和核心注解快速搭建應用,內置 Tomcat 簡化部署。
- HTTP 協議:掌握請求 / 響應格式、狀態碼和方法區別,正確處理數據交互。
- 分層架構:按 Controller→Service→Dao 劃分職責,提升代碼復用性和可維護性。
- IOC/DI:使用注解聲明 Bean 和注入依賴,消除硬編碼耦合,降低維護成本。
通過本文系統學習,可夯實 Java Web 開發基礎,掌握從入門到架構設計的核心技能。建議收藏本文,后續開發中遇到相關問題可隨時查閱,關注作者獲取更多技術干貨!