实用指南:SpringMVC 进阶:核心组件详解与参数绑定全攻略

news/2025/10/24 10:58:36/文章来源:https://www.cnblogs.com/slgkaifa/p/19162669

实用指南:SpringMVC 进阶:核心组件详解与参数绑定全攻略

引言

上一篇我们通过 HelloWorld 案例入门了 SpringMVC,但实际开发中,你可能会遇到 “如何接收复杂参数?”“不同组件有哪些实现选择?” 等问题。本文将带你深入 SpringMVC 的核心组件,拆解其底层逻辑,并详细讲解 “参数绑定” 这一高频开发场景,帮你解决 80% 的日常开发需求。

一、SpringMVC 核心组件深度解析

上一篇提到 5 个核心组件,本节将聚焦 “最关键的 3 个组件”,讲解其实现类、配置方式及适用场景。

1. HandlerMapping:请求与 Controller 的 “桥梁”

HandlerMapping的作用是 “根据请求 URL 找到对应的 Controller 方法”,SpringMVC 提供了多种实现,最常用的有 2 种:

(1)RequestMappingHandlerMapping(推荐,注解驱动)

基于@RequestMapping注解实现,支持 URL、请求方法(GET/POST)、请求参数等多维度匹配,是 SpringMVC 3.1 + 的默认选择。无需手动配置:只要在spring-mvc.xml中开启 “注解驱动”(如下),Spring 会自动注册该组件:

xml


(2)BeanNameUrlHandlerMapping(传统,XML 配置)

基于 “Bean 名称” 映射请求,例如:

xml


适用场景:老项目维护,新项目优先用注解驱动。

2. HandlerAdapter:Controller 的 “执行者”

HandlerAdapter负责 “调用 Controller 方法”,并处理 “参数绑定、类型转换” 等前置工作。与HandlerMapping对应,常用实现类也分 2 种:

(1)RequestMappingHandlerAdapter(注解驱动配套)

RequestMappingHandlerMapping配对使用,支持@RequestMapping注解的 Controller 方法,自动处理参数绑定(如@RequestParam)、返回值解析(如ModelAndView)。无需手动配置:开启mvc:annotation-driven后自动注册。

(2)SimpleControllerHandlerAdapter(传统)

适配实现Controller接口的传统 Controller,例如:

java

运行

// 传统Controller(需实现Controller接口)
public class UserController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mv = new ModelAndView();mv.addObject("msg", "传统Controller");mv.setViewName("user/list");return mv;}
}

缺点:一个 Controller 只能处理一个请求,灵活性低,新项目不推荐。

3. ViewResolver:视图的 “定位器”

ViewResolver负责 “将视图名解析为实际视图对象”,常用实现类有 3 种,覆盖 JSP、Thymeleaf 等主流视图技术:

(1)InternalResourceViewResolver(JSP 视图,最常用)

解析 JSP 文件,配置方式如下(上一篇已用过):

xml

   

逻辑:若 Controller 返回视图名"user/list",则解析为/WEB-INF/views/user/list.jsp

(2)ThymeleafViewResolver(Thymeleaf 视图)

若项目用 Thymeleaf 替代 JSP,需配置该解析器(需导入 Thymeleaf-Spring 依赖):

xml


org.thymeleafthymeleaf-spring53.1.2.RELEASE
 



  
(3)FreeMarkerViewResolver(FreeMarker 视图)

类似 Thymeleaf,适用于 FreeMarker 模板引擎,配置逻辑一致,此处不展开。

二、参数绑定全攻略:接收请求参数的 9 种场景

“参数绑定” 是 SpringMVC 接收前端请求参数的核心能力,支持基本类型、对象、集合等多种场景,以下按 “常用程度” 排序讲解。

1. 场景 1:基本类型参数(int、String、boolean 等)

直接在 Controller 方法中声明参数,SpringMVC 会自动匹配请求参数名与方法参数名(大小写敏感)。

示例 1:接收单个参数
  • 请求 URL:http://localhost:8080/springmvc/user/query?id=1
  • Controller 方法:

java

运行

@RequestMapping("/user/query")
public String queryUser(int id) { // 参数名id与请求参数id一致System.out.println("查询用户ID:" + id);return "user/info";
}
示例 2:用 @RequestParam 指定参数名(参数名不一致时)

若请求参数名是userId,但方法参数名是id,需用@RequestParam映射:

java

运行

@RequestMapping("/user/query")
// required=true(默认):表示该参数必须传;defaultValue:默认值
public String queryUser(@RequestParam(name = "userId", required = true) int id) {System.out.println("查询用户ID:" + id);return "user/info";
}

2. 场景 2:POJO 对象参数(实体类参数)

若请求参数较多(如用户注册:姓名、年龄、邮箱),可将参数封装为 POJO 类,SpringMVC 会自动将请求参数注入到 POJO 的属性中(要求:POJO 属性名与请求参数名一致)。

示例:接收用户注册参数
    1. 定义 POJO 类User

java

运行

public class User {private String username;private Integer age;private String email;// 必须有默认无参构造器(SpringMVC反射创建对象)// Getter和Setter方法(必须,SpringMVC通过Setter注入参数)public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }// 其他Getter/Setter省略...
}
    1. Controller 方法:

java

运行

@RequestMapping("/user/register")
public String register(User user) { // 直接接收User对象System.out.println("用户名:" + user.getUsername());System.out.println("年龄:" + user.getAge());return "success";
}
    1. 前端请求(表单示例):

html

预览

用户名:
年龄:
邮箱:

3. 场景 3:嵌套 POJO 参数(如用户 - 地址)

若 POJO 中包含另一个 POJO(如User包含Address),请求参数名需用 “.” 分隔层级。

示例:
    1. 定义Address类:

java

运行

public class Address {private String province;private String city;// Getter/Setter省略
}
    1. 改造User类,添加Address属性:

java

运行

public class User {private String username;private Address address; // 嵌套POJO// Getter/Setter省略
}
    1. 前端表单参数名:

html

预览


地址-省份:
地址-城市:

4. 场景 4:集合参数(List、Map)

接收多个同类型参数(如批量删除用户 ID),需将集合封装到 POJO 中(直接接收 List 需特殊处理)。

示例 1:List 参数(批量删除)
    1. 定义 POJOUserList

java

运行

public class UserList {private List ids; // 存储多个用户ID// Getter/Setter省略
}
    1. Controller 方法:

java

运行

@RequestMapping("/user/batchDelete")
public String batchDelete(UserList userList) {System.out.println("批量删除ID:" + userList.getIds()); // 如[1,2,3]return "success";
}
    1. 前端表单(参数名用ids[0]ids[1]):

html

预览


用户1
用户2
用户3
示例 2:Map 参数(灵活键值对)
    1. 定义 POJOUserMap

java

运行

public class UserMap {private Map userInfo; // key=参数名,value=参数值// Getter/Setter省略
}
    1. 前端表单参数名(用userInfo['key']):

html

预览



5. 场景 5:@PathVariable(URL 路径参数)

用于接收 URL 路径中的参数(如 RESTful 风格的/user/1中的1),示例:

  • 请求 URL:http://localhost:8080/springmvc/user/1
  • Controller 方法:

java

运行

// @PathVariable("id"):将URL中的{id}绑定到方法参数id
@RequestMapping("/user/{id}")
public String getUserById(@PathVariable("id") Integer id) {System.out.println("RESTful风格:查询用户ID=" + id);return "user/info";
}

6. 场景 6:@RequestBody(接收 JSON 参数)

前后端分离项目中,前端常发送 JSON 格式的请求体,需用@RequestBody接收(需开启mvc:annotation-driven,SpringMVC 会自动用 Jackson 解析 JSON)。

示例:
    1. 导入 Jackson 依赖(pom.xml):

xml

com.fasterxml.jackson.corejackson-databind2.15.2
    1. Controller 方法:
// @RequestBody:将请求体的JSON解析为User对象
@RequestMapping(value = "/user/add", method = RequestMethod.POST)
@ResponseBody // 表示返回JSON(下一篇讲)
public String addUser(@RequestBody User user) {System.out.println("新增用户:" + user.getUsername());return "success";
}
    1. 前端发送 JSON 请求(Axios 示例):
axios.post('/springmvc/user/add', {username: '李四',age: 25,email: 'lisi@xxx.com'
}).then(res => {console.log(res.data);
});

7. 特殊场景:日期类型参数绑定

SpringMVC 默认不支持java.util.Date类型的参数绑定,需自定义类型转换器或用@DateTimeFormat注解。

示例:用 @DateTimeFormat 指定日期格式

@RequestMapping("/order/query")
public String queryOrder(@DateTimeFormat(pattern = "yyyy-MM-dd") Date orderDate) {System.out.println("订单日期:" + orderDate);return "order/list";
}
  • 请求参数:http://localhost:8080/springmvc/order/query?orderDate=2024-05-20

三、参数绑定常见问题与解决方案

  1. 中文乱码问题:原因:Tomcat 默认编码是 ISO-8859-1,无法处理中文;解决方案:在web.xml中配置编码过滤器(必须放在所有过滤器之前):

    characterEncodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8forceEncodingtrue 
    
    characterEncodingFilter/*
    
  2. 参数类型不匹配(400 错误):原因:请求参数类型与方法参数类型不匹配(如传字符串 “abc” 给 int 类型);解决方案:前端确保参数类型正确,或后端用@RequestParam(required = false)允许参数为空,并添加参数校验。

  3. List 参数无法直接接收:原因:SpringMVC 不支持直接将请求参数绑定到 List(需封装到 POJO);解决方案:参考 “场景 4”,将 List 封装到 POJO 中,或用@RequestBody接收 JSON 格式的 List。

四、进阶小结

  1. 核心组件选择:新项目优先用mvc:annotation-driven开启注解驱动,无需手动配置 HandlerMapping 和 HandlerAdapter;
  2. 参数绑定口诀:
    • 简单参数用@RequestParam,路径参数用@PathVariable
    • 多参数用 POJO,嵌套参数用 “.”;
    • JSON 参数用@RequestBody,日期参数加@DateTimeFormat
  3. 下一篇预告:SpringMVC 实战整合 MyBatis,实现完整的 CRUD 功能,带你打通 “前端 - Controller-Service-DAO - 数据库” 全链路。

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

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

相关文章

2025年口碑好的塑料中空板,中空板,PP塑料中空板厂家最新推荐榜

2025年口碑好的塑料中空板,中空板,PP塑料中空板厂家最新推荐榜行业概述塑料中空板作为一种新型环保材料,凭借其轻质、高强度、耐腐蚀、防潮防水、可回收等优异特性,在包装、广告、建筑、物流等多个领域得到广泛应用。…

2025年优质的机械修复冷焊机,模具冷焊机厂家推荐及选择指南

2025年优质的机械修复冷焊机,模具冷焊机厂家推荐及选择指南行业概述机械修复冷焊机和模具冷焊机作为现代工业维修领域的重要设备,在模具修复、机械零件修补、表面强化等方面发挥着不可替代的作用。随着制造业的持续发…

2025 年热熔胶源厂家最新推荐排行榜:书刊装订 / 珍珠棉 / 纸箱包装 / 环保 / 书本等领域优质品牌及实用选购指南

引言 2025 年热熔胶行业竞争愈发激烈,为帮助下游企业精准选购,中国胶粘剂工业协会联合专业检测机构开展了热熔胶品牌测评工作。本次测评覆盖国内 120 余家热熔胶源厂家,采用 “性能检测 + 市场口碑 + 服务能力” 三…

2025年专业的锐钛型纳米二氧化钛,光学玻璃纳米二氧化钛,纳米二氧化钛最新TOP厂家推荐

2025年专业的锐钛型纳米二氧化钛,光学玻璃纳米二氧化钛,纳米二氧化钛最新TOP厂家推荐纳米二氧化钛行业概述纳米二氧化钛作为一种重要的无机功能材料,凭借其优异的光催化性能、紫外线屏蔽特性、化学稳定性和无毒环保等…

AI状态机等

AI状态机等实现方式​​:通过 UEnum定义状态,结合 Switch分支或状态机组件(如 GameplayTask)。 ​​应用场景​​:角色行为:切换 Idle/Run/Attack 状态。 AI 决策:巡逻、追击、攻击等状态动态切换。

2025年评价高的气压组合农用榨油机,一体式农用榨油机,电加热农用榨油机,圆排农用榨油机最新TOP厂家推荐

2025年评价高的气压组合农用榨油机,一体式农用榨油机,电加热农用榨油机,圆排农用榨油机最新TOP厂家推荐行业概述随着农业机械化的不断推进和食用油加工行业的蓬勃发展,农用榨油机作为油料作物加工的核心设备,其市场需…

Inno Setup v6.5.3 安装包制作和打包程序免安装汉化版

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年10月水性有机硅面漆供货厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析

随着环保要求日益严格,水性有机硅面漆凭借其低VOC排放、优异耐候性和环保特性,在工业防护、建筑装饰等领域应用持续扩大。本文基于行业调研数据,从专利技术、品质管控体系及知名客户合作案例等维度,对水性有机硅面…

2025年评价高的土工布土工膜,水利工程土工布土工膜,隧道防水土工布土工膜厂家推荐及采购指南

2025年评价高的土工布土工膜,水利工程土工布土工膜,隧道防水土工布土工膜厂家推荐及采购指南开篇介绍在基础设施建设、水利工程、环境治理等领域,土工布和土工膜作为重要的工程材料,其质量直接关系到工程的安全性和使…

2025年质量好的改性沥青设备厂家最新推荐榜

2025年质量好的改性沥青设备厂家最新推荐榜 在公路建设、市政工程及基础设施维护领域,改性沥青设备的质量直接影响工程效率与道路使用寿命。随着技术进步和环保要求提升,2025年市场对高性能、智能化沥青设备的需求显…

通过 MediaPlayerFacade简化复杂子系统调用

通过 MediaPlayerFacade简化复杂子系统调用​​实现方式​​:通过 MediaPlayerFacade简化复杂子系统调用。 ​​应用场景​​:视频播放:统一接口管理解码、渲染、同步等底层逻辑。 多媒体模块:隐藏不同格式视频的解…

2025年靠谱的玻璃钢储罐实力源头加工

2025年靠谱的玻璃钢储罐实力源头加工企业推荐玻璃钢储罐行业概述玻璃钢储罐作为一种轻质高强、耐腐蚀性能优异的复合材料制品,在化工、环保、水处理等领域应用广泛。随着2025年新材料产业规划的推进,玻璃钢储罐行业将…

2025 年最新推荐!国内优质冷链 + 仓储物流公司排行榜:聚焦无锡热门线路,精选标杆企业无锡到郑州 / 无锡到上海物流公司推荐

引言 在当下复杂的供应链环境中,冷链运输与仓储服务的质量直接关系到商品价值的保全与市场流通效率,尤其对于无锡至西安、太原、宁波、郑州、上海等热门物流线路而言,优质服务商的选择更是企业与个人降低损耗、控制…

通过接口转换兼容不同模块的数据格式

通过接口转换兼容不同模块的数据格式实现方式​​:通过接口转换兼容不同模块的数据格式。 ​​应用场景​​:第三方库集成:将外部 SDK 数据转换为 UE5 内部格式。 跨平台输入:适配不同设备的按键/触控事件。​​优…

2025年靠谱的红木家具定制定做

2025年靠谱的红木家具定制定做指南:精选5家高口碑厂商推荐 红木家具以其独特的文化底蕴、精湛的工艺和保值增值的特性,成为高端家居市场的宠儿。2025年,随着消费者对品质与个性化需求的提升,定制红木家具成为趋势…

枚举图中所有边求解次短路的思路

算不上是一种统一的算法,大体思路如下: 1.两遍dij跑1,n两个点的单源最短路,同时维护pre数组存最短路 2.枚举任意两点u,v,通过pre数组确认不是最短路上相邻两点后,更新dis1[u]+disn[v]+d[u][v]是否是次短路 不加堆…

2025年知名的PPH储罐实力源头加工

2025年知名的PPH储罐实力源头加工企业推荐在工业设备制造领域,PPH储罐因其优异的耐腐蚀性、高强度和使用寿命长等特点,已成为化工、环保、制药等行业不可或缺的关键设备。随着2025年的临近,PPH储罐市场需求持续增长…

消息中间件(Leo)

消息中间件 知识框架RabbitMQ RabbitMQ如何保证消息不丢失?第一个是开启生产者确认机制,确保生产者的消息能到达队列,如果报错可以先记录到日志中,再去修复数据 第二个是开启持久化功能,确保消息未消费前在队列中…

使用 UFactory基类或 CreateDefaultSubobject()动态生成对象

使用 UFactory基类或 CreateDefaultSubobject()动态生成对象实现方式​​:使用 UFactory基类或 CreateDefaultSubobject()动态生成对象。 ​​应用场景​​:动态生成敌人:根据配置生成 AZombie或 ADemon。 武器系统…

2025年诚信的在线压花机,工具房压花机,木塑压花机,离线压花机厂家推荐及采购指南

2025年诚信的在线压花机、工具房压花机、木塑压花机、离线压花机厂家推荐及采购指南 开篇介绍 随着工业制造技术的不断发展,压花机在板材加工、木塑复合材料、金属装饰等领域的需求日益增长。无论是在线压花机、离线…