首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Spring MVC 入門(一):整體架構、核心組件與零配置啟動全流程

     編輯:關於C語言

Spring MVC 定位

Spring MVC 是 Spring Framework 內建的 Web MVC 框架,採用前端控制器模式,以 `DispatcherServlet` 為核心,統籌「請求接收 → 映射解析 → 控制器執行 → 視圖渲染 → 回應輸出」全生命週期。與 Struts 2(Filter 架構)不同,Spring MVC 基於 Servlet API,天然融合 Spring IoC 容器,支援 RESTful、非同步、響應式等現代 Web 模式。

核心架構圖解

Client
  │
  ▼
DispatcherServlet (Front Controller)
  │
  ├─► HandlerMapping          -- URL 找 Controller
  ├─► HandlerAdapter          -- 統一呼叫介面 (Controller/RestController/HttpRequestHandler...)
  ├─► HandlerInterceptor      -- Pre/Post/After 橫切
  ├─► Controller              -- 業務邏輯,回傳 ModelAndView / String / @ResponseBody
  ├─► ViewResolver            -- 邏輯視圖名 → 具體 View (JSP/Thymeleaf/FreeMarker/JSON...)
  └─► View                    -- 渲染輸出
  │
  ▼
Response

九大核心組件(可插拔,皆為介面)

組件角色常用實現
MultipartResolver檔案上傳解析StandardServletMultipartResolver, CommonsMultipartResolver
LocaleResolver區域解析AcceptHeaderLocaleResolver, SessionLocaleResolver, CookieLocaleResolver
ThemeResolver主題解析FixedThemeResolver, CookieThemeResolver
HandlerMappingURL → HandlerExecutionChainRequestMappingHandlerMapping (註解式), SimpleUrlHandlerMapping (XML)
HandlerAdapter統一呼叫 HandlerRequestMappingHandlerAdapter, HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter
HandlerExceptionResolver異常映射視圖/回應DefaultHandlerExceptionResolver, ResponseStatusExceptionResolver, ExceptionHandlerExceptionResolver
RequestToViewNameTranslator無視圖名時由 URL 推導DefaultRequestToViewNameTranslator
ViewResolver邏輯視圖名 → ViewInternalResourceViewResolver (JSP), ThymeleafViewResolver, ContentNegotiatingViewResolver
FlashMapManager重導向攜帶暫存資料SessionFlashMapManager

傳統 XML 啟動完整步驟(Spring 3.x 風格)

1. 依賴座標 (Maven)

<dependencies>
    <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.x</version></dependency>
    <dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>
    <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>
</dependencies>

2. web.xml 註冊 DispatcherServlet

<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/springMVC-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>*.html</url-pattern>  <!-- 或 / REST 風格 -->
</servlet-mapping>

3. springMVC-servlet.xml 核心配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="https://www.springframework.org/schema/context"
       xmlns:mvc="https://www.springframework.org/schema/mvc"
       xsi:schemaLocation="... ">

    <!-- 1. 掃描 Controller -->
    <context:component-scan base-package="com.example.controller"/>

    <!-- 2. 啟用註解驅動 (HandlerMapping + HandlerAdapter + 轉換/格式化/驗證) -->
    <mvc:annotation-driven/>

    <!-- 3. 靜態資源預設 Servlet -->
    <mvc:default-servlet-handler/>

    <!-- 4. 視圖解析器 (JSP 範例) -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

4. Controller 範例

@Controller
@RequestMapping("/hello")
public class HelloController {
    @GetMapping(".html")
    public String hello(Model model) {
        model.addAttribute("user", "ZhangSan");
        return "success";  // → /WEB-INF/views/success.jsp
    }
}

現代零 XML 啟動 (Spring 4.0+ / Spring Boot)

WebApplicationInitializer (Servlet 3.0+ 容器自動發現)

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext ctx) {
        AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
        root.register(AppConfig.class);  // @Configuration 類

        DispatcherServlet servlet = new DispatcherServlet(root);
        ServletRegistration.Dynamic reg = ctx.addServlet("springMVC", servlet);
        reg.setLoadOnStartup(1);
        reg.addMapping("/");  // REST 風格
    }
}

Spring Boot 一鍵啟動

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
// application.yml
// spring.mvc.view.prefix: /WEB-INF/views/
// spring.mvc.view.suffix: .jsp

請求處理完整流程時序

  1. `DispatcherServlet.doDispatch()`
  2. 尋找 `HandlerExecutionChain`(`HandlerMapping` + `HandlerInterceptor[]`)
  3. 取得 `HandlerAdapter`,呼叫 `handle()` → 執行 Controller 方法
  4. Controller 回傳:`ModelAndView` / `String` (view name) / `@ResponseBody` / `ResponseEntity` / `void` (自行寫回應)
  5. 若為視圖名,`ViewResolver` 解析為 `View`
  6. `View.render(model, request, response)` 輸出
  7. 觸發 `afterCompletion` 清理

常見坑點速查

  • @RequestMapping 未加 `` → 404
  • 視圖前綴/後綴拼接錯誤 → 無法找到 JSP
  • 靜態資源 (CSS/JS/圖片) 被 `DispatcherServlet` 攔截 → 加 ``
  • 表單中文亂碼 → 配置 `CharacterEncodingFilter` (web.xml) 或 `spring.http.encoding.charset=UTF-8` (Boot)
  • 循環依賴:Controller 注入 Service,Service 注入 Controller → 改用 `@Lazy` 或重構

Spring MVC 的精髓在於「九大組件可插拔、DispatcherServlet 統籌全局、註解驅動消除樣板碼」。理解 XML 時代的手動裝配流程,能讓你在 Spring Boot 自動配置失效時精準診斷根因。

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