首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

SpringMVC 開發總結:架構圖解、註解開發、參數綁定、校驗、異常處理、文件上傳、JSON、REST、攔截器全棧知識圖譜

     編輯:Java 綜合教學

前言:SpringMVC 核心知識體系一張圖講透,從入門到精通的完整棧單

SpringMVC 作為 Java Web 開發事實標準,其核心價值在於 請求分發、參數綁定、視圖解析、異常處理、攔截器鏈 五大核心流程的標準化與可擴展。本文結合架構圖解,系統總結 註解開發、參數綁定、數據校驗、數據回顯、異常處理、文件上傳、JSON 交互、RESTful 支持、攔截器應用 九大實戰模塊,構建完整知識圖譜。

一、 SpringMVC 核心架構流程圖 (文字版)

用戶請求 HTTP Request
        ↓
DispatcherServlet (前端控制器,統一入口)
        ↓
HandlerMapping (處理器映射器) → 根據 URL 查找 Handler (Controller 方法)
        ↓
HandlerAdapter (處理器適配器) → 適配調用 Handler (參數綁定、返回值處理)
        ↓
Handler (Controller 方法) → 業務邏輯,返回 ModelAndView / String / void / @ResponseBody
        ↓
ViewResolver (視圖解析器) → 邏輯視圖名 → 物理視圖 (JSP/Thymeleaf/FreeMarker)
        ↓
View (視圖渲染) → 輸出 HTML/JSON/XML
        ↓
HTTP Response

關鍵組件說明

  • DispatcherServlet:核心調度器,load-on-startup=1 啟動時初始化。
  • HandlerMapping:RequestMappingHandlerMapping (註解模式) 維護 URL→HandlerMethod 映射表。
  • HandlerAdapter:RequestMappingHandlerAdapter 負責參數解析、類型轉換、數據校驗、返回值處理。
  • ViewResolver:InternalResourceViewResolver (JSP)、ThymeleafViewResolver 等。

二、 註解開發核心配置


<!-- 替代傳統 HandlerMapping/Adapter 配置 -->
<mvc:annotation-driven 
    conversion-service="conversionService" 
    validator="validator">
</mvc:annotation-driven>

<!-- 掃描 Controller -->
<context:component-scan base-package="com.example.controller" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

核心註解

註解 作用 關鍵屬性
@Controller標識控制器 Bean,交給組件掃描註冊-
@RequestMappingURL 映射,可作用於類/方法value/path, method, params, headers, consumes, produces
@ResponseBody返回值直接寫入 HTTP Body (JSON/XML)-
@RestController@Controller + @ResponseBody 組合 (JDK 4.0+)-

三、 參數綁定:從請求參數到方法參數的自動映射

3.1 支持類型

  1. 原生 Servlet API:HttpServletRequest, HttpServletResponse, HttpSession, Principal, Locale, InputStream, OutputStream
  2. 模型對象:Model, ModelMap, ModelAndView (向請求域放數據)
  3. 基本類型/包裝類/String:請求參數名 = 方法參數名 → 自動綁定
  4. POJO/實體類:請求參數名 = 對象屬性名 → 自動填充 (支持巢狀屬性 user.address.city)
  5. 集合/數組:List<Item> items, String[] ids (同名參數多值)
  6. 包裝 VO:QueryVo { User user; List<Integer> ids; } 綁定複雜查詢條件

3.2 參數名不匹配:@RequestParam


public void save(@RequestParam("user_name") String username, 
                 @RequestParam(value="age", required=false, defaultValue="18") Integer age) {}

3.3 自定義類型轉換:Converter + ConversionService


// 1. 實現 Converter
public class StringToDateConverter implements Converter {
    public Date convert(String source) {
        try { return new SimpleDateFormat("yyyy-MM-dd").parse(source); }
        catch (ParseException e) { throw new IllegalArgumentException(e); }
    }
}

// 2. 注入 ConversionService
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set><bean class="com.example.converter.StringToDateConverter"/></set>
    </property>
</bean>

四、 數據校驗:JSR-303 (Bean Validation) 整合

4.1 依賴


<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.2.4.Final</version></dependency>
<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version></dependency>

4.2 實體類加註解


public class User {
    @NotBlank(message="用戶名不能為空")
    @Size(min=3, max=20, message="用戶名長度 3-20")
    private String username;

    @Email(message="郵箱格式錯誤")
    private String email;
}

4.3 Controller 校驗


@PostMapping("/user")
public String save(@Validated User user, BindingResult result, Model model) {
    if (result.hasErrors()) {
        // 回顯錯誤信息
        return "userForm";
    }
    userService.save(user);
    return "redirect:/users";
}

4.4 分組校驗


public interface Insert {} public interface Update {}
@NotNull(groups=Update.class) private Long id; // 更新時必須有 id
@Validated(Insert.class) // 指定分組

五、 數據回顯:三種方式

  1. 默認 POJO 回顯:方法參數 POJO 自動放入請求域,Key = 類名首字母小寫 (user)。
  2. @ModelAttribute 指定 Key:@ModelAttribute("userVo") User user → 請求域 Key = "userVo"。
  3. Model/ModelMap 手動放入:model.addAttribute("user", user),最靈活、推薦。

六、 統一異常處理:@ControllerAdvice + @ExceptionHandler


@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ServiceException.class) // 業務異常
    public ModelAndView handleServiceEx(ServiceException e) {
        return new ModelAndView("error", "message", e.getMessage());
    }

    @ExceptionHandler(Exception.class) // 系統異常
    public ModelAndView handleSysEx(Exception e) {
        log.error("系統異常", e);
        return new ModelAndView("error", "message", "系統繁忙,請稍後重試");
    }

    @ExceptionHandler(Exception.class)
    @ResponseBody // AJAX 請求返回 JSON
    public Result handleAjaxEx(Exception e, HttpServletRequest request) {
        if (isAjax(request)) return Result.error("系統異常");
        return null; // 非 AJAX 走視圖解析
    }
}

原則:DAO/Service 拋業務異常,Controller 拋參數/流程異常,最終由全局處理器統一響應。

七、 文件上傳:MultipartResolver + Commons FileUpload


<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760"/> <!-- 10MB -->
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
        String path = "/upload/" + UUID.randomUUID() + "_" + file.getOriginalFilename();
        file.transferTo(new File(path));
    }
    return "success";
}

前端 <form enctype="multipart/form-data">。

八、 JSON 交互:@RequestBody + @ResponseBody + Jackson


<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.8</version></dependency>

@PostMapping(value="/user", consumes="application/json", produces="application/json")
@ResponseBody
public User create(@RequestBody User user) { // 請求體 JSON → User
    return userService.save(user); // User → 響應體 JSON
}

<mvc:annotation-driven> 自動註冊 MappingJackson2HttpMessageConverter。

九、 RESTful 支持:@PathVariable + HiddenHttpMethodFilter


@GetMapping("/users/{id}")
public User get(@PathVariable Long id) { return userService.get(id); }

@PutMapping("/users/{id}")
public User update(@PathVariable Long id, @RequestBody User user) { ... }

@DeleteMapping("/users/{id}")
public void delete(@PathVariable Long id) { ... }

瀏覽器表單不支持 PUT/DELETE,需配置 HiddenHttpMethodFilter 將 _method=PUT 參數轉為 HTTP Method。


<filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>

靜態資源訪問:<mvc:resources mapping="/static/**" location="/static/"/>。

十、 攔截器應用總結 (參考前文)

  • 日志攔截器:最前,必放行,記錄請求參數、耗時、響應狀態。
  • 登錄認證攔截器:白名單排除、Session 檢查、AJAX/頁面差異化響應。
  • 權限校驗攔截器:基於註解 @RequirePermission 精細控制。
  • 執行順序:preHandle 正序 → postHandle/afterCompletion 逆序,false 截斷。

結語

SpringMVC 知識體系橫跨 架構原理、註解驅動、參數綁定、校驗、異常、文件、JSON、REST、攔截 九大維度。建議按「架構圖 → 核心配置 → 實戰模塊 → 源碼追蹤」路徑學習:先跑通 mvc:annotation-driven 全家桶,再逐個模塌替換默認實現 (如自定義 HandlerMethodArgumentResolver、HandlerExceptionResolver),最終閱讀 DispatcherServlet.doDispatch() 源碼,將知識點串成線,形成自己的「SpringMVC 內核模型」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved