前后台交互传参及json的使用

对于后台开发人员来说,最烦心的事莫过于和前端打交道;同样的对于一个前端开发人员来说,也莫过于和后台开发打交道。

废话不多说,今天我就是来解决这个问题,让后台和前端能够愉快的相处。文章不足之处,请多指正。

前后端交互,主要的工作无外乎是传递参数和返回参数

首先说前端传递参数:

一般参数都是以json格式传到后台,首先对json做下简单的介绍:

一、json

1、json的使用

JSON有两种结构

json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构

  • 1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
  • 2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

示例:

{

    "animals": {

        "dog": [

            {

                "name": "Rufus",

                "age":15

            },

            {

                "name": "Marty",

                "age": null

            }

        ]

    }

}

2、json的语法

JSON 语法是 JavaScript 对象表示语法的子集。

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号保存对象
  • 中括号保存数组

JSON 值可以是:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在中括号中)
  • 对象(在大括号中)
  • null
  1. 示例
var sites = [ { "name":"runoob" , "url":"www.runoob.com" }, { "name":"google" , "url":"www.google.com" }, { "name":"微博" , "url":"www.weibo.com" } ];

可以像这样访问 JavaScript 对象数组中的第一项(索引从 0 开始):

sites[0].name;结果为runoob

 

3、JSON.parse()方法

JSON 通常用于与服务端交换数据。

在接收服务器数据时一般是字符串。

我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。

例如我们从服务器接收了以下数据:

{ "name":"李白", "age":20, "add":"四川" }

我们使用 JSON.parse() 方法处理以上数据,将其转换为 JavaScript 对象:

var obj = JSON.parse('{ "name":"李白", "age":20, "add":"四川" }');

obj.name 取值即为“李白”

 

4、JSON.stringify()

JSON 通常用于与服务端交换数据。

在向服务器发送数据时一般是字符串。

我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串。

例如我们向服务器发送以下数据:

var obj = { "name":"李白", "age":20, "add":"四川" }

我们使用 JSON.stringify() 方法处理以上数据,将其转换为字符串:

var myJSON = JSON.stringify(obj);

myJSON 为字符串。

我们可以将 myJSON 发送到服务器

二、接受参数的方式

  1. @requestBody接受参数。

content-type为application/json或者是application/xml等,不是默认的application/x-www-form-urlcoded编码的内容。

@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,后来发现用 JSON.stringify(data)的方式就能将对象变成字符串。同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样就可以轻易的将一个对象或者List传到Java端,使用@RequestBody即可绑定对象或者List.

例如1:ajax请求

 

Controller接收:

 

2.HttpServletRequest 接受参数。

content-type为application/x-www-form-urlcoded编码的内容。

Web服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest和HttpServletResponse对象,向客户端发送数据找HttpServletResponse,从客户端取数据找HttpServletRequest.

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

主要功能:参数解析,Cookie读取,http请求字段,文件上传

@RequestMapping(value = "/getDate")

@ResponseBody

public String getDate(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {

    String string = httpServletRequest.getParameter("name");

    return "html";

}

 

2.1也可以直接用属性接受

@RequestMapping(value = "/getDate")

@ResponseBody

public String getDate(String name) {

    String string = httpServletRequest.getParameter("name");

    return "html";

}

 

2.2也可以用@RequestParam接受

@RequestMapping(value = "/getDate")

@ResponseBody

public String getDate(@RequestParam(value="name") String userName) {

System.out.print(userName);

    return "html";

}

当前台界面使用GET或POST方式提交数据时,数据编码格式由请求头的ContentType指定。分为以下几种情况:
1. application/x-www-form-urlencoded,这种情况的数据@RequestParam、@ModelAttribute、HttpServletRequest 可以处理,@RequestBody也可以处理。
2. multipart/form-data,@RequestBody不能处理这种格式的数据。(form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data,意思是以二进制流的形式传输文件。)
3. application/json、application/xml等格式的数据,必须使用@RequestBody来处理。

 

3、@PathVariable就收url中的参数

@RestController

public class HelloController {

@RequestMapping(value="/hello/{id}",method= RequestMethod.GET)

public String sayHello(@PathVariable("id") Integer id){

return "id:"+id;

}

未完待续~~~~~~~~~~

你可能感兴趣的:(前后端交互)