SpringMVC中的Json交互

1.控制器向前端响应json数据

这种形式在程序中使用最为广泛,也是现在前后端分离项目开发的必选方式。我们以实例的形式来展示一下json的使用。
直接访问index.jsp页面,以ajax异步的形式访问控制器,控制器中返回一个user对象给index.jsp页面。在这里必须注意一个问题,User类要实现序列化接口Serializable。实现这个接口,表示这个类可以是被序列化了。项目搭建,如下所示:

User类

package com.gxy.entity;

import java.io.Serializable;

/**
 * @className: PACKAGE_NAME.com.gxy.entity.User
 * @description: TODO
 * @author: ych
 * @create: 2021-06-02 21:31
 */
public class User implements Serializable {
    String username;
    String userpwd;
    int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserpwd() {
        return userpwd;
    }

    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", userpwd='" + userpwd + '\'' +
                ", age=" + age +
                '}';
    }
}

1.添加依赖

我们采用的是阿里的fastjson来转换对象数据成json字符串,在pom.xml文件中添加fastjson的依赖。

<!-- fastjson -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.58</version>
</dependency>

2.修改配置文件

替换掉SpringMVC默认的信息转换器,在spring-mvc文件中添加如下配置:

<mvc:annotation-driven>
  	<mvc:message-converters register-defaults="true">
       <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
           <!-- 添加支持的数据类型 -->
           <property name="supportedMediaTypes">
               <list>
                   <!-- 注意顺序不能反,避免ie出现下载情况 -->
                   <value>text/html;charset=UTF-8</value>
                   <value>application/json;charset=UTF-8</value>
               </list>
           </property>
       </bean>
   	</mvc:message-converters>
</mvc:annotation-driven>

3.添加controller代码

在控制器controller中,我们需要把controller的返回值设置为User,添加上注解 @ResponseBody,该注解的作用其实是将Java对象转为json格式的数据。

 @RequestMapping("/getUser.do")
 @ResponseBody
 public User test() {
    User user = new User();
    user.setUsername("张三");
    user.setUserpwd("123");
    user.setAge(18);
    return user;
 }

4.添加前台代码

在index.jsp中,使用ajax向控制器请求数据,直接获取json格式的数据。

<script>
    $(function () {
        $.ajax({
            url:"${pageContext.request.contextPath}/getUser.do",
            type:"post",
            dataType:"json",
            success:function (result) {
                console.log(result);
            }
        })
    })
</script>

5.控制台结果

在这里插入图片描述

2.前端向控制器响应json数据

在前后端分离的项目中,前端提交的数据也可能是json格式的,我们在前面已经使用 @RequestParam 注解,这个注解只能获取key-value形式的参数,如果要获取json格式中的参数,就需要使用注解 @RequestBody。简单做一个总结,@RequestBody主要用来接收前端传递给后端的json字符串中的数据(请求中的数据)。GET方式无请求体,所以 @RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。
在后端的同一个接收方法里,@RequestBody@RequestParam()可以同时使用,@RequestBody最多只能有一个,用来接收请求体中的json字符串,而 @RequestParam() 可以有多个,用于接收url中k-v参数的传递。
示例:

package com.gxy.entity;

import java.io.Serializable;
import java.util.Date;

/**
 * @className: PACKAGE_NAME.com.gxy.entity.User
 * @description: TODO
 * @author: ych
 * @create: 2021-06-02 21:31
 */
public class User implements Serializable {
    int id;
    String username;
    Date birthday;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

1.添加依赖

在这里使用fastjson完成数据的转换处理,在pom.xml文件中添加fastjson的依赖。

<!-- fastjson -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.58</version>
</dependency>

2.添加前台代码

在index.jsp中添加上以下的 jquery代码,其中data是我们定义的一个 json对象,这个 json对象中封装了数据,使用ajax把处理之后的json对象提交到控制器controller中。如下所示:

$(function () {
    var data = {"username":"张三","userpwd":"123","age":18}
    $.ajax({
        url:"${pageContext.request.contextPath}/toUser.do",
        type:"post",
        dataType:"json",
        contentType:"application/json",
        data:JSON.stringify(data),
        success:function (result) {
            console.log(result);
        }
    })
})

3.格式处理

在这个页面的 json对象中有属性是日期对象,如果不做处理,会出现不能解析的问题。我们需要在实体类User 对应的属性上添加注解@JSONField(format=“yyy/MM/dd”)来进行处理,其中format对应的就是解析字符串日期的格式。如下所示:

int id;
String username;

@JSONField(format = "yyyy/MM/dd")
Date birthday;

4.添加controller代码

在controller中,我们定义以下方法类接收json格式的数据,@ReauestBody注解使用在参数之前,可以获取json格式的数据直接封装到user对象中。如下所示:

 @RequestMapping("/toUser.do")
 @ResponseBody
 public User toUser(@RequestBody User user) {
     System.out.println("user = " + user);
     return user;
 }

5.控制台结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值