搭建SSM框架SpringMVC之JSON传数据

json格式的字符串(传递数据的一种载体)
json格式字符串 <----> js对象
  js中的JSON类型
    JSON.stringify(obj);
    JSON.parse(str);
json格式字符串 <----> java对象
  使用第三方jar来完成即可

例子:

  ajex请求给服务器发送JSON格式字符串,服务器接受,利用第三方jar把JSON格式字符串转换成对象,然后返回JSON格式字符串,js接受,jQuery自动把它转换成js对象
拿到的都是对象,但传输的都是字符串(JSON格式)

 测试页面1(json1.jsp):

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath %>" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>json1.jsp</title>
<script type="text/javascript">
    
    //js对象
    var obj = {id:1,name:"tom1",age:21};
    console.log(obj);
    console.log(obj.id);
    console.log(obj.name);
    console.log(obj.age);
    
    //json格式的字符串
    var jsonStr = JSON.stringify(obj);
    //把js对象转为json格式字符串
    //{"id":1,"name":"tom1","age":21}
    console.log(jsonStr);
    
    console.log("---------------------------");
    
    //json格式字符串
    jsonStr = '{"id":2,"name":"tom2","age":22}';
    console.log(jsonStr);
    
    //json格式字符串转换为js对象
    obj = JSON.parse(jsonStr);
    console.log(obj);

</script>
</head>
<body>
    <h1>json1.jsp</h1>
    <hr>
    
    
    

</body>
</html>

测试页面2(json2.jsp):

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath %>" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>json2.jsp</title>
<script type="text/javascript" src="static/js/jquery/jquery-1.8.3.min.js"></script>

<script type="text/javascript">
    
    $(function(){
        
        $("#btn1").on("click",function(){
            
            var obj = {id:1,name:"tom",age:20};
            var jsonStr = JSON.stringify(obj);
            
            /*
                contentType属性表示本次请求给服务器发送的数据类型是什么
                    对应了之前请求头中的属性:Content-Type
                dataType属性表示本次请求希望服务器返回的数据类型是什么
                    对应了之前请求头中的属性:Accept
            */
            
            
            $.ajax({
                type: "POST",
                url: "request_body/test2",
                contentType: "application/json",
                data: jsonStr,
                dataType: "text",
                success: function(msg){
                    console.log(msg);
                }
            });
            
        });
        
        
        
        $("#btn2").on("click",function(){
            var obj = {id:1,name:"tom",age:20};
            var jsonStr = JSON.stringify(obj);
            
            
            /*
            contentType属性表示本次请求给服务器发送的数据类型是什么
                对应了之前请求头中的属性:Content-Type
            dataType属性表示本次请求希望服务器返回的数据类型是什么
                对应了之前请求头中的属性:Accept
            */
            $.ajax({
                type: "POST",
                url: "request_body/test3",
                contentType: "application/json",
                data: jsonStr,
                dataType: "json",
                success: function(obj){
                    //jquery会把json格式字符串自动转为js对象
                    console.log(obj);
                    console.log(obj.msg);
                }
            });
            
        });
        
        
        
        $("#btn4").on("click",function(){
            var obj = {id:1,name:"tom",age:20};
            var jsonStr = JSON.stringify(obj);
            
            
            /*
            contentType属性表示本次请求给服务器发送的数据类型是什么
                对应了之前请求头中的属性:Content-Type
            dataType属性表示本次请求希望服务器返回的数据类型是什么
                对应了之前请求头中的属性:Accept
            */
            $.ajax({
                type: "POST",
                url: "request_body/test4",
                contentType: "application/json",
                data: jsonStr,
                dataType: "json",
                success: function(obj){
                    //jquery会把json格式字符串自动转为js对象
                    console.log(obj);
                    console.log(obj.msg);
                }
            });
            
        });
        
        
        $("#btn5").on("click",function(){
            var obj = {id:1,name:"tom",age:20};
            var jsonStr = JSON.stringify(obj);
            
            
            /*
            contentType属性表示本次请求给服务器发送的数据类型是什么
                对应了之前请求头中的属性:Content-Type
            dataType属性表示本次请求希望服务器返回的数据类型是什么
                对应了之前请求头中的属性:Accept
            */
            $.ajax({
                type: "POST",
                url: "request_body/test5",
                contentType: "application/json",
                data: jsonStr,
                dataType: "json",
                success: function(obj){
                    //jquery会把json格式字符串自动转为js对象
                    console.log(obj);
                    console.log(obj.id);
                    console.log(obj.name);
                    console.log(obj.age);
                    console.log(obj.dob);
                }
            });
            
        });
        
        
    });
    
</script>
</head>
<body>
    <h1>json2.jsp</h1>
    <hr>
    
    <input id="btn1" type="button" value="按钮1">
    <input id="btn2" type="button" value="按钮2">
    <input id="btn4" type="button" value="按钮4">
    <input id="btn5" type="button" value="按钮5">
    

</body>
</html>

后台的控制类:

package com.briup.web.annotation;

import java.io.Writer;

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.briup.bean.User;

@RequestMapping("/request_body")
@Controller
public class RequestBodyController {
    
    /*
     * @RequestBody注解的使用
     * 作用:获得请求体中的内容
     */
    
    
    @RequestMapping("/test1")
    public String test1(@RequestBody String str)throws Exception{
        System.out.println("RequestBodyController test1..");
        
        //id=1&name=tom&age=20
        System.out.println("str = "+str);
        
        return "test";
    }
    
    
    //@RequestBody注解一般结合ajax,然后以json格式字符串进行传值
    //因为正常情况下,使用@RequestBody注解获得了表单中的值:id=1&name=tom&age=20
    //这个值id=1&name=tom&age=20,我们获取后作用不大
    //但是如果从请求体中获得一个json格式的字符串,那就不一样了
    //因为可以容易的把json格式字符串转换为java的对象
    //需要引入第三方jar包,才可以把json字符串转为java对象
    @RequestMapping("/test2")
    public void test2(@RequestBody User u,Writer out)throws Exception{
        System.out.println("RequestBodyController test2..");
        
        System.out.println("u = "+u);
        
        out.write("hello");
        out.flush();
        
    }
    
    
    //给ajax请求返回json格式的字符串
    @RequestMapping("/test3")
    public void test3(@RequestBody User u,Writer out)throws Exception{
        System.out.println("RequestBodyController test3..");
        
        System.out.println("u = "+u);
        
        String jsonStr = "{\"msg\":\"hello world\"}";
        
        out.write(jsonStr);
        
        out.flush();
        
    }
    
    
    //@ResponseBody表示把方法的返回值放到响应体中
    @ResponseBody
    @RequestMapping("/test4")
    public String test4(@RequestBody User u)throws Exception{
        System.out.println("RequestBodyController test4..");
        
        System.out.println("u = "+u);
        
        String jsonStr = "{\"msg\":\"hello world\"}";
        
        return jsonStr;
    }
    
    @ResponseBody
    @RequestMapping("/test5")
    public User test5(@RequestBody User u)throws Exception{
        System.out.println("RequestBodyController test5..");
        
        System.out.println("u = "+u);
        
        //对象会被自动转为json格式字符串
        User user = new User(2L,"tom2",32);
        
        return user;
    }
    
    
}

总结:

@RequestBody注解
可以接收客户端ajax请求中的json数据并且转换为对象,但是只能接收post请求中的数据,因为post请求的数据在请求体中(request-body).
需要引入操作json的相关jar包:
  jackson-core-2.8.5.jar
  jackson-annotations-2.8.5.jar
  jackson-databind-2.8.5.jar
或者
  jackson-mapper-asl-1.9.13.jar
  jackson-core-asl-1.9.13.jar

 

客户端使用ajax发送json数据给Controller,Controller里面接收json数据并且转换为对象
1.ajax请求发送的时候要指定为post方式
2.ajax请求发送的时候要指定contentType:"application/json"
3.ajax请求发送的时候要把json对象转换为字符串再发送
4.Controller中要使用@RequestBody指定接收数据的参数
5.项目中要引入json相关的jar包
6.如果此ajax请求还希望Controller返回的数据也是json格式的,那么需要在发送ajax请求的时候指定dataType:"json",
7.Controller中的方法要返回json格式的数据给客户端,可以使用@ResponseBody标签 或者 在方法中自己使用response对象获得io流给客户端写回去

注意:
ajax发送请求的时候,请求头中的Content-Type默认值是: application/x-www-form-urlencoded,表示当前请求中如果有数据的话,将会是key=value&key=value的形式

注意:在javascript中,json对象和字符串之间的转换:
  JSON.stringify(obj)将JSON对象转为字符串。
  JSON.parse(string) 将字符串转为JSON对象;

 

posted @ 2018-01-07 13:14  渊源谭  阅读(6965)  评论(4编辑  收藏  举报