SpringMVC详解(六)------与json交互

  Json(JavaScript Object Notation),它是一种轻量级数据交换格式,格式简单,易于读写,目前使用特别广泛。那么这篇博客我们主要谈谈在 SpringMVC 中,如何对 json 数据格式进行解析和转换?

   本篇博客源码链接:http://pan.baidu.com/s/1kURnwDx 密码:b37t

1、两种交互模式

  上图显示了客户端请求数据的两种格式,一种是 直接请求 json 数据,另一种是 key/value 数据。但是不管请求是哪种数据,为了在前端页面方便对结果进行解析。最终我们都转换为 json 数据格式。

2、导入相应的 jar 包(详情参看源码)

3、在 springmvc.xml 文件中配置 json 转换器

第一种方法:

<mvc:annotation-driven ></mvc:annotation-driven>

  第二种方法:

<!-- 用于将对象转换为 JSON  -->  
<bean id="stringConverter"  
    class="org.springframework.http.converter.StringHttpMessageConverter">  
    <property name="supportedMediaTypes">  
        <list>  
            <value>text/plain;charset=UTF-8</value>  
        </list>  
    </property>  
</bean>  
<bean id="jsonConverter"   class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>  

<bean      class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
    <property name="messageConverters">  
        <list>  
            <ref bean="stringConverter" />  
            <ref bean="jsonConverter" />  
        </list>  
    </property>  
</bean>

4、请求为 json 数据测试

  这里我们需要注意两个注解:

@ResponseBody把后台pojo转换json对象,返回到页面。

  @RequestBody接受前台json数据,把json数据自动封装pojo。

  ①、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>SpringMVC和 json 交互</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-2.1.4.min.js" ></script>
</head>
<script type="text/javascript">
	var dataJson = {
			'username':'Bob',
			'sex':'男'
	};
	function requestJson(){
		$.ajax({
			type:"POST",
			url:"${pageContext.request.contextPath}/requestJson",
			//指定数据格式为 json
			contentType:"application/json;charset=UTF-8",
			data:JSON.stringify(dataJson),
			dataType:"json",
			success:function(data){
				console.log(data.username);
				console.log(data.sex);
			}
		});
	}
	
</script>
<body>
	<button onclick="requestJson()" value="请求是json,返回json">请求是json,返回json</button>
	
</body>
</html>

  ②、Controller

package com.ys.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.ys.po.User;

@Controller
public class UserController {
	
	
	//请求为json,返回json
	@RequestMapping("/requestJson")
	//@RequestBody将请求信息的json串转成user对象
	//@ResponseBody将user对象转成json输出
	@ResponseBody
	public User requestJson(@RequestBody User user) throws Exception{
		System.out.println(user);
		return user;//由于@ResponseBody注解,将user转成json格式返回
	}
	
}

  ③、测试

  我们访问上面的jsp页面,然后点击按钮,进入到 Controller

  然后我们查看返回的数据:

5、请求为 key/value 数据测试

  ①、JSP 页面

   ②、Controller

//请求为key/value,返回json
	@RequestMapping("/requestKeyValue")
	//@RequestBody将请求信息的json串转成user对象
	@ResponseBody
	public User requestKeyValue(User user) throws Exception{
		System.out.println(user);
		return user;
	}

  ③、测试

  然后返回数据:

6、遇到的问题

①、如下代码,由于我们使用 Ajax 提交,我们在 JSP 页面引入了jquery  文件,发现无论使用绝对路径还是相对路径,系统总是找不到这个文件?

<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-2.1.4.min.js" ></script>

  原因:因为你在web.xml 文件中,对于过滤器的配置是拦截所有请求。所以类似于*.js,或者*.css这样的文件也被拦截了,故访问不到。

  解决办法:

    第一种办法:我们可以使用上面配置的拦截器只拦截 *.do,或者*.action,而不是 “/”。那么SpringMVC容器将不会拦截*.js,*.css这样的文件。但是这种风格不支持 Restful,建议不采用。

    第二种方法:在web.xml中配置拦截器的过滤请求

<!--要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了,我想性能是最好的吧。-->  
    <servlet-mapping>  
        <servlet-name>default</servlet-name>  
        <url-pattern>*.css</url-pattern>  
    </servlet-mapping>  
    <servlet-mapping>  
        <servlet-name>default</servlet-name>  
        <url-pattern>*.js</url-pattern>  
    </servlet-mapping>  

    第三种方法:在spingmvc.xml 中配置对静态资源不过滤

<!-- 配置静态文件过滤器 -->
	<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
	<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>

②、也是比较容易犯的错误 415

   这个错误产生的原因有很多。我们需要一步一步的排查:

  第一步:必须保证导入的 jackson相关的jar包是全的。

  第二步:在springmvc.xml文件中的配置的json转换器一定不能缺少,如何配查看本篇博客的第三点

  第三步:书写 Ajax 请求时。contentType:"application/json;charset=UTF-8",不要不写 contentType 这个属性

  第四步:Ajax传给后台的不要直接传字符串,要转换成json,即 data:JSON.stringify(dataJson),

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏钟绍威的专栏

java.io.StreamCorruptedException: invalid type code: AC错误的解决方法

问题描述: 在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了FileOutputStream(文件名,true)间接的构建...

18410
来自专栏互联网开发者交流社区

最新jquery+easyui_api培训文档

924
来自专栏Janti

springboot学习笔记-thymeleaf

简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎,它有如下三个极吸...

592
来自专栏挖坑填坑

angular页面打印局部功能实现方法思考

在页面显示的时候是分页现实的,当前页面只有10条数据,但是打印需要打印完整的100条数据。 并且在当前页面包含了表格之外的标题,菜单等其他元素。 后天api...

672
来自专栏我的博客

PHP反射机制

PHP反射机制它是用来导出或提取出关于类、方法、属性(私有保护等属性也能获取)、参数等的详细信息,包括注释。 <?php class Test{ ...

3147
来自专栏有趣的django

python爬虫入门(二)Opener和Requests

Handler和Opener Handler处理器和自定义Opener opener是urllib2.OpenerDirector的实例,我们之前一直在使用ur...

2605
来自专栏Java帮帮-微信公众号-技术文章全总结

springboot 入门教程(5) 基于ssm框架的crud操作(前端部分-附源码)

springboot 入门教程(5) 基于ssm框架的crud操作(前端部分-附源码) 上一篇介绍了spring boot整合mybatis实现了后端的CRUD...

4298
来自专栏跟着阿笨一起玩NET

Razor 语法快速参考 Razor 语法快速参考

本文引自:http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx

962
来自专栏老马说编程

(90) 正则表达式 (下) / 计算机程序的思维逻辑

88节介绍了正则表达式的语法,上节介绍了正则表达式相关的Java API,本节来讨论和分析一些常用的正则表达式,具体包括: 邮编 电话号码,包括手机号码和固定...

24810
来自专栏Java3y

SpringMVC【参数绑定、数据回显、文件上传】

前言 本文主要讲解的知识点如下: 参数绑定 数据回显 文件上传 参数绑定 我们在Controller使用方法参数接收值,就是把web端的值给接收到Control...

38710

扫码关注云+社区