前后端参数传递 Spring MVC和jQuery.Ajax参数对应上的理解 页面传输问题汇总

 

时间:2018年12月——实践出真知

今天在做前后端传值的时候遇到了很大的问题,所以趁着这个机会整理一下:

一、spring MVC的常用注解核心一览

@Controller——标记一个控制器类

@RequestMapping——处理类和方法发送请求动作

所有的方法都将映射为相对于类级别的请求,表示该控制器处理的所有请求都被映射到value属性所指示的路径下。

绑定参数的注解

Spring MVC中用于参数绑定的注解有很多,都在org.springframework.web.bind.annotation包中,根据它们处理的request的不同内容可以分为四类(常用的类型)。

第一类:处理request body部分的注解有:@RequestParam和@RequestBody
第二类:处理requet uri部分的注解有:@PathVaribale
第三类:处理request header部分的注解有:@RequestHeader和@CookieValue
第四类:处理attribute类型的注解有:@SessionAttributes和@MoelAttribute

@PathVaribale——获得请求url中的动态参数。

@RequestParam——将指定的请求参数赋值给方法中的形参

这个注解等同于request.getParameter()

@ResponseBody——

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

目前常用的就这些,以后有机会再补充。

二、Ajax常用参数一览

  • type——类型,"POST"或者"GET",默认是"GET"。
  • url——发送请求的地址。
  • data——是一个对象,连同请求发送到服务器的数据
  • dataType——预期服务器返回的数据类型。如果不指定,jQuery将自动根据HTTP包含的MIME信息来智能判断,一般我们采用json个数,可以设置为"json"。
  • success——一个方法,请求成功后的回调函数。传入返回后的数据,以及包含成功代码的字符串。
  • error——一个方法、请求失败时调用此函数。传入XMLHttpRequest对象。
  • contentType——内容类型,ajax的contentType是设置的http的请求头,这个请求头的目的是告诉服务器端,我的请求参数是什么格式的数据,你要按照对应的格式去处理。contentType设置发送信息至服务器时内容编码类型。
contentType

类型:

String或Boolean

默认值:

'application/x-www-form-urlencoded; charset=UTF-8'

取值:

application/x-www-form-urlencoded  默认值

multipart/form-data 上传文件时用

application/json  用来告诉服务端消息主体是序列化后的 JSON 字符串

text/xml  忽略xml头所指定编码格式而默认采用us-ascii编码

text/plain  无格式正文,文本

text/html  html格式的正文

三、对应关系

(个人理解)

在进行前后端参数传递的时候,是两边接口接洽的过程,只有两边的参数(注解)配置完全对应上,才是一个正确的传递操作。

这里,我们以页面为主,因为页面是主动提供的一方,而controller是被动接受的一方。

  • url和@PathVaribale    ——当你觉得参数太少,仅仅只想用url动态传递参数的时候,当你ajax中的url有参数的时候,那么你就应该使用注解@PathVaribale,他是专门获取url中的参数的注解。当然也可以在url中动态给出几个数据,@PathVaribale也可以同时接受几个数据,大致的写法是:value = "/savetitle/{doctorId}/{titleId}"

 

  • dataType和@ResponseBody    ——他是用来预期服务器返回的数据类型,以方便你在回调函数中读取,那么我们常用的就是“text”和“json”了,但是要命的是,在spring MVC的controller中,如果你的返回值类型如果是String那么他会理解为你返回的是视图,而不是结果。所以在controller中基本上所有的不是返回modelandview的方法都会用@ResponseBody修饰,因为这个注释会主动的将你的返回值写入到Response对象的body数据区。而你如果不用他,又偏偏要返回结果到页面,那么你只有采用流的方式了。

 

  • contentType和@RequestBody和@RequestParam    ——contentType是用来指明你传递的参数的类型的参数,默认值为'application/x-www-form-urlencoded; charset=UTF-8',不需要管他,常用值为:application/json。

 

contentType参数一参数二结果

你在页面上写下的值为

application/json

@RequestParam

@RequestParam

方法找不到,进不去方法,页面报错400()

@RequestBody

@RequestParam

方法找不到,进不去方法,页面报错400()

@RequestBody

@RequestBody

页面无报错,方法已执行,但是参数匹配有问题

第一个参数接收到了body的全部值:name=3&city=15

第二个参数为空值,没有参数匹配进来

理解:用@RequestBody修饰的参数可以理解为假参数,用@RequestParam修饰的参数可以理解为真参数。

在参数列表的层次上,RequestParam是对方法的入口有直接影响的。

用@RequestParam修饰以后他会把请求中的body部分注入到参数中,但是只会注入第一个。

contentType的值为application/json后,页面RequestBody注解的参数会对其进行解析,解析的层次不知。

你在页面上写下的值为

application/x-www-form-urlencoded

@RequestParam

@RequestParam

页面无报错,执行成功回调函数,controller已执行

数据doctorId:3
数据titleId2:15

正常

@RequestParam

@RequestBody

页面无报错,执行成功回调函数,controller已执行

数据doctorId:3
数据titleId2:name=3&city=15

第一个参数获取到正确值,第二个获取全部

@RequestBody

@RequestBody

页面无报错,执行成功回调函数,controller已执行

数据doctorId:name=3&city=15
数据titleId2:name=3&city=15

两个参数都获取到所有的数据

理解:@RequestParam这个注解等同于request.getParameter(),在页面上的值为默认值时,在取值上没有其他问题。以键值对形式可以获取到需要的参数。

在默认值得情况下,以@RequestBody修饰,无论什么情况都会将请求中的body全文注入给参数。

以上测试仅仅在于页面传送数据不复杂的情况下,两个传递的参数都是String类型,不需要过多的包装或者解析。有效的使用application/json和@RequestBody注解,能够进行bean注入,减少很多不必要的操作。

四、data常见的几种写法

data是比较常用的参数了,而他的写法也根据每个人的习惯有很多种,下面列举经常看到的几种:(以两个参数为例)

//参数名带引号
data:{
    "name" : doctorId,
    "city" : titleId
},

 结果打印:数据doctorId:3     数据titleId:15

//参数名不带引号
data:{
    name : doctorId,
    city : titleId
}

 结果打印:数据doctorId:3     数据titleId:15 

//参数名不带引号
data:{
    name : "doctorId",
    city : titleId
}

 结果打印:数据doctorId:doctorId     数据titleId:15 

推荐博文:

post、ajax讲解,请求消息头:http://www.cnblogs.com/starof/p/6434791.html

注解详解大体:http://www.cnblogs.com/leskang/p/5445698.html

注解细节理解:https://www.aliyun.com/jiaocheng/790128.html

post、ajax、get讲解:https://blog.csdn.net/huileiforever/article/details/12163385

ajax参数详解:http://www.w3school.com.cn/jquery/ajax_ajax.asp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值