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

Spring MVC 入門實戰:從零構建第一個 Web 應用程式

     編輯:Java 綜合教學

前言

Spring MVC 作為 Java Web 開發的經典框架,掌握其核心架構與配置流程是每位 Java 開發者的必修課。本文將帶領讀者從零開始,一步步構建一個完整的 Spring MVC 入門範例,涵蓋前端控制器配置、處理器映射器、適配器、視圖解析器等核心組件。

專案架構概覽

Spring MVC 採用經典的 MVC 設計模式,核心流程為:請求 → DispatcherServlet(前端控制器) → HandlerMapping(處理器映射器) → HandlerAdapter(處理器適配器) → Controller(處理器) → ViewResolver(視圖解析器) → View(視圖) → 響應。

核心配置詳解

1. 前端控制器配置 (web.xml)

在 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 — 服務啟動時即載入 Servlet
  • url-pattern: *.action — 攔截所有 .action 結尾的請求
  • contextConfigLocation — 指定 Spring MVC 配置檔位置,未指定則預設載入 WEB-INF/[servlet-name]-servlet.xml

2. URL 攔截策略對比

策略配置範例優點缺點
固定後綴*.do, *.action簡單,不攔截靜態資源URL 不夠 RESTful
攔截所有 (/)/支援 REST 風格 URL靜態資源需額外配置排除
錯誤配置 (/*/*無導致 JSP 轉發再次被攔截,無法正常渲染

3. 處理器映射器與適配器配置

在 springmvc.xml 中配置傳統模式的映射器與適配器:

<!-- 處理器映射器:根據 Bean 名稱匹配 URL -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

<!-- 處理器適配器:支援實作 Controller 介面的處理器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

4. 開發處理器

實作 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;
    }
}

5. 註冊處理器 Bean

<bean name="/items1.action" id="itemList1" class="com.luchao.controller.ItemList1"/>

6. 視圖解析器配置

<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,大幅提升靈活性。

7. 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>

進階配置:SimpleUrlHandlerMapping

支援多對一映射,配置更靈活:

<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 模式

實作 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 開發推薦使用註解方式,大幅簡化配置:

1. 核心配置簡化

<!-- 一行替代 HandlerMapping + HandlerAdapter 註解版配置 -->
<mvc:annotation-driven/>

<!-- 掃描 Controller 註解 -->
<context:component-scan base-package="com.luchao.controller"/>

2. 註解版 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 的註解模式,配合元件掃描,實現零配置、高維護性的開發體驗。

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