SpringMVC:JSON数据交互

JSON数据交互

前端可以有很多语言来写,但是基本上后台都是java开发的,除了c++(开发周期长),PHP和#Net(追求速度,快速开发)这3种也可以写后台。

浏览器和java程序打交道,用jsp、js。

安卓、IOS客户端和Java程序打交道,发送的是JSON字符串。Java程序接收到,解析JSON字符串,形成POJO对象,然后进行业务处理。处理完变成POJO或者包装类对象或者List集合,转成JSON字符串发回给安卓、IOS客户端。

所以掌握了JSON数据交互,就不用关心前端是什么语言开发的了。

项目结构

jar包

实体类Student.java

@Component
@Scope("prototype")
public class Student {
    private int id;
    private String name;
    private int age;
    private float score;

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

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

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

    public float getScore() { return score; }

    public void setScore(float score) { this.score = score; }
}

前端页面index.jsp使用ajax发起请求

如果要请求纯文本(字符串),将dateType的值改为text。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSON</title>
</head>
<body>
<form>
    学号:<input type="text" id="id"><br/>
    <button type="button" id="btn">查询学生信息</button>
</form>
<p id="show"></p>

<%-- <script src="${pageContext.request.contextPath}/js/jquery.min.js"></script> --%>
<script src="js/jquery-3.4.1.min.js" type="text/javascript"></script>
<script>
    $("#btn").click(function () {
        $.ajax({
            //开头不能加/,但可以加 ${pageContext.request.contextPath}/
            url: "studentController/queryStudent",
            type: "post",
            // 传给后台的数据类型、使用的字符集。可以缺省,因为data:{},看到{}就会自动作为json处理
            // contentType:"application/json;charset=utf-8",
            //传给后台的数据,json形式,key是String类型,value可以是多种类型,键值对之间逗号分隔
            data: {"id": $("#id").val()},
            //期待的返回值类型(回调函数的参数类型)
            dataType: "json",
            error: function () {
                console.log("ajax请求数据失败!");
            },
            success: function (data) {
                //浏览器把接受到的json数据作为js对象,可通过.调用属性
                var info = "姓名:" + data.name + ",年龄:" + data.age + ",成绩:" + data.score;
                $("#show").text(info);
            }
        })
    });
</script>
</body>
</html>

后台使用controller处理ajax请求

可以用简单数据类型接收前端传来的数据,也可以使用Bean来接收(会赋给同名的属性)。

很多教程说要在业务方法的参数前面加@RequestBody,才能将ajax传来的数据转换为需要的类型;

事实上,随着版本更替,高版本SpringMVC内建的转换器已经可以将ajax传来的数据转换需要的类型,加@RequestBody反而会出错。

需要在业务方法上添加注解@ResponseBody,此处解会自动将返回值添加到响应体中,来响应ajax请求。

不管请求的是text、还是json,都需要使用@ResponseBody。

如果请求的是text,将返回值类型写成String;

如果请求的是json,返回值可以写成bean(返回json对象,比如请求一个学生的信息),也可以写成List(返回json数组,比如请求多个学生的信息)。

@Controller
@RequestMapping("studentController")
public class StudentController {
    private Student student;

    @Autowired
    public void setStudent(Student student) {
        this.student = student;
    }

    @RequestMapping("/queryStudent")
    @ResponseBody
    public Student queryStudent(int id) {
        System.out.println(id);
        //此处省略连接数据库查询
        student.setName("chy");
        student.setAge(20);
        student.setScore(100);
        return student;
    }
}

springmvc.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
      http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.2.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

    <!--
        可以扫描controller、service、...
        这里让扫描controller,指定controller的包
     -->
    <context:component-scan base-package="org.haiwen"></context:component-scan>

    <!-- 开启spring对mvc的注解支持(全注解一定要配置) -->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!-- 解决Controller返回json中文乱码问题 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!-- 静态资源放行 -->
    <mvc:default-servlet-handler />

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize">
            <value>10000000000</value> <!-- 以字节byte为单位 -->
        </property>
        <property name="defaultEncoding">
            <value>UTF-8</value>
        </property>
    </bean>
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

    <!-- 配置SpringMVC的核心控制器DispatcherServlet(负责所有请求的公共功能,然后在分发给具体的控制器(我们编写的控制器),完成业务逻辑,响应视图。) -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--
            服务器在启动的时候,去加载springmvc的配置文件
            如果不配置就默认去WEB-INF文件夹下找:<servlet-name>-servlet.xml的配置(这种方式需要拷贝配置文件到WEB-INF)
         -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- Servlet容器启动的时候就进行初始化 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 请求的入口,所有请求都会经过DispatcherServlet处理   /:支持RESTful风格 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>


    <!-- 配置编码过滤器 ==>目的:解决SpringMVC post提交数据时的乱码问题  -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

测试

发布了202 篇原创文章 · 获赞 37 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/lovecuidong/article/details/104560740