目录

一,json解析

二,全局异常处理的3种形式

三,json统一处理


一,json解析

json的形式:

{}->json对象    T Map
[]-> json数组    List<T>  List<Map>
{
    msg:"";
    code:200,        ->json 混合对象
    data:[]
}

得到上述三种json形式的数据的方法:

1,导入pom依赖 jackson(让SpringMVC支持json数据转换)

 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.3</version></dependency>

2.在SpringMVC.xml中配置适配器(做json数据转换)

<!--支持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对象

在Biz层中写出以下几个方法:

1.返回List<T>

2.返回List<Map>

3.返回T

4.返回Map

5.返回混合

ClazzBiz:

package com.ljj.ssm.biz;import com.ljj.model.Clazz;
import com.ljj.ssm.util.PageBean;import java.util.List;
import java.util.Map;public interface ClazzBiz {int deleteByPrimaryKey(Integer cid);int insert(Clazz record);int insertSelective(Clazz record);Clazz selectByPrimaryKey(Integer cid);int updateByPrimaryKeySelective(Clazz record);int updateByPrimaryKey(Clazz record);List<Clazz> listPager(Clazz clazz, PageBean pageBean);List<Map> listMapPager(Clazz clazz, PageBean pageBean);
}

在ClazzBIzImpl中添加方法:

   @Overridepublic List<Map> listMapPager(Clazz clazz, PageBean pageBean) {return clazzMapper.listMapPager(clazz);}

ClazzMapper:

List <Map> listMapPager(Clazz clazz);

ClazzMapper.xml:

 <select id="listMapPager" resultType="java.util.Map" parameterType="com.ljj.ssm.model.Clazz" >select<include refid="Base_Column_List" />from t_struts_class<where><if test="cname !=null and cname !=''">and cname like concat('%')</if><if test="cid !=null and cid !=''">and cid = #{cid}</if></where>order by cid desc</select>

JsonController :

package com.ljj.controller;import com.ljj.model.Clazz;
import com.ljj.ssm.biz.ClazzBiz;
import com.ljj.ssm.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;//@ResponseBody+@Controller=@RestController@RestController
@RequestMapping("/clz/json")
public class JsonController {@Autowiredprivate ClazzBiz clazzBiz;@RequestMapping("/clzEdit")public String clzEdit(){System.out.println("JsonController.clzEdit");return "clzEdit";}/*** list<T>*/@RequestMapping("/list")public List<Clazz> list(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);
//        [{},{}]return this.clazzBiz.listPager(clazz,pageBean);}/*** list<Map>*/@RequestMapping("/listMap")public List<Map> listMap(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);
//        [{},{}]return this.clazzBiz.listMapPager(clazz,pageBean);}// 返回单个Map集合@RequestMapping("/map")public Map map(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);//      {}return this.clazzBiz.listMapPager(clazz,pageBean).get(0);}//    返回一个T对象@RequestMapping("/load")public Clazz load(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);//      {}return this.clazzBiz.listPager(clazz,pageBean).get(0);}//    混合
//      {
//        msg:" ",
//        code:200,
//        data:[ ]
//      }@RequestMapping("/hunhe")public Map hunhe(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);Map map=new HashMap();map.put("data",lst);map.put("pagebean",pageBean);return map;}}

index.jsp:

<%--Created by IntelliJ IDEA.User: zjjtDate: 2022/8/22Time: 18:42To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><head><title>测试json数据返回</title>
</head>
<a href="${pageContext.request.contextPath}/clz/json/list">返回list&lt;T&gt;对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/listMap">返回list&lt;Map&gt;对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/load?cid=1">返回T对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/map?cid=1">返回Map对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/hunhe">返回混合对象</a><hr>
</body>
</html>

运行结果:

点击测试:

list<T>对象

list<Map>对象

T对象

Map对象

混合对象

二,全局异常处理的三种形式

1.为什么需要全局异常处理

因为:系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

我们现在来改进代码 进行全局异常处理

jsonController:

  @RequestMapping("/list")public List<Clazz> list(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);if(true){throw new RuntimeException("查询班级信息异常,异常存在于JsonController.list");}//        [{},{}]return this.clazzBiz.listPager(clazz,pageBean);}

ClazzBizImpl

    @Overridepublic List<Map> listMapPager(Clazz clazz, PageBean pageBean) {if(true){throw new RuntimeException("查询班级信息异常,异常存在于ClazzBizImpl.list");}return clazzMapper.listMapPager(clazz);}

接下来重新运行项目:

点击list<T>对象时:

点击list<Map>对象时:

此时可以看到,两个异常 一个在控制层,一个在业务层,这样很不方便维护

2.异常处理思路?

系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

3.SpringMVC异常分类

1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;

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

3)使用@ControllerAdvice + @ExceptionHandler

异常处理的三种方式:

1、springmvc.xml中进行统一配置及处理(使用较少)

springmvc.xml:

 <!--统一异常处理--><!-- 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>

新建一个error.jsp页面:

<%--Created by IntelliJ IDEA.User: zjjtDate: 2022/8/23Time: 14:11To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>错误信息页面</title>
</head>
<body>
${ex}
</body>
</html>

再次运行:

当点击“返回list<T>对象”时:

当点击“返回list<>Map对象”时:

 2、实现接口管理(使用较多)

GlobalException :

package com.ljj.exception;/*** @author ljj* @create 2022-08-23 14:24*/
public class GlobalException extends RuntimeException{public GlobalException() {}public GlobalException(String message) {super(message);}public GlobalException(String message, Throwable cause) {super(message, cause);}public GlobalException(Throwable cause) {super(cause);}public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

GlobalHandlerExceptionResovler :

package com.ljj.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;/*** @author ljj* @create 2022-08-23 14:31* 处理全局异常的解析器*/@Component
public class GlobalHandlerExceptionResovler 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 GlobalException){GlobalException exception=(GlobalException) e;mv.addObject("ex",exception.getMessage());mv.addObject("msg","全局异常,错误码501");}else if(e instanceof RuntimeException){RuntimeException exception=(RuntimeException) e;mv.addObject("ex",exception.getMessage());mv.addObject("msg","运行时异常,错误码601");}return mv;}
}

JsonController:

//    返回一个T对象@RequestMapping("/load")public Clazz load(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);if(true) {throw new GlobalException("系统繁忙,请参考E007;");}//      {}return this.clazzBiz.listPager(clazz,pageBean).get(0);}

error.jsp

<%--Created by IntelliJ IDEA.User: zjjtDate: 2022/8/23Time: 14:11To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>错误信息页面</title>
</head>
<body>
${msg}
<hr>
${ex}
</body>
</html>

运行效果:

当点击“返回list<T>对象”时:

当点击“返回list<>Map对象”时:

当点击“返回T对象”时:

当点击“返回Map对象”时:

3、@controllerAdvice+@ExceptionHandler
GlobalExceptionResolver :

package com.ljj.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;/*** @author ljj* @create 2022-08-23 15:00*/
@ControllerAdvice
public class GlobalExceptionResolver {@ExceptionHandlerpublic ModelAndView handler(Exception e) {ModelAndView mv=new ModelAndView();mv.setViewName("error");if (e instanceof GlobalException){GlobalException exception=(GlobalException) e;mv.addObject("ex",exception.getMessage());mv.addObject("msg","全局异常,GlobalExceptionResolver,错误码501");}else if(e instanceof RuntimeException){RuntimeException exception=(RuntimeException) e;mv.addObject("ex",exception.getMessage());mv.addObject("msg","运行时异常,GlobalExceptionResolver,错误码601");}return mv;}}

运行效果:

当点击“返回list<T>对象”时:

当点击“返回list<>Map对象”时:

当点击“返回T对象”时:

当点击“返回Map对象”时:

​​​​​​​

三、json统一处理

GlobalExceptionResolver2 :

package com.ljj.exception;import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Map;/*** @author ljj* @create 2022-08-23 15:00** 当出现异常,统一向前端相应错误信息的json对象数据*/@RestControllerAdvice
public class GlobalExceptionResolver2 {@ExceptionHandlerpublic Map handler(Exception e) {Map map=new HashMap();if (e instanceof GlobalException){GlobalException exception=(GlobalException) e;map.put("ex",exception.getMessage());map.put("msg","全局异常,GlobalExceptionResolver,错误码501");}else if(e instanceof RuntimeException){RuntimeException exception=(RuntimeException) e;map.put("ex",exception.getMessage());map.put("msg","运行时异常,GlobalExceptionResolver,错误码601");}return map;}}

当点击“返回list<T>对象”时:

当返回list<T>对象时:

当点击“返回T对象”时:​​​​​​​

当点击“返回Map对象”时:

ok,本期内容到此结束啦,我们下期见

希望你永远不懂JSON和全局异常处理相关推荐

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

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

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

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

  3. SpringMvc之Json全局异常处理

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

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

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

  5. 从零开始学习springmvc(5)——Spring国际化和全局异常处理

    [项目地址] 从零开始学习springmvc 如果觉得有用可以关注一下公众号:码字不易,求赞求关注 五.Spring国际化和全局异常处理 五.Spring国际化和全局异常处理 5.1 国际化介绍 5. ...

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

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

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

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

  8. SpringBoot的全局异常处理的优雅吃法!要进来学习下吗

    SpringBoot的全局异常处理的优雅吃法!要进来学习下吗 SpringBoot全局异常准备 开发准备 环境要求 JDK :1.8 SpringBoot :1.5.17.RELEASE 首先还是Ma ...

  9. 【Java从0到架构师】项目实战 - 前后端分离、后端校验、Swagger、全局异常处理

    项目实战 - 前后端分离.后端校验.Swagger Layui 同源策略 SpringMVC 实现 CORS 后端校验 - hibernate-validator 方法的 Model 参数校验 方法的 ...

最新文章

  1. (转) Unity3D 使用Texturepacker打包工具制作NGUI(Atlas)图集
  2. 计算机开不开机是什么原因是什么原因,电脑开不了机的原因,详细教您电脑开不了机怎么办...
  3. Dict Set usage
  4. echarts 堆叠树状图排序
  5. 每天一道LeetCode-----生命游戏
  6. 亚马逊Rekognition发布针对人脸检测、分析和识别功能的多项更新
  7. maven-settings.xml的那些事
  8. Centos7静态ip设置(亲测有效)
  9. python中property魔法方法原理_Python类中的魔法方法之 __slots__原理解析
  10. 什么是Spring?Spring是什么?
  11. JavaScript鼠标经过图片晃动效果
  12. 从零开始学pythonjava_从零开始学习python:demo2.4
  13. 深度解读CSS3 position的属性
  14. 彻底搞懂Scrapy的中间件(三)
  15. Unitils集成DBUnit的问题-解决方案
  16. 中学数学证明所有自然数和为-1/12
  17. python 密度聚类_Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
  18. jsmind 线条_使用jsMind显示思维导图
  19. 计算机三级权限管理方法,Serv―U 三级用户权限机制及配置一例
  20. html 组合快捷键,ctrl常用组合键有哪些

热门文章

  1. 超炫物理动态图!收藏吧,吓死宝宝了...
  2. 计算机二级与英语四级哪个更严,国家计算机二级和英语四级过级经验总结
  3. Linux驱动之i2c用户态函数调用
  4. kube-apiserver源码分析
  5. 区块链技术下的反向保理业务模式设计
  6. 前端中英文切换,复制所有页面 / i18n
  7. 【2022 机器人领域研究热点与发展趋势综述】
  8. 检测苹果推送证书有效性
  9. 漫画:什么是B+树,B+树层数计算(面试官直呼内行)
  10. Oracle加索引的时候快照过久,【Oracle 11g】ORA-01555: snapshot too old(快照过旧)错误