Spring MVC 作為 Java Web 開發的經典框架,掌握其核心架構與配置流程是每位 Java 開發者的必修課。本文將帶領讀者從零開始,一步步構建一個完整的 Spring MVC 入門範例,涵蓋前端控制器配置、處理器映射器、適配器、視圖解析器等核心組件。
Spring MVC 採用經典的 MVC 設計模式,核心流程為:請求 → DispatcherServlet(前端控制器) → HandlerMapping(處理器映射器) → HandlerAdapter(處理器適配器) → Controller(處理器) → ViewResolver(視圖解析器) → View(視圖) → 響應。
在 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>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
關鍵參數說明:
load-on-startup: 1 — 服務啟動時即載入 Servleturl-pattern: *.action — 攔截所有 .action 結尾的請求contextConfigLocation — 指定 Spring MVC 配置檔位置,未指定則預設載入 WEB-INF/[servlet-name]-servlet.xml| 策略 | 配置範例 | 優點 | 缺點 |
|---|---|---|---|
| 固定後綴 | *.do, *.action | 簡單,不攔截靜態資源 | URL 不夠 RESTful |
| 攔截所有 (/) | / | 支援 REST 風格 URL | 靜態資源需額外配置排除 |
| 錯誤配置 (/* | /* | 無 | 導致 JSP 轉發再次被攔截,無法正常渲染 |
在 springmvc.xml 中配置傳統模式的映射器與適配器:
<!-- 處理器映射器:根據 Bean 名稱匹配 URL --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!-- 處理器適配器:支援實作 Controller 介面的處理器 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
實作 Controller 介面的傳統處理器:
public class ItemList1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
List<Items> itemsList = new ArrayList<>();
// 填充測試資料...
Items items_1 = new Items();
items_1.setName("技嘉筆記本");
items_1.setPrice(6000f);
items_1.setDetail("P35K V3筆記本電腦!");
itemsList.add(items_1);
// 更多資料...
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsList", itemsList);
modelAndView.setViewName("order/itemsList");
return modelAndView;
}
}
<bean name="/items1.action" id="itemList1" class="com.luchao.controller.ItemList1"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
使用視圖解析器後,Controller 中只需邏輯視圖名(如 order/itemsList),解析器自動拼接為完整路徑 /WEB-INF/jsp/order/itemsList.jsp,大幅提升靈活性。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>
<table width="100%" border=1>
<tr><td>商品名稱</td><td>商品價格</td><td>商品描述</td></tr>
<c:forEach items="${itemsList}" var="item">
<tr>
<td>${item.name}</td>
<td>${item.price}</td>
<td>${item.detail}</td>
</tr>
</c:forEach>
</table>
支援多對一映射,配置更靈活:
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/items1.action">itemList1</prop>
<prop key="/items2.action">itemList2</prop>
</props>
</property>
</bean>
實作 HttpRequestHandler 介面,搭配 HttpRequestHandlerAdapter,可直接操作 Response 輸出 JSON 等格式:
public class ItemList2 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 業務邏輯...
request.setAttribute("itemsList", itemsList);
request.getRequestDispatcher("/WEB-INF/jsp/order/itemsList.jsp").forward(request, response);
}
}
輸出 JSON 範例:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
現代 Spring MVC 開發推薦使用註解方式,大幅簡化配置:
<!-- 一行替代 HandlerMapping + HandlerAdapter 註解版配置 --> <mvc:annotation-driven/> <!-- 掃描 Controller 註解 --> <context:component-scan base-package="com.luchao.controller"/>
@Controller
public class ItemList3 {
@RequestMapping("/items3")
public ModelAndView queryItems() throws Exception {
List<Items> itemsList = new ArrayList<>();
// 填充資料...
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemsList", itemsList);
modelAndView.setViewName("order/itemsList");
return modelAndView;
}
}
@RequestMapping 實現 URL 與方法映射,mvc:annotation-driven 預設載入 JSON 轉換、參數綁定等常用功能,是實務開發的標準配置。
本文完整展示了 Spring MVC 從傳統 XML 配置到現代註解驅動的演進過程。理解各組件職責(DispatcherServlet、HandlerMapping、HandlerAdapter、Controller、ViewResolver)有助於深入掌握框架運作原理。實務開發中,強烈建議採用 mvc:annotation-driven + @Controller + @RequestMapping 的註解模式,配合元件掃描,實現零配置、高維護性的開發體驗。