一、以实例来看springmvc各种参数绑定方式
 
先定义个dto类:
public class RestInDto implements Serializable {

    private static final long serialVersionUID = -5461373449802431627L;
private String userName;
private BigDecimal salary;
  private boolean isVip;
private int id;
......
}
  1.基本数据类型
url:http://127.0.0.1:8080/springtry/rest/getdatabinder?userName=中国龙&salary=12&id=0&vip=false 
@RequestMapping(value = "/getdatabinder", method = RequestMethod.GET)
public RestInDto testDataBinder(RestInDto restInDto){
Map<String,Object> m=new HashMap<String,Object>(); return restInDto;
}

  2.基本复合对象类型

public class CusDto {
private String userName;
...
} public class RestInDto implements Serializable { private static final long serialVersionUID = -5461373449802431627L;
private String userName;
private BigDecimal salary;
  private boolean isVip;
private int id;
private CusDto anotherDto;
...
}

url:http://127.0.0.1:8080/springtry/rest/getdatabinder?userName=中国龙&salary=12&id=0&vip=false&anotherDto.userName=中国风&vip=false

@RequestMapping(value = "/getdatabinder", method = RequestMethod.GET)
public RestInDto testDataBinder(RestInDto restInDto){
Map<String,Object> m=new HashMap<String,Object>(); return restInDto;
}

  3.基本类型数组

标红部分相同就可以了

url:http://127.0.0.1:8080/springtry/rest/getdatabinderarr?restInDto=1&restInDto=2

@RequestMapping(value = "/getdatabinderarr", method = RequestMethod.GET)
public String[] testDataBinder(String[] restInDto){
Map<String,Object> m=new HashMap<String,Object>(); return restInDto;
}

另外:如果是ajax的话ajax,客户端 data:{restInDto:[]},服务端:

public String[] testDataBinder(@RequestParam(value="restInDto[]")String[] restInDto)

  4.基本类型或由基本类型构成的自定义对象list

不能在controller方法中直接使用List<RestInDto>,而应该将List<RestInDto>作为另一个类的字段使用

public class RestInListDto {
private List<RestInDto> restIns;
...
}

url:http://127.0.0.1:8080/springtry/rest/getdatabinderlist?restIns[0].userName=中国&restIns[0].salary=12&restIns[0].id=0&restIns[0].vip=false

@RequestMapping(value = "/getdatabinderlist", method = RequestMethod.GET)
public RestInListDto testDataBinder(RestInListDto restInListDto){
Map<String,Object> m=new HashMap<String,Object>(); return restInListDto;
}

  5.基本类型或由基本类型构成的自定义对象set

与list类似,只是要定义构造函数并在其中构建set

public class RestInSetDto {
private Set<RestInDto> restIns=new HashSet<RestInDto>(); public RestInSetDto() {
this.restIns.add(new RestInDto());
}
...
}

url:http://127.0.0.1:8080/springtry/rest/getdatabinderset?restIns[0].userName=中国&restIns[0].salary=12&restIns[0].id=0&restIns[0].vip=false

@RequestMapping(value = "/getdatabinderset", method = RequestMethod.GET)
public RestInSetDto testDataBinder(RestInSetDto restInSetDto){
Map<String,Object> m=new HashMap<String,Object>(); return restInListDto;
}

ps:set有个限制,下标不能大于size()值

  6.Map

public class RestInMapDto {
private Map<String,RestInDto> restIns;
...
}

url:http://127.0.0.1:8080/springtry/rest/getdatabindermap?

  restIns['x'].userName=中国龙&restIns['x'].salary=12&restIns['x'].id=0&restIns['x'].vip=false

@RequestMapping(value = "/getdatabindermap", method = RequestMethod.GET)
public RestInMapDto testDataBinder(RestInMapDto restInMapDto){
Map<String,Object> m=new HashMap<String,Object>(); return restInMapDto;
}

二、再来看看参数绑定常用的注解

根据它们处理的Request的不同内容部分分为四类:

  • 处理request uri 部分(这里指uri template中variable,不含queryString部分)的注解:@PathVariable;
  • 处理request header部分的注解:   @RequestHeader, @CookieValue;
  • 处理request body部分的注解:@RequestParam,  @RequestBody;
  • 处理attribute类型的注解: @SessionAttributes, @ModelAttribute;
1. @PathVariable,当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。
@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController { @RequestMapping("/pets/{petId}")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
// implementation omitted
}
}

上面代码把URI template 中变量 ownerId的值和petId的值,绑定到方法的参数上。若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable("name")指定uri template中的名称

2.@RequestHeader、@CookieValue

@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。
Host                    localhost:8080
Accept text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive) { //... }

上面的代码,把request header部分的 Accept-Encoding的值,绑定到参数encoding上了, Keep-Alive header的值绑定到参数keepAlive上

@CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上

3.@RequestParam, @RequestBody

@RequestParam 
  • 常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String--> 简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值;
  • 用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST;
  • 该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定
 
@RequestBody,用于读取Request请求的body部分数据,使用系统默认配置RequestMappingHandlerAdapter的HttpMessageConverter进行解析,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上
  • post方式,解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;

因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap<String, String>里,这种情况在某些特殊需求下使用;

不能处理multipart/form-data

  • put方式,只能处理application/x-www-form-urlencoded或application/json, application/xml等,不能处理multipart/form-data
4.@SessionAttributes, @ModelAttribute

@SessionAttributes:

该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用。

该注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象

@ModelAttribute

该注解有两个用法,一个是用于方法上,一个是用于参数上;

用于方法上时:  通常用来在处理@RequestMapping方法之前,为请求request对象绑定需要从后台查询的model;

用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上,要绑定的值来源于:

  • @SessionAttributes 启用的attribute 对象上;
  • @ModelAttribute 用于方法上时指定的model对象;
  • 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中5.@ResponseBody

    作用:

该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

 
 
从前面第一部分的绑定方式看, 并没有给定参数注解,但达到相同的效果,这是因为RequestMappingHandlerAdapter在方法的参数在不给定参数注解的情况下:

若要绑定的是简单类型:  调用@RequestParam来处理

若要绑定的是复杂对象类型:  调用@ModelAttribute来处理

 
 
 
 

springmvc(2)--参数绑定的更多相关文章

  1. (转)SpringMVC学习(六)——SpringMVC高级参数绑定与@RequestMapping注解

    http://blog.csdn.net/yerenyuan_pku/article/details/72511749 高级参数绑定 现在进入SpringMVC高级参数绑定的学习,本文所有案例代码的编 ...

  2. SpringMVC学习--参数绑定

    spring参数绑定过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上.springmvc中,接收页面提交的数据是通过方法形参来接收 ...

  3. SpringMVC(三) —— 参数绑定和数据回显

    参数绑定的过程:就是页面向后台传递参数,后台接受的一个过程. 默认支持的参数类型:(就是你在方法上以形参的形式去定义一下的类型,就可以直接使用它) HttpServletRequest HttpSer ...

  4. springmvc(三) 参数绑定、

    前面两章就介绍了什么是springmvc,springmvc的框架原理,并且会简单的使用springmvc以及ssm的整合,从这一章节来看,就开始讲解springmvc的各种功能实现,慢慢消化 --W ...

  5. SpringMVC【参数绑定、数据回显、文件上传】

    前言 本文主要讲解的知识点如下: 参数绑定 数据回显 文件上传 参数绑定 我们在Controller使用方法参数接收值,就是把web端的值给接收到Controller中处理,这个过程就叫做参数绑定.. ...

  6. SpringMVC中参数绑定

    SpringMVC中请求参数的接收主要有两种方式, 一种是基于HttpServletRequest对象获取, 另外一种是通过Controller中的形参获取 一  通过HttpServletReque ...

  7. SpringMVC学习笔记之二(SpringMVC高级参数绑定)

    一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...

  8. SpringMVC高级参数绑定(数组和List)

    本节内容: 参数绑定之数组 将表单的数据绑定到List 复制下上篇博客中的工程,作为今天开发的工程. 一.参数绑定之数组 1. 需求 在商品列表页面选中多个商品,然后删除. 2. 需求分析 功能要求商 ...

  9. 什么是springMvc的参数绑定?

    参数绑定通俗来讲就是从页面传过来的数据通过SpringMvc进行接收.接收的数据类型可以有: (1)SpringMvc默认支持的类型:request.session.application等. (2) ...

随机推荐

  1. Spring4.0+Hibernate4.0+Struts2.3整合包括增删改查案例,解决整合中出现的异常

    源码下载:http://download.csdn.net/detail/cmcc_1234/7034775 ======================Application.xml======== ...

  2. Eclipse 和 NetBeans 快捷键即其他常用功能比较

    按: 自己用 Eclipse, 常用的也就这些功能, 在用 NetBeans 时, 有些不顺手, 因此列表如下. Eclipse和NetBeans常用快捷键对比:  功能  Eclipse     N ...

  3. Flex 拾色器改变背景

    package {  import flash.display.*; import flash.geom.*; import flash.utils.*;  import mx.core.EdgeMe ...

  4. 【官方文档】Hadoop分布式文件系统:架构和设计

    http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html 引言 前提和设计目标 硬件错误 流式数据访问 大规模数据集 简单的一致性模型 “移动计 ...

  5. 【转】Android 防破解技术简介

    http://www.cnblogs.com/likeandroid/p/4888808.html Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是 ...

  6. 关于Java中的程序,进程和线程的详解...

    程序:一段静态的代码,一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体,是应用软件执行的蓝本. 进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个 ...

  7. Codeforces Round #338 (Div. 2) E. Hexagons 讨论讨论

    E. Hexagons 题目连接: http://codeforces.com/contest/615/problem/E Description Ayrat is looking for the p ...

  8. Codeforces Educational Codeforces Round 3 B. The Best Gift 水题

    B. The Best Gift 题目连接: http://www.codeforces.com/contest/609/problem/B Description Emily's birthday ...

  9. Theatre Square

    http://codeforces.com/problemset/problem/1/A Theatre Square time limit per test 2 seconds memory lim ...

  10. 【AngularJS】AngularJS 教程

    AngularJS通过新的属性和表达式扩展了HTML.------------->扩展HTML属性 AngularJS可以构建一个单页面应用程序(SPAs: Single Page Applic ...