当前位置: 首页 > news >正文

springMVC前后端请求参数绑定和传递

目录

请求参数的绑定

当绑定参数是基本数据类型和字符串类型时,要注意:

当绑定参数是实体类型(JavaBean)要注意:

给集合属性数据封装,要注意:

绑定参数是日期类型,如何封装:

代码实例:

实体类1:

实体类2:

controller类:

日期自定义类型转换器

springMVC.xml

web.xml

index.jsp

suc.xml


请求参数的绑定

请求参数的绑定要求:提交表单的name和参数的名称是相同的

请求参数支持的数据类型:

  • 基本数据类型和字符串类型
  • 实体类型(JavaBean)
  • 集合数据类型(List、map集合等)

当绑定参数是基本数据类型和字符串类型时,要注意:

  1. 提交表单的name和参数的名称是相同的
  2. 区分大小写

当绑定参数是实体类型(JavaBean)要注意:

  1. 提交表单的name和JavaBean中的属性名称需要一致
  2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name

给集合属性数据封装,要注意:

JSP页面编写方式:list[0].属性

绑定参数是日期类型,如何封装:

系统默认格式为:2024/7/18,其他格式系统无法识别

1、要想改变输入日期格式,在实体类相关属性private Date birthday; 上面加注解

@DateTimeFormat(pattern = "yyyy-dd-mm") 指定输入日期的格式

然后在springMVC.xml文件里加上

<!--让映射器、适配器和处理器生效(默认不配置也是可以的)-->
<mvc:annotation-driven conversion-service="conversionService"/>

此时那个注解才能生效

2、自定义类型转换器

第一步:可以实现Converter的接口,实现自定义类型转换器

public class StringToDate implements Converter<String,Date> {/*** 进行类型转换的方法* @param s     用户输入的内容* @return*/
//    @Overridepublic Date convert(String s) {// 判断if(s == null){throw new RuntimeException("请输入内容");}// 进行转换SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");try {// 进行转换return sdf.parse(s);} catch (ParseException e) {throw new RuntimeException(e);}}
}

第二步:在springMVC.xml文件里配置日期类型转换器

<!--配置日期类型转换器,类型转换器的组件,把日期类型转换注入到组件对象中-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><bean class="com.qcby.controller.StringToDate" /></set></property>
</bean>

注意在web.xml里面添加过滤器 设置编码,使从前端传递过来的数据经过过滤器,以指定编码显示在后端(解决中文乱码问题)

还要注意:过滤器一定要放在拦截器的前面才能起效果

<!--过滤器,解决中文乱码问题-->
<filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!-- 指定字符集 --><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

代码实例:

下面我们来看代码实例:

实体类1:

public class User {private String username;private String password;private  Car car;//    @DateTimeFormat(pattern = "yyyy-dd-mm")private Date birthday;List<String> list;public User() {}public User(String username, String password, Car car, Date birthday, List<String> list) {this.username = username;this.password = password;this.car = car;this.birthday = birthday;this.list = list;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Car getCar() {return car;}public void setCar(Car car) {this.car = car;}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", car=" + car +", birthday=" + birthday +", list=" + list +'}';}
}

实体类2:

public class Car {private double money;public Car() {}public Car(double money) {this.money = money;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}@Overridepublic String toString() {return "Car{" +"money=" + money +'}';}
}

controller类:

/*** 控制器类,处理用户的请求*/
// 把当前类交给IOC容器进行管理
@Controller
//@RequestMapping("/hello")  一级
public class HellomvcController {/*** 处理超链接发送出来的请求* @return* 注解的属性  如果是value 可以省略不写  其它不行*/// 配置映射的配置  二级
//    @RequestMapping(path = "/hello.do",method = {RequestMethod.GET},params = "username")@RequestMapping("/hello.do")public String sayHello(){System.out.println("入门方法执行了2...");// 跳转的JSP页面的路径,默认使用的是请求的转发// return "/WEB-INF/pages/suc.jsp";// 配置了视图解析器后,写法return "suc";}/*** 前端传过来的参数过多,用实体类接收* 前提:form表单的name要和实体类的属性名称一致,才能通过实体类属性来获取参数* @param user* @return*/@RequestMapping("/usersave1")public String userSave1(User user){System.out.println(user.getUsername()+":"+user.getPassword());return "suc";}@RequestMapping("/usersave2")public String userSave2(User user){System.out.println(user);return "suc";}
}

日期自定义类型转换器

public class StringToDate implements Converter<String,Date> {/*** 进行类型转换的方法* @param s     用户输入的内容* @return*/
//    @Overridepublic Date convert(String s) {// 判断if(s == null){throw new RuntimeException("请输入内容");}// 进行转换SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");try {// 进行转换return sdf.parse(s);} catch (ParseException e) {throw new RuntimeException(e);}}
}

springMVC.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--开启注解扫描--><context:component-scan base-package="com.qcby"/><!-- 配置视图解析器 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean><!--这里对应@DateTimeFormat(pattern = "yyyy-dd-mm")注解--><!--<mvc:annotation-driven/>--><!--配置日期类型转换器,类型转换器的组件,把日期类型转换注入到组件对象中--><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><set><bean class="com.qcby.controller.StringToDate" /></set></property></bean><!--让映射器、适配器和处理器生效(默认不配置也是可以的)--><mvc:annotation-driven conversion-service="conversionService"/>
</beans>

web.xml

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><!--过滤器--><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!-- 指定字符集 --><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--统一的servlet做拦截--><!--所有的访问请求都会被拦截--><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></web-app>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>首页</title>
</head>
<body>
<%--超链接--%>
​
<h3>入门</h3>
<%--​locahost:8085/hello.do--%>
<h3>演示SpringMVC的前后端交互</h3>
<a href="/hello.do" >入门程序</a><h3>演示SpringMVC请求参数传递,请求参数为基本类型或字符串时</h3>
<form method="post" action="/usersave1">用户名:<input type="text" name="username" id="username"/>密码:<input type="password" name="password"  id="password"/><br/><input type="submit" name="submit" value="提交"/>
</form><h3>演示SpringMVC请求参数传递,请求参数为实体类、集合和日期类型</h3>
<form method="post" action="/usersave2">用户名:<input type="text" name="username" id="username1"/>密码:<input type="password" name="password"  id="password1"/>金额:<input type="text" name="Car.money"  id="money"/>集合:<input type="text" name="list[0]"/>集合:<input type="text" name="list[1]"/>日期:<input type="text" name="birthday" id="birthday"/><br/><input type="submit" name="submit" value="提交"/>
</form>
</body>
</html>

suc.xml

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>成功页面</title>
</head>
<body><h3>入门成功了...</h3>
</body>
</html>

相关文章:

springMVC前后端请求参数绑定和传递

目录 请求参数的绑定 当绑定参数是基本数据类型和字符串类型时,要注意: 当绑定参数是实体类型&#xff08;JavaBean&#xff09;要注意: 给集合属性数据封装&#xff0c;要注意: 绑定参数是日期类型&#xff0c;如何封装&#xff1a; 代码实例&#xff1a; 实体类1&#…...

【iOS】—— 消息传递和消息转发

【iOS】—— 消息传递和消息转发 1. 消息传递SEL选择子IMP快速查找汇编代码查找过程总结消息转送快速查找IMP 慢速查找总结消息传递慢速查找IMP 2. 消息转发动态决议动态解析添加方法 快速转发慢速转发 总结动态决议消息转发消息的三次拯救 1. 消息传递 在iOS中&#xff0c;消…...

【Node.js】初识 Node.js

Node.js 概念 Node.js 是一个开源与跨平台的 JavaScript运行时环境 &#xff0c;在浏览器外运行 V8 JavaScript 引擎(Google Chrome的内核)&#xff0c;利用事件驱动、非阻塞和异步输入输出 等技术提高性能。 可以理解为 Node.js就是一个服务器端的、非阻塞式 l/O 的、事件驱…...

AWS backup服务和 RDS snapshot的关系

首先&#xff0c;其实RDS的snapshot&#xff0c;自动备份和手动备份&#xff0c;就是调用的AWS backup服务&#xff0c;只不过是通过RDS控制台&#xff0c;API等等进行控制和管理的。 1. AWS backup 服务对于RDS的备份来说包括两部分&#xff1a; --连续备份&#xff08;需要…...

PDF转Word怎么快速转换?格式转换技巧分享

PDF文件和Word文档是我们日常工作中不可或缺的文件格式&#xff0c;同时文件之间的格式转换也十分常见。不同的格式有着不同的优点&#xff0c;将PDF文件改为Word文档后&#xff0c;在编辑或修改文件内容时更为方便。 下面小编就来给大家介绍几种常用的PDF转Word的转换方法&am…...

浅谈:网络协议及网络连接

事情的起因 怪有意思的。&#xff08;纯纯唠嗑&#xff0c;不感兴趣的可以跳过&#xff09; 我们初中&#xff0c;在学期的最后一天换教室&#xff0c;由于我们是十三班&#xff0c;是年级里面的一个“例外”。因为我们其他年级都是12个和10个班级&#xff0c;就我们一个奇数…...

websocket-react使用

问题 在一个应用中&#xff0c;如果需要在不同的组件之间共享同一个WebSocket连接&#xff0c;可以采用多种方法来实现。 比如&#xff1a;单例模式、全局变量、react context React上下文&#xff08;React Context&#xff09; 如果你使用的是React&#xff0c;可以使用Re…...

【总结】nginx源码编译安装报错./configure: error: SSL modules require the OpenSSL library.

问题现象 源码编译安装nginx时&#xff0c;执行./configure …… --with-http_ssl_module 命令安装https模块&#xff0c;需要用到openssl&#xff0c;由于机器缺少openssl库&#xff0c;报如下错误。 …… checking for openat(), fstatat() ... found checking for getaddr…...

昇思25天学习打卡营第15天|两个分类实验

打卡 目录 打卡 实验1&#xff1a;K近邻算法实现红酒聚类 数据准备 模型构建--计算距离 计算演示 模型预测 实验2&#xff1a;基于MobileNetv2的垃圾分类 任务说明 数据集 参数配置&#xff08;训练/验证/推理&#xff09; 数据预处理 MobileNetV2模型搭建 Mobile…...

实践:Redis6.0配置文件解读

详细解读redis配置文件 https://raw.githubusercontent.com/redis/redis/6.2/redis.conf Units 配置数据单位换算关系配置大小单位&#xff1a;当需要内存大小时&#xff0c;可以指定。开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit&#xff0…...

【Go系列】Go语言的网络服务

承上启下 我们既然知道了Go语言的语法&#xff0c;也了解到了Go语言如何协同工作机制。那么对于这样一款天生支持高并发的语言&#xff0c;它的用武之地自然而然的就是网络服务了。我们今天学学如何使用网络服务。 开始学习 Go语言使用网络服务 在Go语言中&#xff0c;使用网…...

CS110L(Rust)

1.Rust 语法总结 数值类型 有符号整数: i8, i16, i32, i64无符号整数: u8, u16, u32, u64 变量声明 声明变量: let i 0; // 类型推断let n: i32 1; // 显式类型声明 可变变量: let mut n 0; n n 1; 字符串 注意&#xff0c;let s: str "Hello world";…...

免费恢复软件有哪些?电脑免费使用的 5 大数据恢复软件

您是否在发现需要的文件时不小心删除了回收站中的文件&#xff1f;您一定对误操作感到后悔。文件永远消失了吗&#xff1f;还有机会找回它们吗&#xff1f;当然有&#xff01;您可以查看这篇文章&#xff0c;挑选 5 款功能强大的免费数据恢复软件&#xff0c;用于 Windows 和 M…...

Flink History Server配置

目录 问题复现 History Server配置 HADOOP_CLASSPATH配置 History Server配置 问题修复 启动flink集群 启动Histroty Server 问题复现 在bigdata111上执行如下命令开启socket&#xff1a; nc -lk 9999 如图&#xff1a; 在bigdata111上执行如下命令运行flink应用程序 …...

ASPICE过程改进原则:确保汽车软件开发的卓越性能

"在汽车行业中&#xff0c;软件已经成为驱动创新和增强产品功能的核心要素。然而&#xff0c;随着软件复杂性的增加&#xff0c;确保软件质量、可靠性和性能成为了一项严峻的挑战。ASPICE标准的引入&#xff0c;为汽车软件开发提供了一套全面的过程改进框架&#xff0c;以…...

HDU1005——Number Sequence,HDU1006——Tick and Tick,HDU1007——Quoit Design

目录 HDU1005——Number Sequence 题目描述 超时代码 代码思路 正确代码 代码思路 HDU1006——Tick and Tick 题目描述 运行代码 代码思路 HDU1007——Quoit Design 题目描述 运行代码 代码思路 HDU1005——Number Sequence 题目描述 Problem - 1005 超时代码…...

uniapp form表单校验

公司的一个老项目&#xff0c;又要重新上架&#xff0c;uniapp一套代码&#xff0c;打包生成iOS端发布到App Store&#xff0c;安卓端发布到腾讯应用宝、OPPO、小米、华为、vivo&#xff0c;安卓各大应用市场上架要求不一样&#xff0c;可真麻烦啊 光一个表单校验&#xff0c;…...

构建RSS订阅机器人:观察者模式的实践与创新

在信息爆炸的时代&#xff0c;如何高效地获取和处理信息成为了一个重要的问题。RSS订阅机器人作为一种自动化工具&#xff0c;能够帮助我们从海量信息中筛选出我们感兴趣的内容。 一、RSS 是什么&#xff1f;观察者模式又是什么&#xff1f; RSS订阅机器人是一种能够自动订阅…...

芯片基础 | `wire`类型引发的学习

在Verilog中&#xff0c;wire类型是一种用于连接模块内部或模块之间的信号的数据类型。wire类型用于表示硬件中的物理连线&#xff0c;它可以传输任何类型的值&#xff08;如0、1、高阻态z等&#xff09;&#xff0c;但它在任何给定的时间点上只能有一个确定的值。 wire类型通…...

如何在AWS上构建Apache DolphinScheduler

引言 随着云计算技术的发展&#xff0c;Amazon Web Services (AWS) 作为一个开放的平台&#xff0c;一直在帮助开发者更好的在云上构建和使用开源软件&#xff0c;同时也与开源社区紧密合作&#xff0c;推动开源项目的发展。 本文主要探讨2024年值得关注的一些开源软件及其在…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...