SpringMVC:框架搭建、核心配置与前后端交

前言

在 Java Web 开发的演进历程中,SpringMVC 凭借解耦、简洁、高效的特性,成为主流 Web 开发框架。它基于 MVC 设计模式,是 Spring 家族的核心 Web 模块,彻底简化了原生 Servlet 的开发流程。本文结合实战代码,全面讲解 SpringMVC 从搭建到应用的全流程。


第一章 Java Web 发展历史与 MVC 设计模式

一、Model I 与 Model II 开发模式

1. Model I 开发模式

核心架构:JSP + JavaBean

  • JSP 页面承担视图展示 + 业务控制 + 数据处理三重职责,高度耦合
  • 优点:开发简单,适合小型 Demo 项目
  • 缺点:代码臃肿、维护困难、扩展性极差,无法适配大型项目

2. Model II 开发模式

核心架构:JSP + Servlet + JavaBean

  • 严格分工:JSP 负责视图展示、Servlet 负责流程控制、JavaBean 负责业务逻辑
  • 实现了职责分离,是 MVC 模式的雏形,为大型项目开发奠定基础

二、MVC 设计模式

MVC 是一种通用的软件设计规范,不局限于语言和框架,SpringMVC 就是 MVC 模式的最佳实践:

  • M (Model) 模型层:JavaBean,分为实体类 Bean(存储数据)、业务 Bean(处理逻辑)
  • V (View) 视图层:HTML/JSP 页面,负责与用户交互、数据展示
  • C (Controller) 控制层:替代原生 Servlet,接收请求、调度业务、响应数据

三者协同工作,低耦合、高扩展,是现代 Web 开发的核心思想。


第二章 SpringMVC 框架搭建与基础配置(实战版)

一、项目初始化与依赖配置

1. 项目创建规范

  • 必须使用 Maven 的webapp 模板创建 Web 工程
  • 严格选择模板版本(推荐 1.0),避免版本冲突导致项目无法启动

2. Maven 核心依赖(pom.xml)

导入 SpringMVC 核心依赖、Servlet API、JSON 解析、视图解析器等必备依赖:

复制代码
<properties>
  <spring.version>5.0.2.RELEASE</spring.version>
</properties>

<dependencies>
  <!-- JSON解析依赖 -->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
  </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.0</version>
  </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.0</version>
  </dependency>

  <!-- Spring核心依赖 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <!-- SpringMVC核心依赖 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!-- Servlet/JSP API -->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
  </dependency>

  <!-- 日志+视图解析器 -->
  <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
  </dependency>
  <dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring4</artifactId>
    <version>3.0.9.RELEASE</version>
  </dependency>
</dependencies>

二、核心配置文件详解

1. web.xml 升级与配置

将默认 2.3 版本升级为3.0 版本,配置前端控制器、编码过滤器、请求映射:

复制代码
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <!-- 编码过滤器:解决中文乱码 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 放行静态HTML页面 -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

    <!-- SpringMVC核心前端控制器 -->
    <servlet>
        <servlet-name>dispatcherServlet</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>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 默认首页 -->
    <welcome-file-list>
        <welcome-file>/index.html</welcome-file>
    </welcome-file-list>
</web-app>

2. springmvc.xml 核心配置

配置包扫描、视图解析器、注解驱动,是 SpringMVC 的核心配置文件:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 包扫描:自动注册Bean -->
    <context:component-scan base-package="com.qcby"></context:component-scan>

    <!-- 视图解析器配置 -->
    <bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine" ref="templateEngine"/>
    </bean>
    <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
        <property name="templateResolver" ref="templateResolver"/>
    </bean>
    <bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
        <property name="prefix" value="/html/" />
        <property name="suffix" value=".html" />
        <property name="templateMode" value="HTML5"/>
    </bean>

    <!-- JSON视图支持 -->
    <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"></bean>
    
    <!-- 开启SpringMVC注解驱动 -->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>

三、基础请求处理与视图解析

1. 实体类定义(Hello.java)

用于前后端数据交互的实体对象:

复制代码
package com.qcby.model;

public class Hello {
    private String username;
    private String password;
    private String sex;
    private String age;
    private String address;
    private String phone;

    // getter/setter 自行生成
}

2. Controller 层开发

复制代码
package com.qcby.controller;

import com.qcby.model.Hello;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
@RequestMapping("/hello")
public class HelloController {

    // 页面跳转:返回视图名称
    @RequestMapping("/hello")
    public String hello(){
        return "hello";
    }

    // 返回JSON字符串
    @RequestMapping("/hello2")
    @ResponseBody
    public String hello2(){
        return "hello2";
    }

    // 单参数接收
    @GetMapping("/save")
    @ResponseBody
    public String save(String username){
        System.out.println(username);
        return "保存成功";
    }

    // 多参数接收
    @GetMapping("/save2")
    @ResponseBody
    public String save2(String username,String password){
        System.out.println(username + " " + password);
        return "success";
    }

    // 对象参数接收
    @GetMapping("/save3")
    @ResponseBody
    public Hello save3(Hello hello){
        return hello;
    }

    // Restful风格:单路径参数
    @GetMapping(value = "/save4/{name}")
    @ResponseBody
    public String save4(@PathVariable String name){
        System.out.println(name);
        return "success";
    }

    // Restful风格:多路径参数
    @GetMapping(value = "/save5/{name}/{password}")
    @ResponseBody
    public String save5(@PathVariable String name,@PathVariable String password){
        System.out.println(name + " " + password);
        return "success";
    }

    // Post请求:接收JSON对象
    @PostMapping(value = "/save6")
    @ResponseBody
    public Hello save6(@RequestBody Hello hello){
        return hello;
    }

    // 兼容原生Servlet API
    @GetMapping(value = "/save7")
    @ResponseBody
    public String save7(HttpServletRequest request, HttpServletResponse response){
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        System.out.println(name + " " + password);
        return "success";
    }
}

3. 页面编写

  • index.html(首页)

    入门程序

    入门

    入门程序
  • suc.html(成功页面)

    成功

    Hello


第三章 前后端数据交互方式详解

SpringMVC 提供了多样化的参数接收方式,完美适配各种开发场景:

一、基础参数接收

  1. 单 / 多参数接收:直接在方法参数中声明变量,框架自动映射请求参数
  2. 对象参数接收:参数过多时,使用实体类接收,自动封装属性,推荐使用

二、Restful 风格接口开发

  • 核心注解:@PathVariable
  • 配合路径占位符/{参数名}使用,是现代接口开发的标准风格
  • 适合少量参数的路径传参,简洁优雅

三、POST 请求与 JSON 交互

  • @PostMapping:专用处理 POST 请求
  • @RequestBody:接收前端传递的 JSON 格式数据,自动封装为对象
  • 前端推荐在raw格式中传输 JSON 数据

四、兼容原生 Servlet

SpringMVC 完全支持HttpServletRequest/HttpServletResponse原生 API,方便老项目迁移


第四章 SpringMVC 核心执行原理

一、核心组件

  1. DispatcherServlet:前端控制器,统一接收请求、分发响应
  2. HandlerMapping:处理器映射器,根据请求路径找到对应 Controller 方法
  3. HandlerAdapter:处理器适配器,执行 Controller 方法
  4. ViewResolver:视图解析器,解析视图名称,渲染页面

二、执行流程

  1. 服务器启动,加载配置文件,初始化 DispatcherServlet
  2. 浏览器发送请求,到达前端控制器
  3. 映射器找到对应处理方法,适配器执行方法
  4. 返回视图 / 数据,视图解析器渲染页面,最终响应给用户

总结

本文完整覆盖了SpringMVC 从理论到实战的全流程:

  1. 梳理 Java Web 发展历程,理解 MVC 设计思想
  2. 手把手搭建 SpringMVC 项目,详解核心配置
  3. 实战 Controller 开发,掌握所有前后端交互方式
  4. 解析底层执行原理,知其然更知其所以然
相关推荐
MageGojo1 小时前
Whois 域名查询 API 接入实战:用一个 GET 请求获取域名注册信息
java·git·github
jerryinwuhan1 小时前
marker BiBERTo解释
java·前端·人工智能
在繁华处1 小时前
Java从零到熟练(八):泛型与注解
java·开发语言·python
半夜修仙1 小时前
RabbitMQ入门概述
java·rabbitmq·java-rabbitmq
fengxin_rou1 小时前
【滑动窗口与前缀和算法实战】:LeetCode560.438 高频题深度解析
java·算法·leetcode
dusk_star1 小时前
go语言--笔记--接口
java·笔记·golang
The Sheep 20231 小时前
EFcore 查询数据
java·javascript
han_hanker1 小时前
java8 stream 常用转换方法
java
星轨zb1 小时前
从通用到专属:文迹(WenJi)引入 RAG 向量库的技术复盘
java·spring·langchain4j