SpringMVC表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器
文章目录
- SpringMVC的参数绑定支持的数据类型
- 基本数据类型和字符串类型
- JavaBean
- 包装类
- Map类型
- List类型
- POST请求参数中文乱码的解决方法
- 自定义类型转换器(Date类型转换)
- 在控制器中使用原生的ServletAPI对象实现请求转发与重定向
前台表单提交的数据格式是形如username=zhangsansan&age=18
的, SpringMVC的参数绑定过程就是把表单提交的请求参数,作为控制器中方法的参数进行绑定。
SpringMVC的参数绑定支持的数据类型
基本数据类型和字符串类型
提交表单的name和参数的名称要相同才能接到参数
@Controller
@RequestMapping(path="/springmvc")
public class ParametersController {/*接收请求 SpringMVC参数绑定类型:基本数据类型和字符串类型提交表单的name和参数的名称要相同才能接到参数。<form action="/springmvc/sai">名字:<input type="text" name="name"><br/>年龄:<input type="text" name="age"><br/><button type="submit">提交</button></form>*/@RequestMapping(path="/sai")public String select(String name,Integer age) {System.out.println(name+" "+age);return "login";}
}
JavaBean
页面表单name的值需要和后台接收的JavaBean对应的属性名字一致
<div><form action="/springmvc/bean">名字:<input type="text" name="name"><br/>年龄:<input type="text" name="age"><br/>地址:<input type="text" name="adress"><br/><button type="submit">提交</button></form>
</div>
public class User {private String name;private Integer age;private String adress;..........
}
@Controller
@RequestMapping(path="/springmvc")
public class ParametersController {/*接收请求 SpringMVC参数绑定类型:JavaBean页面表单name的值需要和后台接收的JavaBean对应的属性名字一致*/@RequestMapping(path="/bean")public String addUser(User user) {System.out.println(user);//User{name='周哈哈', age=23, adress='中国'}return "login";}
}
包装类
// 包装类
public class SuperUser {private String name;private Integer age;//引用属性private IDCard idCard;//引用属性(集合属性)private List<Account> accounts;...
}public class IDCard {private String number;private String address;.......
}public class Account {private String id;private Double money;....
}
- SpringMVC参数绑定类型:包装类 一对一
JavaBean有引用属性,页面表单则写 引用属性名.引用属性自身对应属性名
<div><form action="/springmvc/beanvo">名字:<input type="text" name="name"><br/>年龄:<input type="text" name="age"><br/>身份证号:<input type="text" name="idCard.number"><br/>住址:<input type="text" name="idCard.address"><br/><button type="submit">提交</button></form>
</div>
- SpringMVC参数绑定类型:包装类 一对多
JavaBean有集合属性,则页面编写方式:该集合属性名[0].属性
<div><form action="/springmvc/beanvo">名字:<input type="text" name="name"><br/>年龄:<input type="text" name="age"><br/>身份证号:<input type="text" name="idCard.number"><br/>住址:<input type="text" name="idCard.address"><br/><div>====账户一====</div>账户id:<input type="text" name="accounts[0].id"><br/>余额:<input type="text" name="mobiles[0].money"><br/><div>====账户二====</div>账户id:<input type="text" name="accounts[1].id"><br/>余额:<input type="text" name="mobiles[1].money"><br/><div>=====账户三=====</div>账户id:<input type="text" name="accounts[2].id"><br/>余额:<input type="text" name="mobiles[2].money"><br/><button type="submit">提交</button></form>
</div>
一对一
一对多
@Controller
@RequestMapping(path="/springmvc")
public class ParametersController {/*接收请求 SpringMVC参数绑定类型:包装类页面表单name的值需要和后台接收的JavaBean对应的属性名字一致如果JavaBean有引用属性,页面表单则写 引用属性名.引用属性自身对应属性名如果接收的JavaBean里存在List集合,则页面需要每次用下标来告诉程序是第几个。页面编写方式:该集合引用属性名[0].引用属性自身对应属性名*/@RequestMapping(path="/beanvo")public String addSuperUser(SuperUser superUser) {System.out.println(superUser);//包装类 一对一 输出:SuperUser{name='周哈哈', age=23, idCard=IDCard{number='11111', address='江西'}, accounts=null} 表单没有accounts的相关提交参数,故accounts=null//包装类 一对多 输出:SuperUser{name='周哈哈', age=23, idCard=IDCard{number='11111', address='江西'}, accounts=[Account{id='aaa', money=10000.0}, Account{id='bbb', money=100000.0}, Account{id=' ccc', money=1111111.0}]}return "login";}
}
Map类型
http://localhost:8080/springmvc/map?name=张三三&age=18
@Controller
@RequestMapping(path="/springmvc")
public class ParametersController {/*接收请求 SpringMVC参数绑定类型:Map类型需要加上@RequestParam注解接收Map数据*/@RequestMapping(path ="/map")public String addMap(@RequestParam Map<String,String> map){System.out.println(map);//{name=张三三, age=18}return "login";}
}
List类型
<div><form action="/springmvc/list"><table><tr><td>选择</td><td>型号</td><td>价格</td></tr><tr><td><input type="checkbox" value="1" name="ids" /></td><td>华为Mate Xs</td><td>16999</td></tr><tr><td><input type="checkbox" value="2" name="ids" /></td><td>iPhone 11 </td><td>9599</td></tr></table><button type="submit">提交</button></form>
</div>
http://localhost:8080/springmvc/list?ids=1&ids=2
@Controller
@RequestMapping(path="/springmvc")
public class ParametersController {/*接收请求 SpringMVC参数绑定类型:List类型需要加上@RequestParam注解接收List类型*/@RequestMapping(value = "/list")public String addList(@RequestParam List<Integer> ids){System.out.println(ids);//[1, 2]return "login";}
}
POST请求参数中文乱码的解决方法
以上用的都是GET请求回避了POST请求中文乱码问题
以JavaBean参数绑定为例:以post请求方式提交
<div><form action="/springmvc/bean" method="post">名字:<input type="text" name="name"><br/>年龄:<input type="text" name="age"><br/>地址:<input type="text" name="adress"><br/><button type="submit">提交</button></form>
</div>
@Controller
@RequestMapping(path="/springmvc")
public class ParametersController {/*接收请求 SpringMVC参数绑定类型:JavaBean页面表单name的值需要和后台接收的JavaBean对应的属性名字一致*/@RequestMapping(path="/bean")public String addUser(User user) {System.out.println(user);return "login";}
}
控制台输出:
回顾:Filter(过滤器)
请求参数POST请求中文乱码的解决方法: 在web.xml中配置Spring提供的过滤器类
<!--配置过滤器,解决中文乱码的问题,注意:解决的是POST请求乱码问题CharacterEncodingFilter:用于做编码过滤,给指定请求的数据做编码--><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>
自定义类型转换器(Date类型转换)
以上表单提交的所有数据类型都是字符串类型,不过后台方法入参却有定义为Integer类型的,这是因为Spring框架内部会默认进行数据类型转换。
而Date类型,由于开发需求不同,Spring框架并没有自动帮我们实现转换,需要自己转换。
不配置自定义类型转换器的情况下:
前端表单
<div><form action="/springmvc/bean" method="post">名字:<input type="text" name="name"><br/>年龄:<input type="text" name="age"><br/>生日:<input type="date" name="birthday"><br/>地址:<input type="text" name="adress"><br/><button type="submit">提交</button></form>
</div>
User
public class User {private String name;private Integer age;private String adress;@DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;.........
}
ParametersController 控制器类
@Controller
@RequestMapping(path="/springmvc")
public class ParametersController {@RequestMapping(path="/bean")public String addUser(User user) {System.out.println(user);return "login";}
}
提交表单:服务器返回到客户端的状态码400 ,语义有误或请求参数有误,当前请求无法被服务器理解。
解决方法:
①自定义类型转换器
创建一个类型转换器DataConverter 实现Converter的接口
public class DataConverter implements Converter<String, Date> {//将字符类型转成Date类型@Overridepublic Date convert(String s) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");try {//将String转Datereturn simpleDateFormat.parse(s);} catch (ParseException e) {throw new RuntimeException(e);}}
}
注册自定义类型转换器,在springmvc.xml配置文件中编写配置
<!-- 配置spring开启注解mvc的支持--><mvc:annotation-driven conversion-service="conversionService" /><!--注册自定义类型转换器 --><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><!--需要加入的类型转换器--><property name="converters"><bean class="com.mycode.util.DataConverter" /></property></bean>
测试控制台输出日志信息
②使用注解解决类型转换的问题
在需要转换的Date类型上加上@DateTimeFormat
注解
public class User {private String name;private Integer age;private String adress;@DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;.........
}
在springmvc.xml配置文件中配置注解驱动
<!--注解驱动-->
<mvc:annotation-driven />
在控制器中使用原生的ServletAPI对象实现请求转发与重定向
回顾:请求的转发与重定向
在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象,然后实现请求转发与重定向
@Controller
@RequestMapping(value = "/servlet")
public class ServletApiTestController {//基于Servlet实现重定向@RequestMapping(value = "/redirect")public void redirect(HttpServletRequest request, HttpServletResponse response){try {response.sendRedirect("https://blog.csdn.net/qq_45615417");} catch (IOException e) {e.printStackTrace();}}//基于Servlet实现转发@RequestMapping(value = "/forward")public void forward(HttpServletRequest request, HttpServletResponse response){try {request.getRequestDispatcher("/index.jsp").forward(request,response);} catch (Exception e) {e.printStackTrace();}}
}
SpringMVC表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器相关推荐
- SpringMVC 表单验证
SpringMVC 表单验证 本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能. 首先看效果图 然后项目目录结构图 接下来用代码重点学习SpringMV ...
- SpringMVC表单验证器的使用
转载自 SpringMVC表单验证器的使用 本章讲解SpringMVC中怎么通过注解对表单参数进行验证. SpringBoot配置 使用springboot, spring-boot-starter- ...
- ajax使用总结-ajax的配置-ajax的调用-ajax的中文乱码-ajax的表单提交
·jquery的使用 0.必须优先引入jquery.js 否则无法调用jquery框架 1.js区分大小写,起名字的时候要注意 2.jquery根据div的id属性获取页面text的 ...
- SpringMVC 表单标签中 htmlEscape 属性的作用
一.SpringMVC 表单元素标签 如下: <form:textarea path="remarks" htmlEscape="false" class ...
- springMVC_day01_概念_入门_@RequestMapping注解_参数封装与绑定_编码过滤器
文章目录 一.知识回顾 二.三层架构和MVC设计模式 三.springMVC的概念 四.SpringMVC的HelloWorld(重点) 1.引入依赖 2.spring-mvc.xml配置 3.web ...
- 详解Spring MVC请求参数类型,解决中文乱码问题,自定义类型转换器,Spring MVC相关注解
#SpringMVC SpringMVC请求 简单类型 简单类型包括:基本类型,基本类型的包装类型,字符串 编写Controller @RequestMapping("/param" ...
- IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...
- HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求
为什么80%的码农都做不了架构师?>>> HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 问题:HTTP 错误 404. ...
- HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。(上传文件长度问题)
HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 问题:HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容 ...
最新文章
- OpenCV copyTo() 函数实现图片交集
- 《统一沟通-微软-实战》-6-部署-2-中介服务器-1-定义中介服务器
- 点名系统在c++中怎么做_栅格系统是怎么做设计的
- Xamarin iOS开发实战上册-----2.2 添加和定制视图
- USACO 3.2 kimbits DP
- 服务器端密钥库文件,使用密钥库文件为SOAP运行客户端WS
- 【AI项目商务合作】图像拼接
- Netty工作笔记0054---EventLoop组件
- linux shell学习三
- 句句真研—每日长难句打卡Day8
- android经典动态壁纸,Android动态壁纸解析
- SSH和SSM的内容
- linux下复制文件并重命名,linux复制文件并修改文件名
- html水印生成pdf,如何在jsPDF中添加PDF生成水印?
- NOIP2015 普及组第四题 推销员
- 编曲宿主DAW是什么 2023年编曲宿主软件哪个好用
- User account has expired
- 《跟开涛学SpringMVC》学习笔记
- 华为MA5626 ONU配置成交换机及开启POE指令教程
- 关于串行处理过程中时序的论述
热门文章
- 基于Ubuntu和STM32分析全局变量、局部变量、堆、栈
- zabbix监控——监控应用
- 大数据平台CDH的介绍和5.16/6.3版本的搭建
- PowerDesigner16.5设置主键自增Identity
- M100无人机的运行环境配置
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
- man手册翻译神器——星际译王
- OLS回归分析原理实战及结果解析-python3
- C++字符串完全指南 - Win32字符编码(二)
- Java中的枚举与values()方法