请求参数的绑定
-
绑定的机制
我们都知道,表单中请求参数都是基于 key=value 的。 SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。 例如: <a href="account/findAccount?accountId=10">查询账户</a> 中请求参数是: accountId=10 /** * 查询账户 * @return */ @RequestMapping("/findAccount") public String findAccount(Integer accountId) { System.out.println("查询了账户。。。。"+accountId); return "success"; } 注意: 1. 表单提交的数据都是k=v格式的 username=haha&password=123 2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的 3. 要求:提交表单的name和参数的名称是相同的
-
支持的数据类型:
基本类型参数: 包括基本类型和 String 类型 POJO 类型参数: 包括实体类,以及关联的实体类 数组和集合类型参数: 包括 List 结构和 Map 结构的集合(包括数组) SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。 注意: 如果是基本类型或者 String 类型: 要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写) 如果是 POJO 类型,或者它的关联对象: 要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。 1. 提交表单的name和JavaBean中的属性名称需要一致 2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name 把数据封装Account类中 <form action="param/saveAccount" method="post"> 姓名:<input type="text" name="username" /><br/> 密码:<input type="text" name="password" /><br/> 金额:<input type="text" name="money" /><br/> 用户姓名:<input type="text" name="user.uname" /><br/> 用户年龄:<input type="text" name="user.age" /><br/> <input type="submit" value="提交" /> </form> /** * 请求参数绑定把数据封装到JavaBean的类中 * @return */ @RequestMapping("/saveAccount") public String saveAccount(Account account){ System.out.println("执行了..."); System.out.println(account); return "success"; } 如果是集合类型 要求集合类型的请求参数必须在POJO中。在表单中请求参数名称要和POJO中集合属性名称相同 给 set 集合中赋值 private Set<User> set = new HashSet<>(); public Person() { set.add(new User()); //set.add(new User()); } 给 List 集合中的元素赋值,使用下标。 private List<User> uList; 给 Map 集合中的元素赋值,使用键值对。 private Map<String, User> map; <%--把数据封装Account类中,类中存在list和map的集合 <form action="param/saveAccount" method="post"> 姓名:<input type="text" name="username" /><br/> 密码:<input type="text" name="password" /><br/> 金额:<input type="text" name="money" /><br/> 用户姓名:<input type="text" name="list[0].uname" /><br/> 用户年龄:<input type="text" name="list[0].age" /><br/> 用户姓名:<input type="text" name="map['one'].uname" /><br/> 用户年龄:<input type="text" name="map['one'].age" /><br/> 编号:<input name="set[0].uid" type="text"><br> 姓名:<input name="set[0].uname" type="text"><br> <input type="submit" value="提交" /> </form>
-
自定义类型转换器
1. 使用场景: <!-- 特殊情况之:类型转换问题 --> <a href="account/deleteAccount?date=2018-01-01">根据日期删除账户</a> 控制器代码: /** * 删除账户 * @return */ @RequestMapping("/deleteAccount") public String deleteAccount(Date date) { System.out.println("删除了账户。。。。"+date); return "success"; } 2. 第一种,使用步骤 第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。 public interface Converter<S, T> {//S:表示接受的类型,T:表示目标类型 /** * 实现类型转换的方法 */ @Nullable T convert(S source); } public class StringToDateConverter implements Converter<String, Date> { /** * String source 传入进来字符串 * @param source * @return */ public Date convert(String source) { // 判断 if(source == null){ throw new RuntimeException("请您传入数据"); } DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); try { // 把字符串转换日期 return df.parse(source); } catch (Exception e) { throw new RuntimeException("数据类型转换出现错误"); } } } 第二步:在 spring 配置文件中配置类型转换器。 spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。 在spingmvc.xml <!--配置自定义类型转换器--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.demos.utils.StringToDateConverter"/> </set> </property> </bean> <!-- 开启SpringMVC框架注解的支持 --> <mvc:annotation-driven conversion-service="conversionService"/> 3. 第二种,在属性上加注解 @DateTimeFormat(pattern="yyyy-MM-dd") private Date date; 4. 在控制器中使用原生的ServletAPI对象 SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有: HttpServletRequest HttpServletResponse HttpSession java.security.Principal Locale InputStream OutputStream Reader Writer jsp 代码: <!-- 原始 ServletAPI 作为控制器参数 --> <a href="account/testServletAPI">测试访问 ServletAPI</a> 控制器中的代码 /** * 原生的API * @return */ @RequestMapping("/testServlet") public String testServlet(HttpServletRequest request, HttpServletResponse response){ System.out.println("执行了..."); System.out.println(request); HttpSession session = request.getSession(); System.out.println(session); ServletContext servletContext = session.getServletContext(); System.out.println(servletContext); System.out.println(response); return "success"; }