SpringBoot3之Web程式設計

蓝易云發表於2024-11-21

Spring Boot 3 Web程式設計全面指南 🚀

Spring Boot 3 提供了強大的 Web程式設計 功能,幫助開發者快速構建高效、安全且易於維護的Web應用程式。本文將詳細介紹Spring Boot 3 Web程式設計的關鍵點,幫助您深入理解並應用這些技術。

1. 建立Spring Boot專案 🛠️

使用Spring Initializr

Spring Initializr 是建立Spring Boot專案的首選工具。訪問 start.spring.io,選擇專案的 構建工具(如 Maven 或 Gradle)、語言(Java、Kotlin 或 Groovy)、Spring Boot版本,並新增 Web依賴(如 Spring Web)。

示例

# 使用命令列建立Spring Boot專案
curl https://start.spring.io/starter.zip \
  -d dependencies=web \
  -d name=demo \
  -d packageName=com.example.demo \
  -o demo.zip
unzip demo.zip

解釋:上述命令透過 curl 下載包含 Web依賴 的Spring Boot專案模板,並解壓到本地。

2. 控制器(Controller) 🎯

控制器負責處理HTTP請求並返回響應。使用 @Controller@RestController 註解定義控制器類。

示例

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.ui.Model;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(Model model) {
        model.addAttribute("message", "歡迎使用Spring Boot 3!");
        return "home";
    }
}

解釋HomeController 使用 @Controller 註解,home 方法處理根路徑 / 的GET請求,並將資料傳遞給檢視 home

3. 路由對映(Mapping) 🗺️

路由對映定義URL路徑與控制器方法的對應關係。常用註解包括 @RequestMapping@GetMapping@PostMapping 等。

示例

@GetMapping("/users/{id}")
public String getUser(@PathVariable("id") Long id, Model model) {
    // 業務邏輯
    return "userDetail";
}

解釋@GetMapping 對映 /users/{id} 路徑,@PathVariable 提取URL中的 id 引數。

4. 請求引數處理 📝

透過方法引數,使用 @RequestParam@PathVariable 等註解獲取請求引數。

示例

@GetMapping("/search")
public String search(@RequestParam("query") String query, Model model) {
    // 搜尋邏輯
    return "searchResults";
}

解釋@RequestParam 提取查詢引數 query,用於搜尋功能。

5. 檢視返回 🎨

檢視返回有兩種方式:返回檢視模型或返回JSON資料。

使用 ModelAndView

@GetMapping("/info")
public ModelAndView info() {
    ModelAndView mav = new ModelAndView("info");
    mav.addObject("data", "詳細資訊");
    return mav;
}

使用 @ResponseBody

@GetMapping("/api/data")
@ResponseBody
public Data getData() {
    return new Data("示例資料");
}

解釋ModelAndView 返回檢視及模型資料,@ResponseBody 直接返回JSON資料。

6. 模板引擎 🖥️

整合模板引擎(如 Thymeleaf、Freemarker)生成動態HTML檢視。

示例(Thymeleaf)

依賴配置(pom.xml)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

模板檔案(home.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>主頁</title>
</head>
<body>
    <h1 th:text="${message}">預設訊息</h1>
</body>
</html>

解釋:Thymeleaf 模板透過 th:text 顯示控制器傳遞的 message 資料。

7. 靜態資源 📂

將靜態資源(如CSS、JavaScript、圖片)放置在 src/main/resources/static 目錄,Spring Boot會自動對映。

示例

src/main/resources/static/
├── css/
│   └── style.css
├── js/
│   └── app.js
└── images/
    └── logo.png

解釋:上述目錄結構確保靜態資源在訪問時無需額外配置,直接透過URL訪問。

8. 異常處理 ⚠️

使用 @ControllerAdvice 定義全域性異常處理器,統一處理應用中的異常。

示例

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.ui.Model;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public String handleException(Exception ex, Model model) {
        model.addAttribute("error", ex.getMessage());
        return "error";
    }
}

解釋GlobalExceptionHandler 捕捉所有異常,並返回錯誤檢視 error,同時傳遞異常資訊。

9. 攔截器 🕵️

攔截器透過 HandlerInterceptor 介面攔截請求,進行預處理或後處理。

示例

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoggingInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("請求路徑: " + request.getRequestURI());
        return true;
    }
}

配置攔截器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

public class WebConfig implements WebMvcConfigurer {
    
    @Autowired
    private LoggingInterceptor loggingInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loggingInterceptor).addPathPatterns("/**");
    }
}

解釋LoggingInterceptor 在每次請求前列印請求路徑,透過 WebConfig 註冊攔截器。

10. 表單處理 📝

透過 @ModelAttribute@Valid 等註解處理表單資料的繫結和驗證。

示例

import javax.validation.Valid;
import org.springframework.validation.BindingResult;

@PostMapping("/submit")
public String submitForm(@Valid @ModelAttribute("formData") FormData formData, BindingResult result) {
    if (result.hasErrors()) {
        return "form";
    }
    // 處理表單資料
    return "success";
}

解釋@Valid 觸發表單資料的驗證,BindingResult 檢查是否有驗證錯誤。

11. RESTful API 🌐

建立RESTful風格的API,使用 @RestController 註解,返回JSON資料。

示例

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;

@RestController
public class ApiController {

    @GetMapping("/api/users")
    public List<User> getUsers() {
        // 返回使用者列表
        return userService.getAllUsers();
    }
}

解釋@RestController 自動將返回值序列化為JSON格式,適用於API開發。

12. 檔案上傳 📤

使用 @RequestParam 處理檔案上傳,並進行檔案儲存或處理。

示例

import org.springframework.web.multipart.MultipartFile;
import java.nio.file.*;

@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
    if (!file.isEmpty()) {
        try {
            Path path = Paths.get("uploads/" + file.getOriginalFilename());
            Files.write(path, file.getBytes());
            return "上傳成功";
        } catch (IOException e) {
            e.printStackTrace();
            return "上傳失敗";
        }
    }
    return "檔案為空";
}

解釋MultipartFile 接收上傳檔案,儲存到指定目錄 uploads/

13. 安全性 🔐

整合 Spring Security 實現身份驗證和授權,保護應用的安全性。

示例

依賴配置(pom.xml)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

安全配置

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
            .and()
            .formLogin();
    }
}

解釋SecurityConfig 配置公共路徑 /public/** 可匿名訪問,其他路徑需認證,啟用表單登入。

14. 國際化 🌍

透過 MessageSource 和資原始檔實現應用的國際化支援。

示例

配置 MessageSource

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ResourceBundleMessageSource;

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("messages");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

資原始檔

src/main/resources/messages.properties
src/main/resources/messages_zh.properties
src/main/resources/messages_en.properties

使用示例

<h1 th:text="#{welcome.message}">歡迎資訊</h1>

解釋:根據使用者語言環境,載入相應的資原始檔顯示 welcome.message

15. 測試 🧪

編寫單元測試和整合測試,保障應用的穩定性和正確性。

示例

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
public class HomeControllerTest {

    @Autowired
    private HomeController homeController;

    @Test
    public void home_ShouldReturnHomeView() {
        String view = homeController.home(new ExtendedModelMap());
        assertThat(view).isEqualTo("home");
    }
}

解釋HomeControllerTest 使用 @SpringBootTest 載入應用上下文,測試 home 方法返回正確檢視。

總結 📌

Spring Boot 3 的 Web程式設計 涉及多個關鍵方面,包括 控制器路由對映檢視返回異常處理攔截器 等。這些功能幫助開發者高效地構建功能豐富、安全且易於維護的Web應用。透過合理應用上述技術,您可以快速提升開發效率,打造優質的Web解決方案。


Spring Boot 3 Web程式設計關鍵點概覽

關鍵點描述
建立專案使用Spring Initializr或命令列工具建立專案
控制器使用 @Controller@RestController
路由對映使用 @RequestMapping 等註解定義路由
請求引數處理使用 @RequestParam@PathVariable 等註解
檢視返回返回檢視模型或JSON資料
模板引擎整合Thymeleaf、Freemarker等模板引擎
靜態資源放置在 static 目錄,自動對映
異常處理使用 @ControllerAdvice 定義全域性異常處理器
攔截器透過 HandlerInterceptor 攔截請求
表單處理使用 @ModelAttribute@Valid 處理表單資料
RESTful API使用 @RestController 建立RESTful API
檔案上傳使用 MultipartFile 處理檔案上傳
安全性整合Spring Security實現認證與授權
國際化使用 MessageSource 實現多語言支援
測試編寫單元測試與整合測試保障應用穩定性

透過掌握以上關鍵點,您將能夠全面理解並應用Spring Boot 3進行Web開發,構建功能強大且可靠的Web應用。

相關文章