SpringMVC快速入门之启动配置流程

SpringMVC快速入门之启动配置流程

    • 一、SpringMVC启动的核心流程
    • 二、环境准备与依赖配置
      • 2.1 开发环境
      • 2.2 Maven依赖配置
    • 三、初始化Servlet容器:WebApplicationInitializer
      • 3.1 实现WebApplicationInitializer
      • 3.2 配置编码过滤器(解决中文乱码)
    • 四、配置SpringMVC环境:SpringMvcConfig
      • 4.1 基础配置(@Configuration + @EnableWebMvc)
      • 4.2 配置视图解析器(JSP视图)
      • 4.3 配置静态资源处理
    • 五、编写第一个Controller验证配置
      • 5.1 创建Controller
      • 5.2 创建JSP视图
    • 六、启动应用并验证
      • 6.1 启动Tomcat
      • 6.2 访问测试
    • 七、常见问题与排查
      • 7.1 启动失败:找不到Controller
      • 7.2 静态资源404(CSS/JS无法加载)
      • 7.3 中文乱码(POST请求参数)
    • 总结:SpringMVC启动配置核心要点

SpringMVC作为主流的Web MVC框架,其启动配置是入门的核心。不同于传统的XML配置,现代SpringMVC开发更推荐基于Java配置类的方式,这种方式更灵活且易于维护。本文我将从Servlet容器初始化、SpringMVC环境加载到核心配置类设置,完整解析SpringMVC的启动配置流程,带你快速搭建可运行的SpringMVC应用。

一、SpringMVC启动的核心流程

SpringMVC的启动本质是在Servlet容器中初始化SpringMVC环境,核心流程包括:

  1. Servlet容器启动(如Tomcat):加载Web应用的初始化类;
  2. Spring容器初始化:创建SpringMVC的IoC容器,加载配置类和Bean;
  3. DispatcherServlet初始化:注册核心组件(处理器映射器、适配器等),接管请求处理;
  4. 应用就绪:接收并处理客户端请求。

传统方式通过web.xml配置启动,而现代方式(Servlet 3.0+)可通过Java类完全替代XML,本文将重点讲解基于Java配置的启动方式。

二、环境准备与依赖配置

2.1 开发环境

  • JDK:1.8+
  • Servlet容器:Tomcat 9.0+(支持Servlet 3.1)
  • 构建工具:Maven
  • Spring版本:Spring 5.3.x

2.2 Maven依赖配置

创建pom.xml,添加核心依赖(SpringMVC、Servlet API等):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>springmvc-quickstart</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><spring.version>5.3.20</spring.version><servlet.api.version>4.0.1</servlet.api.version></properties><dependencies><!-- SpringMVC核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- Servlet API(提供Servlet相关类) --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.api.version}</version><scope>provided</scope> <!-- 运行时由容器提供,打包不包含 --></dependency><!-- JSTL(可选,用于JSP页面) --><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>javax.servlet.jsp.jstl-api</artifactId><version>1.2.2</version></dependency></dependencies><!-- 配置Maven编译和打包 --><build><plugins><!-- 编译Java 1.8 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- 配置Tomcat插件(方便本地运行) --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat9-maven-plugin</artifactId><version>3.0.0</version><configuration><port>8080</port> <!-- 端口 --><path>/</path> <!-- 上下文路径 --></configuration></plugin></plugins></build>
</project>

依赖说明

  • spring-webmvc:包含SpringMVC核心类(如DispatcherServlet);
  • javax.servlet-api:提供Servlet规范相关类(如ServletContext);
  • Tomcat插件:无需本地安装Tomcat,通过mvn tomcat9:run启动应用。

三、初始化Servlet容器:WebApplicationInitializer

Servlet 3.0+支持通过WebApplicationInitializer接口替代web.xml,实现Servlet容器的初始化配置。这个接口的onStartup方法会在容器启动时被调用,用于注册DispatcherServlet和配置过滤器。

3.1 实现WebApplicationInitializer

创建MyWebAppInitializer类,继承AbstractAnnotationConfigDispatcherServletInitializer(Spring提供的抽象类,简化配置):

package com.example.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;/*** 替代web.xml,初始化Servlet容器*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {/*** 配置根容器的配置类(非Web层Bean,如Service、Dao)* 若无需分层,可返回空数组*/@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0]; // 本文简化为单容器,根容器为空}/*** 配置SpringMVC容器的配置类(Web层Bean,如Controller、视图解析器)*/@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class}; // 指定SpringMVC配置类}/*** 配置DispatcherServlet的映射路径(拦截哪些请求)*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"}; // 拦截所有请求(除.jsp)}
}

核心作用

  • getServletConfigClasses:指定SpringMVC的配置类(SpringMvcConfig),用于创建SpringMVC容器;
  • getServletMappings:设置DispatcherServlet的映射路径为/,即所有请求都由SpringMVC处理;
  • 该类会自动注册DispatcherServlet到Servlet容器,无需手动配置。

3.2 配置编码过滤器(解决中文乱码)

AbstractAnnotationConfigDispatcherServletInitializer可重写getServletFilters方法注册过滤器,最关键的是配置编码过滤器(解决POST请求中文乱码):

@Override
protected Filter[] getServletFilters() {// 创建编码过滤器CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();encodingFilter.setEncoding("UTF-8");encodingFilter.setForceEncoding(true); // 强制响应编码为UTF-8return new Filter[]{encodingFilter};
}

作用

  • 所有请求经过该过滤器后,请求和响应的编码都会被设置为UTF-8;
  • 必须配置,否则POST请求的中文参数会出现乱码。

四、配置SpringMVC环境:SpringMvcConfig

SpringMvcConfig是SpringMVC的核心配置类,用于配置组件扫描、视图解析器、静态资源处理等Web层相关Bean,替代传统的spring-mvc.xml

4.1 基础配置(@Configuration + @EnableWebMvc)

package com.example.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;/*** SpringMVC核心配置类*/
@Configuration // 标记为配置类
@EnableWebMvc // 开启SpringMVC注解驱动(替代<mvc:annotation-driven>)
@ComponentScan("com.example.controller") // 扫描Controller所在包
public class SpringMvcConfig implements WebMvcConfigurer {// 其他配置将在这里添加...
}

核心注解

  • @Configuration:标记该类为Spring配置类;
  • @EnableWebMvc:开启SpringMVC的注解支持(如@RequestMapping@Controller),自动注册处理器映射器和适配器;
  • @ComponentScan:扫描com.example.controller包下的@Controller注解类,注册为SpringBean。

4.2 配置视图解析器(JSP视图)

视图解析器用于将逻辑视图名(如"index")解析为物理视图路径(如/WEB-INF/views/index.jsp),配置InternalResourceViewResolver

/*** 配置JSP视图解析器*/
@Bean
public InternalResourceViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/"); // 视图前缀(JSP存放目录)resolver.setSuffix(".jsp"); // 视图后缀resolver.setViewClass(JstlView.class); // 支持JSTL表达式return resolver;
}

配置说明

  • 若返回逻辑视图名"index",视图解析器会拼接为/WEB-INF/views/index.jsp
  • JSP文件需放在src/main/webapp/WEB-INF/views/目录(需手动创建)。

4.3 配置静态资源处理

静态资源(CSS、JS、图片等)默认会被DispatcherServlet拦截,需通过WebMvcConfigureraddResourceHandlers方法放行:

/*** 配置静态资源映射(放行CSS、JS、图片等)*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {// 访问路径:/static/** → 映射到实际路径:/static/registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}

使用说明

  • src/main/webapp/目录下创建static文件夹,存放静态资源(如static/css/style.css);
  • 前端页面通过/static/css/style.css访问该资源,SpringMVC会正确映射到实际文件。

五、编写第一个Controller验证配置

配置完成后,编写一个简单的Controller测试是否生效。

5.1 创建Controller

package com.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;/*** 第一个Controller*/
@Controller // 标记为控制器
public class HelloController {/*** 处理GET请求:/hello*/@GetMapping("/hello")public String hello(Model model) {// 向视图传递数据model.addAttribute("message", "Hello SpringMVC!");// 返回逻辑视图名(由视图解析器解析为JSP)return "hello";}
}

5.2 创建JSP视图

src/main/webapp/WEB-INF/views/目录下创建hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>SpringMVC入门</title><!-- 引入静态资源(测试静态资源配置) --><link rel="stylesheet" href="/static/css/style.css">
</head>
<body><h1>${message}</h1> <!-- 显示Controller传递的message -->
</body>
</html>

创建静态资源src/main/webapp/static/css/style.css

h1 {color: blue;
}

六、启动应用并验证

6.1 启动Tomcat

通过Maven命令启动Tomcat插件:

mvn tomcat9:run

启动成功后,控制台会显示:

[INFO] tomcat9-maven-plugin starting...
[INFO] Server startup in [xxx] milliseconds

6.2 访问测试

打开浏览器,访问http://localhost:8080/hello

  • 页面显示Hello SpringMVC!(蓝色文字,说明CSS生效);
  • 若能正常显示,说明SpringMVC启动配置成功。

七、常见问题与排查

7.1 启动失败:找不到Controller

错误信息No mapping found for HTTP request with URI [/hello]

排查步骤

  1. 检查@ComponentScan的包路径是否正确(需包含Controller所在包,如com.example.controller);
  2. 确认@Controller@GetMapping注解是否正确添加;
  3. 检查SpringMvcConfig是否被MyWebAppInitializergetServletConfigClasses正确引用。

7.2 静态资源404(CSS/JS无法加载)

错误信息Failed to load resource: the server responded with a status of 404

排查步骤

  1. 确认addResourceHandlers配置是否正确(/static/**映射到/static/);
  2. 检查静态资源实际路径是否正确(如static/css/style.css是否存在);
  3. 前端引用路径是否正确(如href="/static/css/style.css",注意开头的/)。

7.3 中文乱码(POST请求参数)

问题:表单提交的中文参数显示为乱码。

排查步骤

  1. 检查getServletFilters是否配置了CharacterEncodingFilter,且setForceEncoding(true)
  2. 确认过滤器是否被正确注册(MyWebAppInitializergetServletFilters方法是否返回过滤器);
  3. 若使用Tomcat 8.0+,GET请求中文乱码需在Tomcat的server.xml中配置URIEncoding="UTF-8"(POST乱码由过滤器解决)。

总结:SpringMVC启动配置核心要点

SpringMVC基于Java的启动配置核心是“三个核心组件”:

  1. MyWebAppInitializer:替代web.xml,注册DispatcherServlet和过滤器,指定SpringMVC配置类;
  2. SpringMvcConfig:SpringMVC的核心配置,负责扫描Controller、配置视图解析器和静态资源;
  3. DispatcherServlet:由MyWebAppInitializer自动注册,作为请求入口,协调SpringMVC组件工作。

若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90027.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS水文及空间分析与SWMM融合协同在城市排水防涝领域中的应用

随着计算机的广泛应用和各类模型软件的发展&#xff0c;将排水系统模型作为城市洪灾评价与防治的技术手段已经成为防洪防灾的重要技术途径。将创新性融合地理信息系统&#xff08;GIS&#xff09;的空间分析能力与暴雨雨水管理模型&#xff08;SWMM&#xff09;的水动力计算优势…

PHICOMM(斐讯)N1盒子 - Armbian25.05(Debian 12)刷入U盘/EMMC

PHICOMM(斐讯)N1盒子 - Armbian25.05(Debian 12)刷入U盘/EMMC 文章目录PHICOMM(斐讯)N1盒子 - Armbian25.05(Debian 12)刷入U盘/EMMC前言1. 确保固件版本为2.192. 刷系统到U盘3. 启动U盘系统4. U盘系统写入EMMC5. 关机拨U盘6. 重新上电环境&#xff1a; 系统&#xff1a;Armbi…

《计算机网络基础知识全解析:从协议模型到通信实践》

《计算机网络基础知识全解析&#xff1a;从协议模型到通信实践》 在数字化时代&#xff0c;计算机网络是信息传递的基石&#xff0c;从日常浏览网页到企业数据交互&#xff0c;都离不开网络协议的规范与支撑。本文将系统梳理计算机网络的核心知识&#xff0c;从通信模型到具体协…

【补题】Codeforces Global Round 26 E. Shuffle

题意&#xff1a;给出一棵树&#xff0c;按照以下方式操作 对于当前的所有任意子树&#xff0c;选出任何一个点从中删除&#xff0c;然后作为新子树的根插入到新的树中&#xff0c;以此递归往复&#xff0c;直到原来的树中节点全部进入新树&#xff0c;问新树最多有多少个叶子节…

金仓数据库风云

O 记我用了这么多年&#xff0c;我最有发言权&#xff0c;我可不敢替&#xff0c;你们谁能搞定&#xff0c;谁上。” 老邓在会上&#xff0c;狠狠甩了一句气话。老邓&#xff08;邓铭&#xff09;&#xff0c;某大型期货交易所信息化主管&#xff0c;数据库老司机。 作为圈里最…

阿里云宝塔Linux面板相关操作记录

1、清空nginx缓存使用Nginx时&#xff0c;静态图片文件会出现缓存&#xff0c;所以需要清空缓存&#xff0c;方法如下&#xff1a;sudo rm -rf /www/server/nginx/proxy_cache_dir/*2、Windows启动spring boot jar脚本echo off setlocal enabledelayedexpansion:: 配置项目名 s…

Kotlin伴生对象

你已经知道如何为类创建单例对象&#xff08;singleton&#xff09;。不过&#xff0c;在很多情况下&#xff0c;你只需要为某个类维护一个单例&#xff0c;这时候使用类的完整名字会显得冗长。比如&#xff0c;你可能只需要存储一个公共的属性。这种情况下&#xff0c;可以用 …

4G车载录像机的作用详解:提升行车安全与智能管理的核心技术

1. 引言随着物流运输、公共交通、特种车辆等行业对安全与管理需求的提升&#xff0c;4G车载录像机已成为现代车辆智能化管理的重要组成部分。它不仅具备传统行车记录仪的录像功能&#xff0c;还结合4G无线通信、AI智能分析、GPS定位、云存储等技术&#xff0c;实现远程监控、实…

技术与情感交织的一生 (十)

目录 笑傲江湖 上 恨 嫌隙 挣扎 救难 论道 取巧 联手 入魔 决裂 治伤 聚气 倾心 笑傲江湖 上 恨 身边的许多朋友都是金庸武侠迷&#xff0c;我也是其中之一。有人说&#xff0c;我的技术像 “任我行” &#xff0c;“吸星大法” 学到最后显得不伦不类&#xf…

架构进阶——解读集团IT管控治理体系总体规划【附全文阅读】

集团IT管控治理体系正步入高质量发展阶段&#xff0c;旨在重塑信息化管理价值&#xff0c;解决集团化管理的核心挑战。首要问题是纵向与横向的协同管控&#xff0c;需明确各层级在集团战略决策中的角色与责任&#xff0c;促进跨部门、跨子公司的高效协同。高管激励机制与人才梯…

亚马逊自养号测评实战指南:从环境搭建到安全提排名

在亚马逊平台上&#xff0c;自养号测评系统的成败差异主要源于技术合规性、操作精细度和风控策略的差异。以下是关键因素的分析&#xff1a;&#x1f512; 一、环境隔离与伪装技术底层环境稳定性成功案例&#xff1a;采用独立服务器硬件参数伪装&#xff08;如唯一MAC地址、IME…

CSS中的transform

在 CSS 中&#xff0c;transform 是用于用于用于对元素进行几何变换的属性&#xff0c;可实现旋转、缩放、平移、倾斜等效果&#xff0c;且不会影响其他元素的布局&#xff08;不会触发重排&#xff09;。以下是其核心用法和特性&#xff1a; 1. 基本语法 element {transform: …

MyBatis拦截器插件:实现敏感数据字段加解密

文章目录一、写在前面二、编码实现1、注解2、拦截器插件3、配置插件4、实体类5、测试三、扩展1、优化点一、写在前面 日常开发中&#xff0c;经常有一些敏感数据&#xff0c;直接写入数据库的话&#xff0c;很容易泄露。 本文基于mybatis拦截器插件&#xff0c;实现敏感数据的…

C++_Hello算法_队列

队列&#xff08;queue&#xff09;是一种遵循先入先出规则的线性数据结构。顾名思义&#xff0c;队列模拟了排队现象&#xff0c;即新来的人不断加入队列尾部&#xff0c;而位于队列头部的人逐个离开。 如图 5-4 所示&#xff0c;我们将队列头部称为“队首”&#xff0c;尾部…

LeetCode 1.

问题描述 俩数之和&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。你可以按…

c练习-c基础

#include <stdio.h>int main() {//打印数组中的最大值int arr[10];int max,i;for (i 0; i < 10; i){scanf_s("%d", &arr[i]);}max arr[0];for (i 0; i < 10; i){if(max < arr[i 1]){max arr[i 1];}}printf("数组中最大值&#xff1a;%…

Numpy科学计算(五分钟小白从入门到精通)

2.1 numpy介绍numpy是Python中科学计算的基础包。它是一个Python库&#xff0c;提供多维数组对象、各种派生对象&#xff08;例如掩码数组和矩阵&#xff09;以及用于对数组进行快速操作的各种方法&#xff0c;包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅里叶变换、基…

从零掌握微服务通信安全:mTLS全解析

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 在云原生时代&#xff0c;微服务架构的普及带来了灵活性和可扩展性&#xff0c;但也让服务间通信的安全性成为核心挑战。mTLS&#xff08;Mutual TLS&…

Node.js net.Socket.destroy()深入解析

socket.destroy() 是 Node.js net 模块中用于强制销毁 TCP 套接字的方法&#xff0c;比 socket.end() 更彻底。下面我将从多个方面全面讲解这个方法。 基本用法 const net require(net);const server net.createServer((socket) > {// 强制销毁套接字socket.destroy(); })…

vmware 克隆虚拟机,报错:克隆时出错:指定不存在的设备。然后电脑卡死,只能强制关机再开机。

vmware 克隆虚拟机&#xff0c;报错&#xff1a;克隆时出错:指定不存在的设备。然后电脑卡死&#xff0c;只能强制关机再开机。1、问题描述2、问题原因3、解决方法1、问题描述 vmware 版本&#xff1a;vmware workstation pro 17.6.3 克隆虚拟机时&#xff0c;创建完整克隆&am…