在 Java Web 開發演進史中,從 Servlet → JSP → Servlet+JSP → MVC 框架,Spring MVC 憑藉 請求處理關注點完全分離、視圖解耦靈活、無縫整合 Spring 生態 三大優勢成為主流選擇。本文基於 IntelliJ IDEA (非 Eclipse/MyEclipse),零 Maven 依賴,手把手構建首個 Spring MVC 程序。
spring-framework-4.x.x.RELEASE-dist.zip)mvcdemo,位置自選因不使用 Maven,需手動配置庫依賴:
+ → JARs or directorieslibs/ 所有 JAR (spring-webmvc, spring-core, spring-context, spring-beans, spring-expression, spring-aop, spring-web, commons-logging 等)<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee
https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Spring MVC Demo</display-name>
<!-- 前端控制器:攔截所有請求 -->
<servlet>
<servlet-name>mvcdemo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvcdemo-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvcdemo</servlet-name>
<url-pattern>/</url-pattern> <!-- 攔截所有請求,含靜態資源需額外配置 -->
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 1. 處理器映射:按 Bean 名稱匹配 URL -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping"/>
<!-- 2. 控制器 Bean 定義:URL 映射到具體處理類 -->
<bean name="/hello" class="com.luoxn28.hello.HelloController"/>
<!-- 3. 視圖解析器:邏輯視圖名 → 物理 JSP 路徑 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
| 組件 | 角色 | 本例配置 |
|---|---|---|
| DispatcherServlet | 前端控制器,統一入口 | 攔截 / 所有請求 |
| ControllerBeanNameHandlerMapping | URL 與 Controller 映射策略 | Bean name 即 URL 路徑 |
| HelloController | 具體請求處理器 | 實現 Controller 接口 |
| InternalResourceViewResolver | 視圖解析器 | /WEB-INF/ + 視圖名 + .jsp |
package com.luoxn28.hello;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) {
// 1. 獲取請求參數
String hello = request.getParameter("hello");
System.out.println("HelloController 接收參數: " + hello);
// 2. 構建 ModelAndView:視圖名 + 模型數據
ModelAndView mav = new ModelAndView("hello"); // 對應 /WEB-INF/hello.jsp
mav.addObject("hello", hello); // 模型數據鍵值對
return mav;
}
}
/WEB-INF/hello.jsp (受保護路徑,僅通過 ViewResolver 訪問):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Spring MVC Demo</title></head>
<body>
Spring MVC<br/>
接收到的參數: ${hello} <!-- EL 表達式顯示模型數據 -->
</body>
</html>
/index.jsp (歡迎頁,發起請求):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>首頁</title></head>
<body>
<form action="hello" method="post">
輸入內容: <input type="text" name="hello"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
+ → Tomcat Server → LocalTomcat_mvcdemo+ → Artifact → 選擇 mvcdemo:war exploded/ (根路徑訪問)+ → 選擇 /WEB-INF/mvcdemo-servlet.xml若 Artifacts 標籤有紅色提示,點擊 Fix 自動修復 WAR 包結構。
https://localhost:8080/ 顯示輸入表單luoxn28 點擊提交Spring MVC
接收到的參數: luoxn28請求流向:
1. 瀏覽器 POST /hello?hello=luoxn28
2. DispatcherServlet 攔截
3. ControllerBeanNameHandlerMapping 匹配 Bean name "/hello" → HelloController
4. HelloController.handleRequestInternal() 處理 → 返回 ModelAndView("hello", model)
5. InternalResourceViewResolver 解析視圖 → /WEB-INF/hello.jsp
6. JSP 渲染模型數據 ${hello} → HTML 響應瀏覽器
@Controller + @RequestMapping 替代 XML 配置@RestController + @PathVariable + JSON 返回@Configuration + @EnableWebMvc 替代 XML本文通過零 Maven、手動導包、XML 配置的「原始」方式,完整還原了 Spring MVC 核心運行機制:DispatcherServlet 統一入口 → HandlerMapping 尋找處理器 → Controller 處理業務 → ViewResolver 解析視圖 → 渲染響應。理解這套流程是掌握 Spring MVC 乃至 Spring Boot 自動配置原理的基石。建議以此為起點,快速遷移至註解開發與 Maven 管理,擁抱現代化開發效率。