一. JSON

现在的开发中,几乎都是前后端分离的形式,越来越多的请求使用Ajax的异步请求,而不再是传统的跳转,使用Ajax异步请求之后,我们后端处理结果大多以JSON的形式进行响应,响应给前端,前端得到响应结果后,进行处理和渲染。在SpringMVC中,使用JSON非常的简单,SpringMVC中可以将集合等数据自动的转换成JSON数据格式,当然我们需要加入JSON相关的依赖。

二、JSON数据格式

JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来而已,我们看上面的符号,里面有[] ,{}等符号。

1、[]中括号代表的是一个数组

[{"name":"胡小威" , "age":20 , "male":true},{"name":"赵小亮" , "age":22 , "male":false}]

2、{}大括号代表的是一个对象

{"name":"胡小威" , "age":20 , "male":true}

3、混合

{'total':80,'rows':10,[{'bookNane':'三资金','price':100},{'bookName':'金刚经','price':200}]

双引号""表示的是属性值
冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型

三、返回JSON配置步骤

1、首先导入JSON的相关依赖
在pom.xml中配置

<!--jackson--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson.version}</version></dependency>

2、在springmvc.xml文件中配置JSON的消息转换器

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><ref bean="mappingJackson2HttpMessageConverter"/></list></property></bean><bean id="mappingJackson2HttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件--><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>text/json;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property></bean>

3、在控制层使用@ResponseBody注解标记请求处理方法

        被该注解所标记的请求处理方法将返回JSON格式的数据,绕开视图解析器

注:开启注解式开发使用

四、返回JSON数据格式

1、返回List泛型格式的JSON数据

@RequestMapping("/queryListBooks")@ResponseBodypublic List<Book> queryListBooks(Book book,HttpServletRequest request){PageBean pageBean=new PageBean();pageBean.setRequest(request);List<Book> books = bookService.queryBookPager(book, pageBean);return   books;};

2、返回实体类型的JSON数据

@RequestMapping("/querySingleBook")@ResponseBodypublic Book querySingleBook(Integer bookId){Book book = bookService.selectByPrimaryKey(bookId);book.setDate(new Date());return book;}

在实体类属性中使用@JsonIgnore

此注解代表在返回JSON数据时会忽略此字段 只在返回实体类时有效

在实体类属性中使用@JsonProperty

在返回实体类的JSON数据格式时,给此字段取别名 只在返回实体类时有效

在实体类中的时间类型的属性使用@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

在返回实体类的JSON数据格式时,给此字段转换类型为pattern属性,因为时区的问题,还需要加上八小时,为东八区。

3、返回Map类型的JSON数据

 @RequestMapping("/querySingleMap")@ResponseBodypublic Map<String, Object> querySingleMap(Integer bookId){return  bookService.querySingleMap(bookId);}

在此类型中如要时间类型转换,就得去mapper.xml文件中的sql语句用函数转换

4、查询返回List<map>类型的JSON数据

@RequestMapping("/queryMapList")@ResponseBodypublic List<Map<String, Object>> queryMapList( ){return bookService.queryBookAll();}

5、返回混合类型的JSON数据

@RequestMapping("/queryhybridBooks")@ResponseBodypublic Map<String, Object> queryhybridBooks(Book book,HttpServletRequest request){PageBean pageBean=new PageBean();pageBean.setRequest(request);List<Book> books = bookService.queryBookPager(book, pageBean);Map<String, Object> json=new HashMap<>();json.put("total", pageBean.getTotal());json.put("rows", books);return json;};

6、返回String类型的JSON数据类型

@RequestMapping("/queryString")@ResponseBodypublic String queryString(){return "book/bookList";}

五、Spring MVC异常处理机制

我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是(dao/mapper)层、service层还是controller层,都有可能抛出异常。

而在Spring MVC中提供了一个通用的异常处理机制,它提供了一个成熟、简洁并且清晰的异常处理方案。当使用Spring MVC开发Web应用时,利用这套现成的机制进行异常处理也更加自然并且高效。

六、SpringMVC异常处理

1、异常处理机制流程图

系统中异常包括两类:

预期异常 通过捕获异常从而获取异常信息

运行时异常

RuntimeException

主要通过规范代码开发、测试等手段减少运行时异常的发生

系统的Dao(mapper)、Service、Controller出现都通过throws Exception向上抛出,最后SpringMVC前端控制器交由异常处理器进行异常处理,如下图:

2、异常处理的三种方式

1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver; 
2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
3)使用@ControllerAdvice + @ExceptionHandler

1、简单异常处理器SimpleMappingExceptionResolver

SpringMVC中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口

配置SpringMVC的简单的异常处理器

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- 定义默认的异常处理页面 --><property name="defaultErrorView" value="error"/><!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --> <property name="exceptionAttribute" value="ex"/><!-- 定义需要特殊处理的异常,这是重要点 --> <property name="exceptionMappings"><props> <!--异常类型 错误视图-->       <prop key="java.lang.RuntimeException">error</prop></props><!-- 还可以定义其他的自定义异常 --></property></bean> 

方法中抛出此异常

@RequestMapping("/querySingleBook")@ResponseBodypublic Book querySingleBook(Integer bookId){Book book = bookService.selectByPrimaryKey(bookId);if(bookId>100)throw new RuntimeException("书本编号大于100,异常抛出!!!");book.setDate(new Date());return book;}

2、实现接口HandlerExceptionResolver自定义自己的异常处理器

package com.zking.ssm.book.exception;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** SpingMVC提供的第二种全局异常处理方式  ,实现HandlerExceptionResolver接口*/
@Component
public class GlobalException implements HandlerExceptionResolver {/**** @param httpServletRequest* @param httpServletResponse* @param o 异常处理的目标* @param e 异常处理的类型* @return*/@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {ModelAndView mv=new ModelAndView();mv.setViewName("error");//判断异常的分类if(e instanceof RuntimeException){RuntimeException ex=(RuntimeException)e;System.out.println(ex.getMessage());mv.addObject("msg",ex.getMessage());}return mv;}
}

创建异常类

package com.zking.ssm.book.exception;public class BusinessException extends RuntimeException {public BusinessException() {}public BusinessException(String message) {super(message);}public BusinessException(String message, Throwable cause) {super(message, cause);}public BusinessException(Throwable cause) {super(cause);}}
@RequestMapping("/querySingleBook")@ResponseBodypublic Book querySingleBook(Integer bookId){Book book = bookService.selectByPrimaryKey(bookId);if(bookId>100)throw new BusinessException("书本编号大于100,异常抛出!!!");book.setDate(new Date());return book;}

3、使用@ControllerAdvice + @ExceptionHandler

package com.zking.ssm.book.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;import java.util.HashMap;
import java.util.Map;/*** SpingMVC提供的第三种种全局异常处理方式* 1)@ControllerAdvice +@ExceptionHandler* 2)@RestControllerAdvice +@ExceptionHandler*      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器*/
@ControllerAdvice
public class GlobalException2{@ExceptionHandlerpublic ModelAndView exceptionHandler(Exception e){ModelAndView mv=new ModelAndView();//设置错误页面mv.setViewName("error");//判断异常类型if(e instanceof BusinessException){BusinessException ex=(BusinessException)e;mv.addObject("msg","系统繁忙,请稍后再试.......");}mv.setView(new MappingJackson2JsonView());return mv;}}

返回JSON格式

package com.zking.ssm.book.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;import java.util.HashMap;
import java.util.Map;/*** SpingMVC提供的第三种种全局异常处理方式* 1)@ControllerAdvice +@ExceptionHandler* 2)@RestControllerAdvice +@ExceptionHandler*      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器*/
@RestControllerAdvice
public class GlobalException2{@ExceptionHandlerpublic ModelAndView exceptionHandler(Exception e){ModelAndView mv=new ModelAndView();mv.setViewName("error");//判断异常类型if(e instanceof BusinessException){BusinessException ex=(BusinessException)e;mv.addObject("msg","系统繁忙,请稍后再试.......");}//强制更换视图解析器  不跳页面!!!mv.setView(new MappingJackson2JsonView());return mv;}}

返回异常信息和状态码

package com.zking.ssm.book.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;import java.util.HashMap;
import java.util.Map;/*** SpingMVC提供的第三种种全局异常处理方式* 1)@ControllerAdvice +@ExceptionHandler* 2)@RestControllerAdvice +@ExceptionHandler*      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器*/
@RestControllerAdvice
public class GlobalException2{@ExceptionHandlerpublic Map<String, Object> exceptionHandler(Exception e){Map<String, Object> json=new HashMap();//判断异常类型if(e instanceof BusinessException){json.put("msg","系统繁忙,请稍后再试.......");json.put("code",500);}return json;}
}

至此,JSON和全局异常处理介绍完毕,由于作者水平有限难免有疏漏,欢迎留言纠错。

JSON和全局异常处理相关推荐

  1. SpringMVC之JSON和全局异常处理

    目录 一.json解析 json的形式 SpringMVC框架如何产生上述三种形式的数据? 1.导入pom依赖             Jackson 2.配置SpringMVC.xml 配置适配器 ...

  2. 希望你永远不懂JSON和全局异常处理

    目录 一,json解析 二,全局异常处理的3种形式 三,json统一处理 一,json解析 json的形式: {}->json对象    T Map []-> json数组    List ...

  3. springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON

    springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON 参考文章: (1)springmvc全局异常处理ControllerAdvice区分返回响应类型是页面 ...

  4. SpringMvc之Json全局异常处理

    目录 一. SpringMvc框架对Json数据的支持 1.    Json数据的格式分类: 2.  SpringMvc框架如何产生上述三种json格式数据 2.1导入pom依赖 2.2  在Spri ...

  5. JSON和几个的全局异常处理

    目录 一.SpringMVC对JSON的支持 1.json的各种场景 二.SpringMVC的全局异常处理的3种形式 1.非全局异常处理问题演示 ① 为什么要全局异常处理 ② 异常处理思路 ③ Spr ...

  6. SpringBoot (二) :全局异常处理设置

    说在前面 在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有 ...

  7. 看看人家 SpringBoot 的全局异常处理,多么优雅...

    点击关注公众号,Java干货及时送达 本篇文章主要介绍的是SpringBoot项目进行全局异常的处理. SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程 ...

  8. 别再写满屏的try-catch了,真丑,全局异常处理不会吗?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:巨人大哥 www.cnblogs.com/juren ...

  9. 你这代码写得真丑,满屏的try-catch,全局异常处理不会吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 背景 软件开发过程中,不可避免的是需要处理各种异常,就我自己来 ...

  10. 看看人家 SpringBoot 的全局异常处理多么优雅...

    1 SpringBoot全局异常准备 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. 开发准备 环境要求JDK:1.8SpringBoot:1.5.17.RELEASE 首先还是 ...

最新文章

  1. buffer IO和direct IO
  2. (一)SOA学习-相关缩写
  3. C# Math.Round中国式的四舍五入法
  4. python中使用ElementTree 操作XML
  5. 安装electron报错
  6. 由VMWorld2010想到的Social Media宣传
  7. 故宫首开夜场门票秒空官网崩溃:7本书让网站挺住
  8. 违约金一般是多少_违约金10万起!编制教师入职后的去留难题
  9. April Fools Day Contest 2016 F. Ace It!
  10. Git可视化下载及团队协作及diff工具
  11. Base16的编码和解码原理及代码
  12. ERPLAB脑电数据分析教程
  13. pandas使用read_csv函数读取文件的前N行数据并保留表头、pandas使用read_csv函数读取制表符分割的文件(tab-delimited)、自定义设置sep参数
  14. 《JavaScript学习笔记》
  15. 火影忍者的最爱:三勾玉
  16. NAND Flash硬件原理
  17. linux和pe修复win10启动项,pe下如何重建win10引导?pe下win10引导修复图文教程
  18. 【GNSS】抗差估计(稳健估计)原理及程序实现
  19. php自动切换背景,刷新页面后让WordPress背景随机切换
  20. TDDFT计算软件Octopus学习笔记(三):能带结构(ZnO)

热门文章

  1. 给uiview设置圆角
  2. python如何抓取图片数据_python 的简单抓取图片
  3. jupyter notebook环境配置
  4. 动态规划初级篇(上)
  5. [USACO题库]1.2.3 Name That Number命名那个数字
  6. moment.js中文api
  7. c语言幂函数_了解C / C ++中的幂函数
  8. 自制简单的诗歌搜索系统
  9. 如何低成本,快速构建企业 Wiki 和团队知识分享平台
  10. NOIP模拟赛 czy的后宫3