1. Java Web的發展歷史與MVC模式
1.1 Model I與Model II的演進
Model I(JSP+JavaBean)
作為早期Java Web開發的主流模式,其核心架構如下:
graph LR
A[客戶端] --> B[JSP頁面]
B --> C{業務邏輯}
C --> D[JavaBean]
D --> B
B --> A
痛點分析:
-
JSP同時承擔視圖渲染與業務控制,代碼耦合度高
-
項目規模擴大后維護成本指數級增長
Model II(Servlet+JSP+JavaBean)
通過分層思想實現解耦:
graph LR
A[客戶端] --> B[Servlet]
B --> C{控制邏輯}
C --> D[JavaBean]
D --> E[JSP]
E --> A
優勢:
-
職責分離:Servlet負責流程控制,JSP專注視圖展示
-
更適合大型項目開發
1.2 MVC設計模式的精髓
組件 | 職責說明 | 具體實現 |
---|---|---|
Model | 數據處理與業務邏輯 | Service/Dao/Entity |
View | 用戶界面與數據展示 | JSP/Thymeleaf模板 |
Controller | 請求調度與響應處理 | @Controller注解類 |
2. Spring MVC快速入門實戰
2.1 環境搭建(IntelliJ IDEA演示)
Maven依賴配置:
<properties><spring.version>5.3.18</spring.version>
</properties><dependencies><!-- Spring MVC核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- 視圖解析 --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.15.RELEASE</version></dependency>
</dependencies>
2.2 核心配置詳解
web.xml配置:
<!-- 字符編碼過濾器 -->
<filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter><!-- 前端控制器 -->
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
Spring MVC配置(spring-mvc.xml):
<!-- 組件掃描 -->
<context:component-scan base-package="com.example.controller"/><!-- 視圖解析器 -->
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="templateEngine" ref="templateEngine"/>
</bean><!-- 模板引擎配置 -->
<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".html"/></bean></property>
</bean>
2.3 控制器開發實例
@Controller
public class HelloController {@GetMapping("/hello")public String sayHello(Model model) {model.addAttribute("message", "Welcome to Spring MVC!");return "result-page";}
}
頁面結構:
src
├── main
│ ├── webapp
│ │ └── WEB-INF
│ │ └── views
│ │ └── result-page.html
3. Spring MVC核心原理剖析
3.1 請求處理全流程
-
DispatcherServlet接收請求
作為統一入口,攔截所有HTTP請求 -
HandlerMapping路由匹配
根據URL找到對應的Controller方法 -
HandlerAdapter執行處理
通過反射調用目標方法 -
視圖解析與渲染
將邏輯視圖名轉換為物理視圖路徑
sequenceDiagram
客戶端->>DispatcherServlet: HTTP請求
DispatcherServlet->>HandlerMapping: 查詢處理器
HandlerMapping-->>DispatcherServlet: 返回Handler
DispatcherServlet->>HandlerAdapter: 執行處理器
HandlerAdapter->>Controller: 調用方法
Controller-->>HandlerAdapter: 返回ModelAndView
HandlerAdapter-->>DispatcherServlet: 返回結果
DispatcherServlet->>ViewResolver: 解析視圖
ViewResolver-->>DispatcherServlet: 返回視圖
DispatcherServlet->>View: 渲染視圖
View-->>客戶端: 響應HTML
3.2 核心組件詳解
組件 | 職責說明 | 默認實現類 |
---|---|---|
HandlerMapping | 請求到處理器的映射 | RequestMappingHandlerMapping |
HandlerAdapter | 執行處理器方法 | RequestMappingHandlerAdapter |
ViewResolver | 解析邏輯視圖名 | InternalResourceViewResolver |
HandlerExceptionResolver | 異常處理 | ExceptionHandlerExceptionResolver |
4. 開發技巧與最佳實踐
-
RESTful風格設計
@RestController
@RequestMapping("/api/users")
public class UserController {@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {// 業務邏輯}
}
????????2.統一異常處理
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ModelAndView handleException(Exception ex) {ModelAndView mav = new ModelAndView();mav.addObject("errorMsg", ex.getMessage());mav.setViewName("error-page");return mav;}
}
3.?參數驗證技巧
@PostMapping("/register")
public String register(@Valid User user, BindingResult result) {if (result.hasErrors()) {return "register-form";}// 處理注冊邏輯
}
5. 常見問題排查指南
問題1:404未找到頁面
? 檢查項:
-
控制器是否添加@Controller注解
-
請求路徑是否匹配@RequestMapping
-
視圖文件位置是否符合配置的prefix/suffix
問題2:參數綁定失敗
? 解決方案:
-
檢查表單字段名與POJO屬性名是否一致
-
使用@RequestParam指定參數名稱
-
添加BindingResult參數捕獲錯誤
6. 性能優化建議
-
啟用緩存
@Cacheable("users")
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {// 數據庫查詢
}
?????????2.異步處理
@Async
public CompletableFuture<User> fetchUserAsync(Long id) {// 異步操作
}
?????????3.靜態資源優化
結語
<mvc:resources mapping="/static/**" location="/static/" cache-period="31556926"/>
通過本文的學習,我們不僅掌握了Spring MVC的核心原理,還完成了從環境搭建到實戰開發的完整流程。建議讀者在掌握基礎后,繼續深入以下方向:
-
深入理解攔截器(Interceptor)機制
-
研究Spring Boot對MVC的自動化配置
-
探索響應式編程WebFlux框架