一、以实例来看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. LEARUN 开发框架 /aspnetboilerplate ----上海力软信息技术有限公司

    LEARUN 开发框架 ----上海力软信息技术有限公司 http://www.learun.cn/ aspnetboilerplate    http://www.aspnetboilerplate ...

  2. 全世界最短IE判定if(!+[1,])的解释(转)

    全世界最短IE判定if(!+[1,])的解释   虽然从司徒先生的博客上看到 全世界最短的IE判定 很长时间了,却一直对于原理没怎么去细看,今天同事(也是一后台程序员,并非前端)又问到这个问题,于是我 ...

  3. MySQL事务处理和锁机制

    事务处理和并发性 1.1 基础知识和相关概念 1 )全部的表类型都可以使用锁,但是只有 InnoDB 和 BDB 才有内置的事务功能. 2 )使用 begin 开始事务,使用 commit 结束事务, ...

  4. CMSIS Example - Signal and Yield

    /*---------------------------------------------------------------------------- * RL-ARM - RTX *----- ...

  5. Cross-Browser HTML5 Placeholder Text

    One of the nice enhancement in HTML5 web form is being able to add placeholder text to input fields. ...

  6. MySQL中你肯定不知道的int隐情

    MySQL中定义id字段为int类型,但是你知道它内部是什么玩意吗? 1.如果定义int类型,但是不声明长度,系统默认为11个长度(这个大家都知道): 2.如果指定长度小于11,实际上系统还是默认为1 ...

  7. Java数据结构之线性表

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  8. 稀疏自动编码之反向传播算法(BP)

    假设给定m个训练样本的训练集,用梯度下降法训练一个神经网络,对于单个训练样本(x,y),定义该样本的损失函数: 那么整个训练集的损失函数定义如下: 第一项是所有样本的方差的均值.第二项是一个归一化项( ...

  9. Java IO之File

    FILE类是用来实现获取文件.文件夹的类库工具,File并不是像类名所表示的那样仅仅是用来表示文件.它还能够用来表示文件夹. 所以能够用File来获取一个文件夹下的全部文件,甚至是文件夹中的文件. 一 ...

  10. TP复习11

    ## ThinkPHP 3.1.2 模板中的基本语法#讲师:赵桐正微博:http://weibo.com/zhaotongzheng 本节课大纲:一.导入CSS和JS文件 1.css link js ...