005 参数绑定处理

文章目录

    • 参数绑定
    • 默认支持的参数类型
    • 参数绑定使用要求
      • 简单类型
        • RequestParam注解
      • 绑定POJO类型
      • 绑定集合或者数组类型
    • 参数绑定示例
      • JSP代码
      • Controller代码
      • PO代码
    • 自定义日期参数绑定
      • Converter代码
      • Converter配置
    • 文件类型参数绑定
      • 加入依赖包
      • 上传页面
      • 配置Multipart解析器
      • Controller类代码

参数绑定

  • 什么是参数绑定

就是将请求参数串中的value值获取到之后,再进行类型转换,然后将转换后的值赋值给Controller
类中方法的形参,这个过程就是参数绑定。
总结参数绑定需要两步:
–类型转换(请求中的String类型值—>Controller各种数据类型的方法形参)
–赋值操作,将转换之后的值赋值给Controller方法形参

  • 请求参数格式

默认是key/value格式,比如: http://XXXXX?id=1&type=301

  • 请求参数值的数据类型

都是String类型的各种值

  • 请求参数值要绑定的目标类型

Controller类中的方法参数,比如简单类型、POJO类型、集合类型等

  • SpringMVC内置的参数解析组件

默认内置了24种参数解析组件(ArgumentResolver)

默认支持的参数类型

Controller方法形参中可以随时添加如下类型的参数(Servlet API支持),处理适配器会自动识别并进行赋值

  • HttpServletRequest

通过 request 对象获取请求信息

  • HttpServletResponse

通过 response 处理响应信息

  • HttpSession

通过 session 对象得到 session 中存放的对象

  • InputStream、OutputStream
  • Reader、Writer
  • Model/ModelMap

ModelMap 继承自 LinkedHashMap ,Model是一个接口,它们的底层实现都是同一个类
( BindingAwareModelMap ),作用就是向页面传递数据,相当于 Request 的作用,如下:

model.addAttribute("msg", “测试springmvc”);

参数绑定使用要求

简单类型

  • 直接绑定

http请求参数的【key】和controller方法的【形参名称】一致

  • 注解绑定

请求参数的【key】和controller方法的【形参名称】不一致时,需要使用【@RequestParam】注解才能将请求参数绑定成功。

RequestParam注解
  • value:

参数名字,即入参的请求参数名字,如value=“itemid”表示请求的参数中的名字为itemid的参数的值将传入

  • required:

是否必须,默认是true,表示请求中一定要有相应的参数,否则将报;
TTP Status 400 - Required Integer parameter ‘XXXX’ is not present

  • defaultValue:

默认值,表示如果请求中没有同名参数时的默认值

绑定POJO类型

要求表单中【参数名称】和Controller方法中的【POJO形参的属性名称】保持一致。

绑定集合或者数组类型

  • 简单类型数组

通过HTTP请求批量传递简单类型数据的情况,Controller方法中可以用String[]或者pojo的String[]属性接收(两种方式任选其一),但是不能使用List集合接收。

  • POJO类型集合或者数组

批量传递的请求参数,最终要使用List来接收,那么这个List必须放在另一个POJO类中。

参数绑定示例

JSP代码


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>参数绑定演示demo</title>
</head>
<body>
<!-- request请求的内容类型主要分为:K/V类型、Multipart类型、JSON类型 -->
<!-- 将request请求参数,绑定到简单类型(基本类型和String类型)方法参数 -->
<!-- 直接绑定 -->
<a href="${pageContext.request.contextPath}/user/findUserById?
id=1&name=bingbing">查询用户1</a>
<!-- @RequestParam注解绑定 -->
<a href="${pageContext.request.contextPath}/user/findUserById2?uid=1">查询用
户2</a>
<!-- 将request请求参数,绑定到POJO类型(简单POJO和包装POJO的)方法参数 -->
<form action="${pageContext.request.contextPath}/user/saveUser"
method="post">
用户名称:<input type="text" name="username"><br />
用户性别:<input type="text" name="sex"><br />
所属省份:<input type="text" name="address.provinceName"><br />
所属城市:<input type="text" name="address.cityName"><br />
<input type="submit" value="保存">
</form>
<!-- 将request请求参数,绑定到[元素是简单类型的集合或数组]参数 -->
<!-- 使用数组接收 -->
<a href="${pageContext.request.contextPath}/user/findUserByIds?
id=1&id=2&id=3">根据ID批量删除用户</a>
<!-- 使用List接收(错误示例) -->
<a href="${pageContext.request.contextPath}/user/findUserByIds2?
id=1&id=2&id=3">根据ID批量删除用户</a>
<!-- 使用Bean的List属性接收 -->
<a href="${pageContext.request.contextPath}/user/findUserByIds3?
uid=1&uid=2&uid=3">根据ID批量删除用户</a>
<!-- 将request请求参数,绑定到[元素是POJO类型的List集合或Map集合]参数 -->
<form action="${pageContext.request.contextPath}/user/updateUser"
method="post">
用户名称:<input type="text" name="username"><br />
用户性别:<input type="text" name="sex"><br />
<!-- itemList[集合下标]:集合下标必须从0开始 -->
<!-- 辅助理解:先将name属性封装到一个Item对象中,再将该Item对象放入itemList集合的
指定下标处 -->
购买商品1名称:<input type="text" name="itemList[0].name"><br />
购买商品1价格:<input type="text" name="itemList[0].price"><br />
购买商品2名称:<input type="text" name="itemList[1].name"><br />
购买商品2价格:<input type="text" name="itemList[1].price"><br />
<!-- itemMap['item3']:其中的item3、item4就是Map集合的key -->
<!-- 辅助理解:先将name属性封装到一个Item对象中,再将该Item对象作为value放入
itemMap集合的指定key处 -->
购买商品3名称:<input type="text" name="itemMap['item3'].name"><br />
购买商品3价格:<input type="text" name="itemMap['item3'].price"><br />
购买商品4名称:<input type="text" name="itemMap['item4'].name"><br />
购买商品4价格:<input type="text" name="itemMap['item4'].price"><br />
<input type="submit" value="保存">
</form>
<!-- 将request请求参数,绑定到Date类型方法参数 -->
<!-- 请求参数是:【年月日】 格式 -->
<a href="${pageContext.request.contextPath}/user/deleteUser?birthday=2018-
01-01">根据日期删除用户(String)</a>
<!-- 请求参数是:【年月日 时分秒】 格式 -->
<a href="${pageContext.request.contextPath}/user/deleteUser2?birthday=2018-
01-01 12:10:33">根据日期删除用户(Date)</a>
<!-- 文件类型参数绑定 -->
<form action="${pageContext.request.contextPath}/fileupload" method="post"
enctype="multipart/form-data">
图片:<input type="file" name="uploadFile" /><br />
<input type="submit" value="上传" />
</form>
</body>
</html>

Controller代码


/**
* 用来学习参数绑定
*
*/
@RequestMapping("user")
@Controller
public class UserController {
@RequestMapping("findUserById")
public String findUserById(Integer id,Model model,HttpServletRequest
request) {
model.addAttribute("msg", "直接参数绑定接收到的参数:"+id);
model.addAttribute("msg", "通过Request getParameter参数接收到的参
数:"+request.getParameter("id"));
return "success";
}
// @RequestParam:可以理解为request.getParameter("参数key")
@RequestMapping("findUserById2")
public String findUserById2(@RequestParam("uid") Integer id,Model model) {
model.addAttribute("msg", "接收到的参数:"+id);
return "success";
}
@RequestMapping("saveUser")
public String saveUser(User user,Model model) {
model.addAttribute("msg", "接收到的参数:"+user.toString());
return "success";
}
@RequestMapping("deleteUser")
public String deleteUser(String birthday,Model model) {
model.addAttribute("msg", "接收到的参数:"+birthday);
return "success";
}
@RequestMapping("deleteUser2")
public String deleteUser2(Date birthday,Model model) {
model.addAttribute("msg", "接收到的参数:"+birthday);
return "success";
}
@RequestMapping("findUserByIds")
public String findUserByIds(Integer[] id,Model model) {
model.addAttribute("msg", "接收到的参数:"+id);
return "success";
}
@RequestMapping("findUserByIds2")
public String findUserByIds2(List<Integer> id,Model model) {
model.addAttribute("msg", "接收到的参数:"+id);
return "success";
}
@RequestMapping("findUserByIds3")
public String findUserByIds3(User user,Model model) {
model.addAttribute("msg", "接收到的参数:"+user.getUid());
return "success";
}
@RequestMapping("updateUser")
public String updateUser(User user,Model model) {
model.addAttribute("msg", "接收到的参数:"+user.getUid());
return "success";
}
}

PO代码


public class User {
private int id;
private String username;
private Date birthday;
private String sex;
// 演示包装POJO参数绑定
private Address address;
// 演示批量简单类型参数接收
private List<Integer> uid = new ArrayList<>();
// 将request请求参数,绑定到[元素是POJO类型的List集合]参数
private List<Item> itemList = new ArrayList<>();
// 将request请求参数,绑定到[元素是POJO类型的Map集合]参数
private Map<String, Item> itemMap = new HashMap<>();
//setter/getter方法
}

自定义日期参数绑定

对于springmvc无法解析的参数绑定类型,比如[年月日时分秒格式的日期]绑定到Date类型会报错,此时需
要自定义[参数转换器]进行参数绑定。

Converter代码


public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
return simpleDateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}

Converter配置


<!-- 加载注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 转换器配置 -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean
">
<property name="converters">
<set>
<bean class="com.ssm.controller.converter.DateConverter"/>
</set>
</property>
</bean>

文件类型参数绑定

SpringMVC 文件上传的实现,是由 commons-fileupload 这个第三方jar包实现的。

加入依赖包


<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>

上传页面

JSP中的form表单需要指定enctype=”multipart/form-data”

配置Multipart解析器

在 springmvc.xml 中配置 multipart 类型解析器:

<!-- multipart类型解析器,文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件的最大尺寸 5M-->
<property name="maxUploadSize" value="5242880"/>
</bean>

Controller类代码


@RequestMapping("fileupload")
public String findUserById(MultipartFile uploadFile) throws Exception {
// 编写文件上传逻辑(mvc模式和三层结构模式)
// 三层模式:表现层(controller、action)、业务层(service、biz)、持久层(dao、
mapper)
// MVC模式主要就是来解决表现层的问题的(原始的表现层是使用Servlet编写,即编写业务逻
辑,又编写视图展示)
if (uploadFile != null) {
System.out.println(uploadFile.getOriginalFilename());
// 原始图片名称
String originalFilename = uploadFile.getOriginalFilename();
// 如果没有图片名称,则上传不成功
if (originalFilename != null && originalFilename.length() > 0) {
// 存放图片的物理路径
String picPath = "E:\\";
// 获取上传文件的扩展名
String extName =
originalFilename.substring(originalFilename.lastIndexOf("."));
// 新文件的名称
String newFileName = UUID.randomUUID() + extName;
// 新的文件
File newFile = new File(picPath + newFileName);
// 把上传的文件保存成一个新的文件
uploadFile.transferTo(newFile);
// 同时需要把新的文件名更新到数据库中
}
}
return "文件上传成功";
}

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

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

相关文章

thymeleaf+mybatis(本文章用于期末考前10分钟速看)

期末速看 pom&#xff08;了解&#xff09;application.propertiessql代码Controller控制层视图service&#xff1a; 服务层mapper&#xff08;dao&#xff09;&#xff1a;持久层entity层(model层&#xff0c;domain层、 bean)&#xff1a;对应数据库表&#xff0c;实体类 效果…

谈谈你对AQS的理解

AQS概述 AQS&#xff0c;全称为AbstractQueuedSynchronizer&#xff0c;是Java并发包&#xff08;java.util.concurrent&#xff09;中一个核心的框架&#xff0c;主要用于构建阻塞式锁和相关的同步器&#xff0c;也是构建锁或者其他同步组件的基础框架。AQS提供了一种基于FIF…

模拟城市5: 未来之城 全DLC for Mac 下载安装包

模拟城市5&#xff1a;未来之城&#xff08;SimCity BuildIt&#xff09;是一款由Maxis开发并由 Electronic Arts&#xff08;EA&#xff09;发行的城市建设和管理模拟游戏。这款游戏最初在2014年发布&#xff0c;适用于iOS、Android以及Windows Phone平台&#xff0c;随后在20…

力扣最新详解5道题:两数之和三数之和四数之和

目录 一、查找总价格为目标值的两个商品 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;对撞指针 二、两数之和 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;哈希表法 三、三数之和 题目 题解 方法一&#xff1a;排序暴力枚举set去重 …

数据资产治理的智能化探索:结合云计算、大数据、人工智能等先进技术,探讨数据资产治理的智能化方法,为企业提供可靠、高效的数据资产解决方案,助力企业提升竞争力

一、引言 在信息化时代&#xff0c;数据已成为企业最重要的资产之一。随着云计算、大数据、人工智能等先进技术的飞速发展&#xff0c;数据资产治理面临着前所未有的机遇与挑战。本文旨在探讨如何结合这些先进技术&#xff0c;实现数据资产治理的智能化&#xff0c;为企业提供…

【活动感想】筑梦之旅·AI共创工坊 workshop 会议回顾

目录 &#x1f30a;1. 会议详情 &#x1f30a;2. 会议回顾 &#x1f30d;2.1 主持人开场 &#x1f30d;2.2 元甲-小当家 AI 驱动的创意儿童营养早餐料理机&今天吃什么App &#x1f30d;2.3 Steven- A l 心理疗愈认知 &#x1f30d;2.4 伯棠-诸子百家(xExperts)-多智能…

C++ 文件读写

目录 一、XML文件读写 1、写入XML文件 2、读取XML文件 二、JSON文件读写 1、写入JSON文件 2、读取JSON文件 3、写入JSON文件 4、读取JSON文件 三、CSV文件读写 1、写入CSV文件 2、读取CSV文件 四、Excel文件读写 1、写入Excel文件 2、读取Excel文件 五、INI文件读…

转盘输入法-总

序 转盘输入法&#xff0c;给你的聊天加点新意。它不用常见的九宫格或全键盘&#xff0c;而是把字母摆在圆盘上&#xff0c;一滑一滑&#xff0c;字就出来了&#xff0c;新鲜又直接。 PC屏幕键盘的对比 鉴于屏幕键盘这一新颖界面的局限性&#xff0c;当用户在操作时&#xff…

015、HBase分布式数据库与传统数据库的深度对比

目录 HBase分布式数据库与传统数据库的深度对比 1. 数据模型 1.1 传统关系型数据库 1.2 HBase 2. 扩展性 2.1 传统关系型数据库 2.2 HBase 3. 查询语言 3.1 传统关系型数据库 3.2 HBase 4. 事务支持 4.1 传统关系型数据库 4.2 HBase 5. 数据一致性 5.1 传统关系型…

STM32 HAL库里 串口中断回调函数是在怎么被调用的?

跟着正点原子学习的HAL库写串口接收程序的时候一直有困惑&#xff0c;使用HAL_UART_Receive_IT开启接收中断后&#xff0c;为啥处理函数要写在HAL_UART_RxCpltCallback里&#xff0c;中断发生的时候是怎么到这个回调函数里去的&#xff1f; void MX_USART1_UART_Init(void) {h…

Elasticsearch环境搭建|ES单机|ES单节点模式启动|ES集群搭建|ES集群环境搭建

文章目录 版本选择单机ES安装与配置创建非root用户导入安装包安装包解压配置JDK环境变量配置single-node配置JVM参数后台启动|启动日志查看启动成功&#xff0c;访问终端访问浏览器访问 Kibana安装修改配置后台启动|启动日志查看浏览器访问 ES三节点集群搭建停止es服务域名配置…

C++面试题精选-2024/06/26

堆分配会比栈快吗 堆分配和栈分配在速度上并不直接可比,因为它们服务于不同的目的和场景,具有不同的特性和优势。以下是关于堆分配和栈分配速度方面的详细分析: 数据结构: 栈是一种线性数据结构,遵循先进后出(LIFO)的原则。堆则是一种树状的数据结构,允许随机插入和删…

【SGX系列教程】(二)第一个 SGX 程序: HelloWorld,linux下运行

文章目录 0. SGX基础原理分析一.准备工作1.1 前提条件1.2 SGX IDE1.3 基本原理 二.程序设计2.1 目录结构2.2 源码设计2.2.1 Encalve/Enclave.edl:Enclave Description Language2.2.2 Enclave/Enclave.lds: Enclave linker script2.2.3 Enclave/Enclave.config.xml: Enclave 配置…

Elasticsearch 管道聚合:组合多个聚合

在Elasticsearch中&#xff0c;聚合&#xff08;Aggregations&#xff09;是处理和分析大量数据的关键工具。通过聚合&#xff0c;我们可以从海量的数据中提取出有价值的统计信息&#xff0c;如最大值、最小值、平均值、总和等。然而&#xff0c;有时单一聚合无法满足我们复杂的…

C语言之字符串存储差异分析

C语言之字符串存储差异分析 字符串字符串字面量字符数组动态分配字符串 结语 字符串 在C语言中&#xff0c;可以使用多种方式来创建字符串。但是&#xff0c;不同创建方式之间的区别&#xff0c;你了解么&#xff1f;。 字符串字面量 C语言 -- 字符串字面量创建方式 char *s…

Games101学习笔记 Lecture 14: Ray Tracing 2 (Acceleration Radiometry)

Lecture 14: Ray Tracing 2 (Acceleration & Radiometry 一、加速光线追踪 AABB1.均匀网格 Uniform Spatial Partitions (Grids)①前处理-构建加速网格②射线与场景相交③网格分辨率④适用情况 2.空间划分KD-Tree①预处理②数据结构③遍历④问题 3.对象划分 & 包围盒层…

Lua: 轻量级多用途脚本语言

Lua 是一种高效而轻量级的脚本语言&#xff0c;具备强大的扩展性和灵活性&#xff0c;广泛应用于游戏开发、嵌入式系统、Web 应用等多个领域。本文将深入探讨 Lua 的特性、应用场景以及如何使用 Lua 进行开发。 1. Lua 的起源与发展 Lua 的发展始于上世纪90年代初&#xff0c;…

【微代码】Linux同步机制complete基本用法,以及如何封装一个内核态sleep的工具函数ksleep?

文章目录 背景基本代码和用法内核态sleep效果其他 背景 Linux提供了多种同步机制&#xff0c;其中complete就是一种。complete能够阻塞等待状态同步&#xff0c;并且等待对方释放中会调用schedule让出CPU。如果想在内核中等待一个固定时长继续执行他是一个非常不错的选择。有点…

为什么明明引入依赖了却总是爆红说不认识?

把maven中的依赖部分dependencies删掉&#xff0c;重新刷新一遍&#xff0c;再粘贴回去&#xff0c;重新刷新一遍就可以了

Spark SQL----分布式SQL引擎

Spark SQL----分布式SQL引擎 一、运行Thrift JDBC/ODBC服务器二、运行Spark SQL CLI2.1 Spark SQL命令行选项2.2 hiverc文件2.3 路径的说明2.4 支持的注释类型2.5 Spark SQL CLI交互式Shell命令2.6 例子 Spark SQL还可以使用JDBC/ODBC或命令行接口充当分布式查询引擎。在这种模…