一文读懂JavaWeb,前后端数据交互原来是这样的

一、HTTP是前后端数据交互的载体

Request的请求体中负载着前端向后端发送请求的数据;
Response的响应体中负载着后端向前端返回响应的数据;

当然,Request的请求行中的URL中也可以负载着前端向后端发送请求的数据,这个后面会详细说明。

1. HTTP Request

Request模型
在这里插入图片描述

Request实例
在这里插入图片描述

2. HTTP Response

Repsonse模型
在这里插入图片描述
Response实例
在这里插入图片描述

二、数据交互格式 JSON

1. JSON对象与JSON字符串

  • JSON字符串就是符合JSON语法的字符串
  • 每一种语言都有自己的JSON语法,所以每一种语言都有自己形式的JSON字符串和符合自己形式的JSON对象。

2. 不同语言中的JSON对象与JSON字符串互换

JavaScript

// json字符串转json对象,调用parse方法:
//符合JSON语法的对象,所以是JSON字符串
var person='{"name":"zhangsan","sex":"男","age":"24"}';
var personObject = JSON.parse(person);
alert(personObject.name);//zhangsan

// json对象转为json字符串,调用stringify方法:
//符合JSON语法的对象,所以是JSON对象
var person={"name":"zhangsan","sex":"男","age":"24"};
var personString = JSON.stringify(person);
alert(personString);

Java

// json对象转json字符串,以JSONObject为中介
Student stu=new Student();
stu.setName("JSON");
stu.setAge("23");
stu.setAddress("北京市西城区");
JSONObject json = JSONObject.fromObject(stu);
String strJson=json.toString();
System.out.println("strJson:"+strJson); // trJson:{"address":"北京市西城区","age":"23","name":"JSON"}


// json字符串转json对象
String objectStr="{\"name\":\"JSON\",\"age\":\"24\",\"address\":\"北京市西城区\"}";
JSONObject jsonObject=JSONObject.fromObject(objectStr);
Student stu=(Student)JSONObject.toBean(jsonObject, Student.class);
System.out.println("stu:"+stu); //stu:Student [name=JSON, age=24, address=北京市西城区]

三、前端如何发送数据

1. 表单发送数据

利用form表单进行传递:form表单中的有一个action属性,向后端提交数据可以利用action,action后面接的就是后台处理的url

<form action="${pageContext.request.contextPath}/login.action" method="post">
   用户名<input type="text" name="username"><br>
   密码<input type="password" name="password"><br>
</form>

2. JSON对象发送数据

  <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
  <script>
  <!--Json对象-->
    var user = {
      "username": "hahah",
      "password": "123456"
    };

    $.ajax({
      url:"/testJson",
      type: "GET",
      async: true,
      data: user,//Json对象
      dataType: 'json',
      success: function (data) {

      }
    });
  </script>

3. JSON 字符串方式

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

  <script>
    var user = {
      "username": "hahah",
      "password": "123456"
    };

    $.ajax({
      url:"/testJson3",
      type: "POST",
      async: true,
      contentType: "application/json;charset=UTF-8", //使用 application/json;charset=UTF-8
      data: JSON.stringify(user), //将JSON对象转换为JSON字符串
      dataType: 'json',
      success: function (data) {

      }
    });
  </script>

四、前端如何接收数据

写Ajax代码访问后端接口

$.ajax({
        url:'/heap',	//这是后端接口的url
        method:'get',
        success:function (res) {
            //res便是的数据便是后端拿到的数据
            //这里需要注意:res为局部变量,
            //所以需要在方法外定义一个变量把res赋值给他,才能在方法之外使用。
        },
    })

此时res就是JSON对象,这是因为:@ResponseBody注解主要是用来返回json数据给前端,如果你很懒,只想返回一个对象,那么加上@ResponseBody可以实现将返回的对象自动转换为json传返回给前端。

但是不是说json有两种格式嘛…一个json对象,一个json字符串。你怎么证明你获得的就是json对象而不是json字符串呢。在前端代码中只需修改一处即可证明
在这里插入图片描述
如果是对象,那么就有属性,我就来打印这个属性,有数据就可以说明是json对象
在这里插入图片描述

五、后端如何请求数据

1. get 请求 和 post请求

- get请求不存在请求实体部分,键值对参数放置在 URL 尾部;
- get请求存在请求实体部分,键值对参数放置在 请求的请求体;

- get和post相比,要快,是因为get和post的请求过程不同,不多前三步都是一样的,都是要先经过和服务器的三次握手:
1.浏览器请求tcp连接(第一次握手)
2.服务器答应进行tcp连接(第二次握手)
3.浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
  get请求在第四步就会接收到了服务器返回的数据,而post请求在第四步是接收到服务器发送的100 continue指令,客户端在发送数据请求服务端,服务端才会去返回数据,
  就是说POST比GET多进行了一次客户端和服务器的打交道,GET请求产生了一个TCP数据包,而POST请求产生了两个TCP数据包

2. @RequestParam

@RequestParam绑定参数机制
- 如果不写@RequestParam(xxx)的话,那么会自动匹配方法参数,如果命名不同会默认接收为空。

@RequestParam有三个配置参数:
- required 是否必须传递参数,默认为 true,必须。
- defaultValue 可设置请求参数的默认值。
- value 为接收url的参数名(相当于key值)。

表单格式 +GET
如果http请求是GET,则表单参数会以放入URL的查询参数中,例如:

// http://localhost:port/form?phone=roger&password=123456

@RequestMapping("form")
@ResponseBody
public User form(@RequestParam("phone")String phone,@RequestParam("password")String password){
    return new User(phone,password);
}

表单格式+POST
如果请求方法是POST,表单数据存在请求体中。可以在Controller方法参数上加上@RequestParam将数据绑定在参数上。

// http://localhost:port/form

@RequestMapping("form")
@ResponseBody
public User form(@RequestParam("phone")String phone,@RequestParam("password")String password){
    return new User(phone,password);
}

3. @RequestBody

表单格式+POST

// http://localhost:port/form1

@RequestMapping("form1")
@ResponseBody
public User form1(@RequestBody MultiValueMap<String,String> user){
    String phone = user.getFirst("phone");
    String password = user.getFirst("password");
    return new User(phone,password);
}

JSON格式+POST
body 里面的 json 语句的 key 值要与后端实体类的属性一一对应。

@Controller
@RequestMapping(value = "saveUser", method=RequestMethod.POST ) 
@ResponseBody  
public void saveUser(@RequestBody User user) { 
    userService.batchSave(user); 
} 

六、后端如何返回数据

@ResponseBody注解主要是用来返回json数据给前端,如果你很懒,只想返回一个对象,那么加上@ResponseBody可以实现将返回的对象自动转换为json传返回给前端。

  • 17
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java前后端数据交互可以通过HTTP协议进行。前端可以使用HTTP Request向后端发送数据,后端可以使用HTTP Response返回数据前端数据交互的格式可以使用JSON对象或JSON字符串。前端可以使用表单发送数据,也可以使用JSON对象或JSON字符串的方式发送数据。后端可以使用get请求或post请求来接收数据,并可以使用@RequestParam或@RequestBody注解来获取数据。返回数据时,后端可以将数据转换为JSON对象或JSON字符串的形式返回给前端。 示例代码: 前端发送数据的示例: 1. 使用表单发送数据: ```html <form method="post" action="/api/endpoint"> <input type="text" name="username" /> <input type="password" name="password" /> <button type="submit">Submit</button> </form> ``` 2. 使用JSON对象发送数据: ```javascript var data = { username: "admin", password: "123456" }; $.ajax({ type: "POST", url: "/api/endpoint", data: JSON.stringify(data), contentType: "application/json", success: function(response) { // 处理返回的数据 } }); ``` 后端接收数据的示例: 1. 使用@RequestParam注解获取表单数据: ```java @PostMapping("/api/endpoint") public String handleRequest(@RequestParam String username, @RequestParam String password) { // 处理接收到的数据 return "success"; } ``` 2. 使用@RequestBody注解获取JSON对象数据: ```java @PostMapping("/api/endpoint") public String handleRequest(@RequestBody User user) { // 处理接收到的数据 return "success"; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值