时间: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 正常 |
@RequestParam | @RequestBody | 页面无报错,执行成功回调函数,controller已执行 数据doctorId:3 第一个参数获取到正确值,第二个获取全部 | |
@RequestBody | @RequestBody | 页面无报错,执行成功回调函数,controller已执行 数据doctorId: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