Java笔记之SpringMVC(八):ajax发送json数据和返回json数据

0.说在前面

  基于SpringMVC(七):自定义类型转换器项目

1.在原项目的基础上再导入需要的jar包,并Build Path

2.新建包com.springmvc.demo.bean,并新建People类

package com.springmvc.demo.bean;

public class People {
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "People [name=" + name + ", age=" + age + "]";
    }
    
}

3.新建JsonController类

package com.springmvc.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.springmvc.demo.bean.People;

@Controller
public class JsonController {
    @RequestMapping("/initJson.action")
    public String init(){
        return "json";
    }
    
    /**
     * @RequestBody: 注解用于将json字符串信息映射到People类的字段上进行转换
     * @ResponseBody: 注解用于将实体对象转换成json格式 
     * @param people
     * @return
     */
    @RequestMapping(value="/json.action")
    public @ResponseBody People jsonTest(@RequestBody People people){
        System.out.println(people);
        return people;
    }
}

4.新建json.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.12.4.min.js"></script>
</head>
<body>
    姓名:<input type="text" id="name"/><br/>
    年龄:<input type="text" id="age"/><br/>
    <button type="button" onclick="doPost();">发送</button>
</body>
<script type="text/javascript">
    function doPost(){
        var name=document.getElementById("name").value;
        var age=document.getElementById("age").value;
        $.ajax({
            url:"json.action",
            type:"post",
            //请求信息是严格的json字符串形式
            data:JSON.stringify({"name":name,"age":age}),
            //设置请求参数为json字符串,编码为UTF-8
            contentType:"application/json;charset=utf-8",
            //设置返回值为json格式,也可以不设置
            dataType:"json",
            success:function(data){
                alert(data.name+"---"+data.age);
            }
        });
    }
</script>
</html>

5.由于原来的项目配置了拦截器,里面的postHandle方法中对controller返回的ModelAndView对象中设置了新的信息,这对返回json数据的请求是不合适的,因为这里的ModelAndView对象是null,会报空指针异常,所以把设置信息的那一块注释掉

@Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle在Controller被调用返回ModelAndView之后被调用......");
        //在返回的ModelAndView对象中新加一个数据对象
        //modelAndView.addObject("currentDate", new Date());
    }

6.访问http://localhost:8080/springmvc_demo/initJson.action,跳转到json.jsp页面,输入信息点击发送按钮

从页面信息和后台打印信息可以看出ajax发送json数据和返回json数据都得到实现.

7.踩坑

以本例来说:

  (1). ajax请求

    data属性的值要是严格的Json字符串形式,不能写成{"name":name,"age":age}这种形式,要是双引号包围的字符串,可以使用JSON.stringify({"name":name,"age":age})进行转换;

    contentType属性值要设置成"application/json;charset=utf-8";

  (2). jar包

    新导入的三个jar包是必须的.这一块填坑花了好一段时间,搜了好些教程有说部分jar包不需要的,自己试的死活不行,不知道为啥,这三个jar包都导入了请求就通过了;  

  (3). springmvc.xml

    这里面要添加<mvc:annotation-driven></mvc:annotation-driven>标签项,添加这个不仅会添加上注解形式的处理器映射器和处理器适配器,还会添加一系列的消息转换器,其中就包括json格式的消息转换器

    如果不添加这个标签,需要声明注解适配器以及为配置json格式的消息转换器:spring3与spring4及以上配置稍微不同,就是消息转换器名称里Jackson后面多了一个2

    spring4以及以上

<!-- 声明注解适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <!-- 添加json格式的消息转换器 -->
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
            </list>
        </property>
    </bean>

    spring3

<!-- 声明注解适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <!-- 添加json格式的消息转换器 -->
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
            </list>
        </property>
    </bean>

    从工作量上来说还是添加<mvc:annotation-driven></mvc:annotation-driven>标签项比较容易.

    (4).Controller中的方法上

      将json字符串映射到实体类属性上要使用注解@RequestBody;

      返回值类型为实体类,要转化成json格式,需要在方法上或者方法的返回值类型之前使用注解@ResponseBody.

 

posted @ 2020-04-08 16:46  安徒生敲代码  阅读(411)  评论(0编辑  收藏  举报