SpringMVC学习(二)———— 参数绑定
一、参数绑定
1.1、什么是参数绑定?
客户在浏览器端会提交一些参数到服务器端,比如用户的登录等,就会传username 和 password过来,springmvc则通过参数绑定组件将请求参数的内容进行数据转换,然后将转换后的值覆给controller方法的形参,这就是参数绑定的过程,其实,springmvc就是使用controller方法形参来接收请求的参数
1.2、springmvc默认支持的参数类型
可以在Controller方法的形参中直接使用以下类型
HttpServletRequest、HttpServletResponse、HttpSession:这三个很熟悉,不做解释
Model/ModelMap:将model数据填充到request域,比如之前的ModelAndView对象添加list,其实就是将list添加到request作用域,只是ModelAndView对象不仅能够添加model数据,还能够添加视图。而Model对象的功能就只有将model数据填充到request作用域
如图所示,就是这样,在形参中使用这几个对象,那么在方法中就能直接用这几个对象了。有了request对象,就能够使用我们以前学过的老方法获取请求参数等一些信息了。
1.3、绑定简单类型的参数
上面讲解的只是默认支持的参数类型,有request等一些对象,必然是很好很方便的一件事,比如获取请求参数就可以得到解决了,但是springmvc提供更强大一些的功能。
绑定简单类型的参数规则:
1.3.1、如果请求参数的key和Controller类中方法的形参名称一致,那么就直接绑定;
请求url:http://localhost:8080/ssm_test/editItems.do?id=2 模拟客户端发送了一个id=2的请求参数过来,这里使用的是get方式,如果post方式也是一样的道理
Controller方法:
分析:形参中的名称与请求参数的名称相同,固可以直接绑定。
1.3.2、如果请求参数的key和Controller类中方法的形参名称不一致,那么就需要使用@RequestParam注解来进行参数绑定
请求url:http://localhost:8080/ssm_test/editItems.do?itemsId=2 模拟客户端发送了一个id=2的请求参数过来
Controller方法:
分析:使用@RequestParam("itemsId")注解将名为itemsId的请求参数的值赋值给形参中名为id的参数。注意,在对应的形参前面加该注解。
1.4、绑定pojo
使用springmvc绑定pojo的参数时,要求jsp中input框的name值要和Controller方法形参的pojo对象中的属性名称一致,如下图
jsp页面
controller方法
Items类
1.5、参数绑定时日期类型转换问题
在我们从jsp页面传过来的参数的类型都是object的,而我们自己编写的是有具体类型的,比如id是需要int型,name是需要string型,而springmvc就会帮我们将这些简单的类型自动进行类型转换,但是当遇到Date类型的时候,就转换不了,需要我们自己写一个类型转换器,然后给适配器配上,从而jsp传过来的参数能够转换成我们需要的日期类型,如果不自定义类型转换器的话,会报错 即把请求中的日期字符串转成java的日期类型,该日期类型与pojo中日期属性的类型保持一致
1.5.1、自定义Converter
<!--注解适配器,也就是不使用spring标签对注解进行管理 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer" ref="customBinder" />
</bean> <!-- 自定义webBinder -->
<bean id="customBinder"
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService" />
</bean>
<!-- conversionService -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<bean class="com.wuhao.ssm.util.DateConverter" />
</list>
</property>
</bean>
package com.wuhao.ssm.util; import java.text.SimpleDateFormat;
import java.util.Date; import org.springframework.core.convert.converter.Converter; public class DateConverter implements Converter<String,Date> { @Override
public Date convert(String source) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
return sdf.parse(source);
} catch (Exception e) {
e.printStackTrace();
}
return null;
} }
1.5.2、在springmvc.xml中配置该转换器
第一种方式(推荐):两步搞定
修改mvc:annotation-driven的配置
配置自定义转换器绑定
<!--注解适配器,也就是不使用spring标签对注解进行管理 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer" ref="customBinder" />
</bean> <!-- 自定义webBinder -->
<bean id="customBinder"
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService" />
</bean>
<!-- conversionService -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<bean class="com.wuhao.ssm.util.DateConverter" />
</list>
</property>
</bean>
<!-- 配置处理器映射器和处理器适配器 -->
<mvc:annotation-driven conversion-service="conversionService" /> <!-- 自定义参数绑定 -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<!-- 日期类型转换器 -->
<bean class="com.wuhao.ssm.util.DateConverter" />
</list>
</property>
</bean>
第二种方式:
<!--注解适配器,也就是不使用spring标签对注解进行管理 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer" ref="customBinder" />
</bean> <!-- 自定义webBinder -->
<bean id="customBinder"
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService" />
</bean>
<!-- conversionService -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<bean class="com.wuhao.ssm.util.DateConverter" />
</list>
</property>
</bean>
<!--注解适配器,也就是不使用spring标签对注解进行管理 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer" ref="customBinder" />
</bean> <!-- 自定义webBinder -->
<bean id="customBinder"
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService" />
</bean>
<!-- conversionService -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<bean class="com.wuhao.ssm.util.DateConverter" />
</list>
</property>
</bean>
1.6、包装pojo参数绑定
与1.4的pojo参数绑定的区别在于,这里将pojo放入一个包装类中,如下图,将Items类放入了ItemsQueryVO类中,ItemsQueryVO就是一个包装pojo
ItemsQueryVO
jsp
controller:直接使用包装pojo接收
1.7、集合参数的绑定
1.7.1、简单类型的集合参数绑定,可以使用数组或者List来接收
比如jsp页面有一些多选框,复选框,这样提交过来,就需要使用集合参数的绑定了。
jsp
controller
使用数组来接收
形参中的数组类型要和jsp中值的类型一致,形参中的参数名称要和jsp中name一致。也就是itemsid
使用list来接收
形参中list的泛型跟jsp中的值的类型一致,形参中参数名称要和jsp中name一致。(我们想象中是这样)
结果,会报错,嘿嘿,因为不能在形参中直接定义List类型的参数,如果想要使用list来接收,需要把List类型的参数定义在包装POJO中,Controller的方法形参使用该包装POJO,下面讲解。所以如果使用接收简单类型的集合参数,使用数组最为方便。
1.7.2、pojo类型的集合参数绑定,可以使用数组或者list来接收
注意:pojo类型的集合参数绑定时,接收它的数组或者List,都不能直接定义在Controller方法形参上,需要把它定义到一个包装pojo中,如何把这个包装pojo放到形参
使用list。
包装pojo类 ItemsQueryVo, 将需要装items集合的对象放入包装类中。
jsp
这里注意:标记的是name属性,不要与value属性搞混淆了,在ItemsQueryVo中有名为itemsList的list,所以在jsp中的name就需要一层层匹配下去才能正确将其属性值装载到正确的位置,list的格式为:itemsList[下标].name。 就拿这个分析,itemsList就可以找打ItemsQueryVo中的itemsList, itemsList[1],就可以定位到itemsList中的第一个items,itemsList[1].name就可以定位到itemsList中的第一个items的name属性,这样一来就看得懂了。
controller
1.7.3、总结上面两种
总结一下集合参数的绑定
对于简单类型的集合参数绑定,则使用数组作为形参来接收请求的集合参数
对于pojo类型的集合参数绑定,则使用数组或者list两者都可以,一般常用list。
注意:这种pojo类型的集合参数绑定,必须将list或者数组作为一个包装类中的属性,然后使用该包装类对象作为形参来接收请求参数。
1.7.4、map集合类型绑定
这个用的不多,一般只是用list,这个也稍微了解一下,等需要的时候会用即可,贴出关键代码就行
同样,需要使用包装pojo类。
ItemsQueryVo
jsp:格式为下面这样。就能够匹配到
controller
二、总结
看了这么多中参数绑定的例子,我觉得用一句话来概括最为准确,万变不离其宗。有耐心看一下就自然就会用了,真的很简单。只是知识比较多比较细,需要理解的也不多。
SpringMVC学习(二)———— 参数绑定的更多相关文章
- springMVC学习(5)-参数绑定
接着上一集,记录参数绑定的过程: springmvc中,接收页面提交的数据是通过方法形参来接收: 一.默认支持的类型: 在controller形参中添加如下类型的参数处理适配器会默认识别并进行赋值: ...
- 【SpringMVC学习05】SpringMVC中的参数绑定总结——较乱后期准备加入 同一篇幅他人的参数绑定
众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springm ...
- springmvc的初始化参数绑定
一.springmvc的初始化参数绑定 此种和我们之前说的类型转换非常相似,可以看作是一种类型转换 在初始化参数绑定时 重要的是参数类型 -------------------单日期的绑定 二. 配 ...
- SpringMVC介绍及参数绑定
本节内容: SpringMVC介绍 入门程序 SpringMVC架构 SpringMVC整合MyBatis 参数绑定 SpringMVC和Struts2的区别 一.SpringMVC介绍 1. 什么是 ...
- SpringMVC详解------参数绑定
SpringMVC详解------参数绑定 转载于:https://blog.csdn.net/swebin/article/details/92795422 目录 1.SpringMVC 参数绑定 ...
- [Spring MVC] - SpringMVC的各种参数绑定方式
SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controller代码: @RequestMapping("saysth.do") publi ...
- SpringMVC的各种参数绑定方式
1. 基本数据类型(以int为例,其他类似):2. 包装类型(以Integer为例,其他类似):3. 自定义对象类型:4. 自定义复合对象类型:5. List绑定:6. Set绑定:7. Map绑定: ...
- [转载]SpringMVC的Model参数绑定方式
SpringMVC的各种参数绑定方式 http://www.cnblogs.com/HD/p/4107674.html springMVC中复杂嵌套对象.List等集合类型数据绑定 http://ww ...
- SpringMVC中的参数绑定总结
众所周知,springmvc是用来处理页面的一些请求,然后将数据再通过视图返回给用户的,前面的几篇博文中使用的都是静态数据,为了能快速入门springmvc,在这一篇博文中,我将总结一下springm ...
- SpringMVC中的参数绑定
SpringMVC中的参数绑定 参数绑定的定义 所谓参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达 Controller.从客户端请求key/value数据(比如ge ...
随机推荐
- 数据结构C语言顺序表
#include <stdio.h> #include <stdlib.h> typedef int EmenType; typedef struct Node { int d ...
- 【慕课网实战】二、以慕课网日志分析为例 进入大数据 Spark SQL 的世界
MapReduce的局限性: 1)代码繁琐: 2)只能够支持map和reduce方法: 3)执行效率低下: 4)不适合迭代多次.交互式.流式的处理: 框架多样化: 1)批处理(离线):MapRed ...
- 与我们息息相关的internet服务(3)---电子邮件服务
几年前了解了一下,现在再实施的时候,再了解,当然如果要到牛人张小龙28岁时的开发程度,可能还差一个筋斗云 在起步一个公司,从组建的技术上,可能要准备很多东西,其中一个就是我们熟悉的企业邮箱. 伊妹儿, ...
- U-Boot Makefile分析(1)配置脚本mkconfig分析
我们在编译U-Boot之前,需要根据当前使用的板子进行配置,例如make s5p_goni_config,接着才能进行编译make.下面首先分析配置阶段U-Boot做了哪些事情. 由于执行这些命令是在 ...
- ext__给grid Panel设置绑定事件
使用面板来展示详情信息 1.创建一个面板 (双击添加) 2.给该面板设置itemid的值为:detailPanel 3.给面板设置模板 4.添加下面的内容 id:{id}</br> nam ...
- gitlab 之 升级、迁移
-----故事背景- 公司服务器用vm装的虚拟机,由于公司服务器经常无故重启,且找不到原因,所以公司准备将vm迁移至Hyper-V,Hyper-V可以自启动虚拟机且免费. -----升级.迁移- 首先 ...
- java 保证程序安全退出
以前在开发时只知道依靠数据库事务来保证程序关闭时数据的完整性. 但有些时候一个业务上要求的原子操作,不一定只包括数据库,比如外部接口或者消息队列.此时数据库事务就无能为力了. 这时我们可以依靠java ...
- C# WebSocket Fleck 调用非托管C++ DLL 实现通信(使用stringbuilder接收)
[DllImport(@"XXX.dll", CallingConvention = CallingConvention.StdCall)]public static exter ...
- Python selenium webdriver设置加载页面超时
1. pageLoadTimeout: pageLoadTimeout方法用来设置页面完全加载的超时时间,完全加载即页面全部渲染,异步同步脚本都执行完成.没有设置超时时间默认是等待页面全部加载完成才 ...
- 一篇入门 — Gatling 性能测试手册
介绍 本篇博客,旨在记录学习的要点,所以格式随意, 方便本人日后自考和回忆,有兴趣的朋友可以评论讨论. 原文地址:https://www.cnblogs.com/clockq/p/10539974.h ...