文章目录

  • ​ 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表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器相关推荐

  1. SpringMVC 表单验证

    SpringMVC 表单验证 本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能. 首先看效果图 然后项目目录结构图 接下来用代码重点学习SpringMV ...

  2. SpringMVC表单验证器的使用

    转载自 SpringMVC表单验证器的使用 本章讲解SpringMVC中怎么通过注解对表单参数进行验证. SpringBoot配置 使用springboot, spring-boot-starter- ...

  3. ajax使用总结-ajax的配置-ajax的调用-ajax的中文乱码-ajax的表单提交

    ·jquery的使用    0.必须优先引入jquery.js 否则无法调用jquery框架    1.js区分大小写,起名字的时候要注意    2.jquery根据div的id属性获取页面text的 ...

  4. SpringMVC 表单标签中 htmlEscape 属性的作用

    一.SpringMVC 表单元素标签 如下: <form:textarea path="remarks" htmlEscape="false" class ...

  5. springMVC_day01_概念_入门_@RequestMapping注解_参数封装与绑定_编码过滤器

    文章目录 一.知识回顾 二.三层架构和MVC设计模式 三.springMVC的概念 四.SpringMVC的HelloWorld(重点) 1.引入依赖 2.spring-mvc.xml配置 3.web ...

  6. 详解Spring MVC请求参数类型,解决中文乱码问题,自定义类型转换器,Spring MVC相关注解

    #SpringMVC SpringMVC请求 简单类型 简单类型包括:基本类型,基本类型的包装类型,字符串 编写Controller @RequestMapping("/param" ...

  7. IIS请求筛选模块被配置为拒绝超过请求内容长度的请求

    HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...

  8. HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求

    为什么80%的码农都做不了架构师?>>>    HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 问题:HTTP 错误 404. ...

  9. HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。(上传文件长度问题)

    HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求. 问题:HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容 ...

最新文章

  1. OpenCV copyTo() 函数实现图片交集
  2. 《统一沟通-微软-实战》-6-部署-2-中介服务器-1-定义中介服务器
  3. 点名系统在c++中怎么做_栅格系统是怎么做设计的
  4. Xamarin iOS开发实战上册-----2.2 添加和定制视图
  5. USACO 3.2 kimbits DP
  6. 服务器端密钥库文件,使用密钥库文件为SOAP运行客户端WS
  7. 【AI项目商务合作】图像拼接
  8. Netty工作笔记0054---EventLoop组件
  9. linux shell学习三
  10. 句句真研—每日长难句打卡Day8
  11. android经典动态壁纸,Android动态壁纸解析
  12. SSH和SSM的内容
  13. linux下复制文件并重命名,linux复制文件并修改文件名
  14. html水印生成pdf,如何在jsPDF中添加PDF生成水印?
  15. NOIP2015 普及组第四题 推销员
  16. 编曲宿主DAW是什么 2023年编曲宿主软件哪个好用
  17. User account has expired
  18. 《跟开涛学SpringMVC》学习笔记
  19. 华为MA5626 ONU配置成交换机及开启POE指令教程
  20. 关于串行处理过程中时序的论述

热门文章

  1. 基于Ubuntu和STM32分析全局变量、局部变量、堆、栈
  2. zabbix监控——监控应用
  3. 大数据平台CDH的介绍和5.16/6.3版本的搭建
  4. PowerDesigner16.5设置主键自增Identity
  5. M100无人机的运行环境配置
  6. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
  7. man手册翻译神器——星际译王
  8. OLS回归分析原理实战及结果解析-python3
  9. C++字符串完全指南 - Win32字符编码(二)
  10. Java中的枚举与values()方法