SpringMVC请求参数的绑定
1.参数绑定
1.1 绑定的机制
表单中请求参数都是key=value的,SpringMVC绑定请求参数的过程是通过把表单请求参数,作为控制器中方法参数进行绑定的。
例如:<a href="account/findAccount?accountId=10">查询账户</a>中的参数是:accountId=10控制器所对应的参数为:@RequestMapping("/findAccount")public String findAccount(Integer accountId) {System.out.println("查询了账户。。。。"+accountId);return "success";}
1.2 支持的数据类型:
基本数据类型的参数:
包括基本类型和String类型。(注:Spring不属于八大基本类型)
Pojo类型的参数:
包括实体类,以及关联的实体类
数组和集合类型参数:
包括List结构和Map结构的集合(包括数组)
SpringMVC绑定请求参数时自动实现的,但是要想使用,必须遵循使用要求。
1.3 使用要求
如果是基本类型和String类型:
要求我们的参数名称必须和控制器中方法的形参名称一致。(严格区分大小写)
如果是pojo类型,或者它的关联对象:
要求表单中参数名称和Pojo类的属性名称保持一致。并且控制器方法的参数类型是Pojo类型
如果是集合类型,有两种方式:
第一种:要求集合类型的请求参数必须在Pojo中。在表单中请求参数名称必须要和Pojo中属性名称相同。
给List集合中的元素赋值,使用下标。
给Mpa集合中的元素赋值,使用键值对
第二种:接收的请求参数是json格式数据。需要借助一个注解实现。(@RequestBody)
2.使用示例
2.1 基本类型和String类型作为参数
Jsp代码:
<a href="params/requestMappering?username=张三&title=nihao">请求参数绑定</a>
控制器代码:
/** * 参数绑定 * @param username * @param title * @return */ @RequestMapping(value = "/requestMappering") public String paramsRequest(String username, String title){ System.out.println(username + "========" +title); return "success"; }
运行结果:
2.2 Pojo类型作为参数
实体类代码:
User实体类:
public class User implements Serializable{ private String username; private Integer age; private Date birthday;
}
Account实体类:
public class Account implements Serializable { private String accountname; private String password; private Double salary;
private User user;
}
jsp代码: <form action="/params/account" method="post"> 账户名:<input name="accountname" type="text"><br> 密码:<input name="password" type="text"><br> 金额:<input name="salary" type="text"><br> 姓名:<input name="user.username" type="text"><br> 年龄:<input name="user.age" type="text"><br> <input value="提交" type="submit"> </form>
控制器代码:
/** * 参数绑定—javabean * @return */ @RequestMapping(value = "/account") public String findAccount(Account account){ System.out.println(account); return "success"; }
运行结果:
2.3 Pojo类中包含集合类型参数
实体类代码:
Account实体类:
public class Account implements Serializable { private String accountname; private String password; private Double salary; // private User user; private List<User> lists; private Map<String, User> maps; }
User实体类: public class User implements Serializable{ private String username; private Integer age; private Date birthday; }
Jsp代码:
<form action="/params/account" method="post"> 账户名:<input name="username" type="text"><br> 密码:<input name="password" type="text"><br> 金额:<input name="salary" type="text"><br> <%--封装List--%> 姓名:<input name="lists[0].username" type="text"><br> 年龄:<input name="lists[0].age" type="text"><br> <%--map--%> 姓名:<input name="maps['one'].username" type="text"><br> 年龄:<input name="maps['one'].age" type="text"><br> <input value="提交" type="submit"> </form>
控制器代码:
/** * 参数绑定—javabean * @return */ @RequestMapping(value = "/account") public String findAccount(Account account){ System.out.println(account); return "success"; }
运行结果:
2.4 自定义类型转换器
自定义date转换器,将字符串转换为日期:
package com.llb.util; import org.springframework.core.convert.converter.Converter; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * 自定义类型转换器 * 将字符串转换成日期 * Ceate By llb on 2019/8/13 */ public class StringToDateConverter implements Converter<String, Date> { @Override public Date convert(String str) { if(str == null){ throw new RuntimeException("请您传入数据!"); } DateFormat df ; try { if(str.contains("-")){ df = new SimpleDateFormat("yyyy-MM-dd"); }else { df = new SimpleDateFormat("yyyy/MM/dd"); } //把字符串转换成日期 return df.parse(str); } catch (ParseException e) { throw new RuntimeException("日期类型转换失败!"); } } }
springmvc.xml配置:
<!--配置自定义类型转换器--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.llb.util.StringToDateConverter"/> </set> </property> </bean>
<!--开启springmvc框架的注解支持--> <mvc:annotation-driven conversion-service="conversionService"/>
jsp代码:
<form action="/params/saveUser" method="post"> 姓名:<input name="username" type="text"><br> 年龄:<input name="age" type="text"><br> 生日:<input type="text" name="birthday"> <input value="提交" type="submit"> </form>
控制器代码:
/** * 自定义格式转换器 * @return */ @RequestMapping(value = "/saveUser") public String saveUser(User user){ System.out.println(user); return "success"; }
运行结果:
SpringMVC项目搭建
github:https://github.com/PopsiCola/SSM-SpringMVC/tree/springmvc_response