SpringMVC 获取请求参数
方式一:接收默认支持的参数类型
1. HttpServletRequest
2. HttpServletResponse
3. HttpSession
4. Model
除了 ModelAndView 以外,还可以使用 Model 来向页面传递数据,Model 是一个接口,在参数里直接声明 model 即可。如果使用 Model 则可以不使用 ModelAndView 对象,Model 对象可以向页面传递数据,View 对象则可以使用 String 返回值替代。不管是 Model 还是 ModelAndView,其本质都是使用 Request 对象向 jsp 传递数据。
5. ModelMap
ModelMap 是 Model 接口的实现类,也可以通过 ModelMap 向页面传递数据。使用 Model 和 ModelMap 的效果一样,如果直接使用 Model,springmvc 会实例化 ModelMap。
方式二:接收简单类型参数
- Integer int Integer[] int[]
- Float float Float[] float[]
- Double double Double[] double[]
- Boolean boolean(对于布尔类型的参数,请求的参数值为 true 或 false。或者 1 或 0)
- String String[]
扩展一:SpringMVC 只能接收简单类型。如果接收其他类型的参数会报错
由于接收的是 Date 类型,框架会直接报错,并且根本不会进入 URL 对应的方法中。
扩展二:@RequestParam 注解
@RequestParam 常用于处理简单类型的绑定,该注解有如下属性:
- value 属性:用于指定请求参数的名称。如 value=“itemId”表示请求的参数区中的名字为 itemId 的参数的值将传入该注解所对应参数中。
- required 属性:表示该属性是否必须,默认是 true,表示请求中一定要有相应的参数,否则将报错(前端页面显示:TTP Status 400 - Required Integer parameter 'XXXX' is not present)。
- defaultValue:默认值,指定如果请求中没有同名参数时的默认值。
方式三:通过封装类型接收参数
当参数很多时通过上一中方法就不太方便,此时可以采用 JavaBean 接收参数;JavaBean 中的属性值一定要与前端表单元素的 name 属性值一 一对应。
扩展
封装类型中的属性也一定要是基本类型,例如:Items 类中的 createtime 属性是 Date 类型,我们前端传入的参数一定不能包含 createtime,不然会报错。
如果封装类型中仍然包含封装类型,我们想用里面的对象接收参数,则在前端页面的 name 属性写成对象导航的形式即可
方式四:自定义参数类型转换
由于日期数据有很多种格式,springmvc 没办法把字符串转换成日期类型。所以需要自定义参数绑定。
自定义参数类型转换原理:前端控制器接收到请求后,找到注解形式的处理器适配器,对 RequestMapping 标记的方法进行适配,并对方法中的形参进行参数绑定。可以在 springmvc 处理器适配器上自定义转换器 Converter 进行参数绑定。一般使用 mvc:annotation-driven/ 注解驱动加载处理器适配器,可以在此标签上进行配置。配置转换器后,会将转换后的类型绑定到参数上面。
第一步:自定义转换器
需要实现转换 Converter 接口(spring-core 包中的)
第二步:配置 converter(转换器)
如果我们在框架搭建时,没有配置 mvc 注解驱动,而是通过手动配置处理器映射器与处理器适配器,那么我们应该采用此种方式配置转换器:
方式五:List 集合封装多个对象,一次接收多批数据
如果封装类中是 domain 对象数组,同样可以接收对象的数组形式(效果和上面一样):
public class QueryVo{
private Items[] itemsList;
}
List<Items>
和 Items[] 只能先由一个类封装,然后由封装类接收参数,如果试图将它们直接放在方法上面接收参数则会报错。如果是基本类型的数组,直接放在方法参数上面是可以的。基本类型的 List 不能作为方法参数。基本类型的数组以及基本类型 List 可以放在封装类型中。
方式六:从 URL 上获取参数
通常我们通过 get 提交请求参数时都是 URL 路径后加问号,然后连接参数列表。但这样做显得 URL 路径不够简洁,别人一看就知道问号后面的是请求参数,我们可以通过下列这种方式,将请求参数包含在 URL 路径当中。
如果 @PathVariable 注解所对应的参数名,与 URL 路径中的大括号中写的名不相同,则需要通过 @PathVariable("xxx") 指定。
方式七:从 Body 中获取复杂对象
复杂对象数组:
[
{
"colData": "a",
"colDisplay": "a",
"colName": "a",
"colPref": "a"
},
{
"colData": "a",
"colDisplay": "a",
"colName": "a",
"colPref": "a"
},
{
"colData": "a",
"colDisplay": "a",
"colName": "a",
"colPref": "a"
}
]
向这种复杂对象的数组可以由 Body 传输后接收:
public Dto<Object> saveConditions(@RequestBody List<QueryCondition> conditions) {}
public class QueryCondition {
private String colName;
private String colDisplay;
private String colData;
private String colPref;
//省略 Getter/Setter
}
如果单独创建一个对象不方便的话,用 List<Map>
接收也可以:
public Dto<Object> saveConditions(@RequestBody List<Map<String,String>> conditions) {}
包含数组的复杂对象:
{
"id": "aaa",
"conditions": [
{
"colData": "a",
"colDisplay": "a",
"colName": "a",
"colPref": "a"
},
{
"colData": "a",
"colDisplay": "a",
"colName": "a",
"colPref": "a"
},
{
"colData": "a",
"colDisplay": "a",
"colName": "a",
"colPref": "a"
}
]
}
类似于上面的结构,采用下面这种方式接收是不行的:
可以采用 Map 接收:
public Dto<Object> saveConditions(@RequestBody Map<String,Object> obj) {}
也可以采用封装类接收:
public Dto<Object> saveConditions(@RequestBody QueryVo obj) {}
public class QueryVo {
private String id;
private List<QueryCondition> conditions;
//省略 Getter/Setter
}
public class QueryCondition {
private String colName;
private String colDisplay;
private String colData;
private String colPref;
//省略 Getter/Setter
}
总结
方式二和方式三可以混合使用,如果封装类型中的属性和局部变量的名称相同,则两个都会同时接收参数。
方法的参数只能接收基本类型及其封装类型,以及基本类型和封装类型的数组(注意:是基本类型的数组)。如果想接收 List(包括泛型为基本类型,和 domain 封装类)或者用户封装类(domain)的数组,必须由封装类封装 List<Domain>
或 Domain[],然后通过对象导航的方式插入数据。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论