博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring MVC 获取前端参数的注解
阅读量:5063 次
发布时间:2019-06-12

本文共 2500 字,大约阅读时间需要 8 分钟。

在与前端交互的开发过程中,出现过几次无法取到参数的情况,费了些时间去排查问题,下面就简单总结一下。

注解详解

我们所要获取的前端传递参数大概可以分为以下四类:

  • requet uri 部分的注解:@PathVariable
  • request header部分的注解:@RequestHeader, @CookieValue
  • request body部分的注解:@RequestParam,  @RequestBody
  • attribute 类型是注解: @SessionAttributes, @ModelAttribute

@PathVariable

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

代码示例:

GET模式下,使用@PathVariable绑定输入参数,非常适合Restful风格。因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险;

POST模式下,没什么必要用这个方式,毕竟参数都暴露在url上面了。

@RequestHeader

注解 可以把Request请求header部分的值绑定到方法的参数上,如果,@RequestHeader绑定的参数,在请求头部并没有的话,会报错,比如Cookie。

@CookieValue

可以把Request header中关于cookie的值绑定到方法的参数上。我并没有实际使用过~

@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

  • 处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,如:application/json ,application/xml等;
  • 通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。

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

使用时机

A) GET、POST方式提时, 根据request header Content-Type的值来判断:

  •     application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
  •     multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
  •     其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

  •     application/x-www-form-urlencoded, 必须;
  •     multipart/form-data, 不能处理;
  •     其他格式, 必须;

说明:request的body部分的数据编码格式由header部分的Content-Type指定; 

@SessionAttributes  (没用过~~)

@ModelAttribute 

问题修改:

前端ajax请求,post方式,请求头 :Content-Type:
application/json
后台获取方式:
 
这个时候后台取不到参数,因为前端不是使用Form提交的,parameter里面是没有参数值的
修改为:
 
使用@RequestBody 注解,将参数转为对象,直接取对象值
前端ajax请求,get方式,能取到

使用时机

  application/x-www-form-urlencoded application/json ,application/xml multipart/form-data 单个参数 对象
@PathVariable GET、POST(并没有什么意义) GET、POST(并没有什么意义) GET、POST(并没有什么意义)    
@RequestHeader GET、POST GET、POST GET、POST    
@CookieValue GET、POST GET、POST GET、POST    
@RequestParam GET、POST       ——        ——

    √

    ——
@RequestBody GET、POST GET、POST        ——   ——

 

@ModelAttribute GET、POST       ——        ——

  ——

 √

@SessionAttributes          

转载于:https://www.cnblogs.com/koal/p/6266495.html

你可能感兴趣的文章
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
几款Http小服务器
查看>>
iOS 数组排序
查看>>
第三节
查看>>
PHP结合MYSQL记录结果分页呈现(比较实用)
查看>>
Mysql支持的数据类型
查看>>
openSuse beginner
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
Windows7中双击py文件运行程序
查看>>
Market entry case
查看>>
bzoj1230 开关灯 线段树
查看>>
LinearLayout
查看>>
学习python:day1
查看>>
css3动画属性
查看>>
Mongodb 基本命令
查看>>