目录
一.SpringMVC的JSON数据返回
1.导入Maven依赖
2.配置spring-mvc.xml
3.@ResponseBody注解的使用
3.1案例演示
1.List集合转JSON
2.Map集合转JSON
3.返回指定格式String
4. @ResponseBody用法
5.Jackson
5.1介绍
5.2常用注解
二.异常处理机制
1.为什么要全局异常处理
2.异常处理思路
3.SpringMVC异常分类
4.案例演示
4.1 异常处理方式一:配置springmvc提供的简单异常处理器
4.2 异常处理方式二:全局异常处理,通过实现HandlerExceptionResolver异常处理解析器完成异常处理
(1)首先在异常包中定义一个全局异常类
(2) 定义一个全局异常处理的类
4.3 异常处理方式三:通过注解的方式将异常信息直接以JSON的格式回显到前端
com.fasterxml.jackson.core
jackson-databind
2.9.3
com.fasterxml.jackson.core
jackson-core
2.9.3
com.fasterxml.jackson.core
jackson-annotations
2.9.3
text/html;charset=UTF-8
text/json;charset=UTF-8
application/json;charset=UTF-8
@ResponseBody
注解的作用:
用于标记控制器方法的返回值应该作为 HTTP 响应的主体部分返回,而不是通过视图解析器进行渲染。
当使用 Spring MVC 框架时,控制器方法通常会返回某种类型的数据(例如对象、集合、字符串等),然后由视图解析器将该数据绑定到视图模板并生成最终的 HTML 或其他格式的响应。然而,有时候我们希望直接返回数据而不经过视图解析器的处理,将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON
数据或者是XML数据。
在这种情况下,我们可以使用 @ResponseBody
注解来标记控制器方法。当该注解应用于方法时,Spring MVC 框架会将方法的返回值封装为适当的格式(例如 JSON),并将其作为 HTTP 响应的主体部分返回给客户端。这样可以方便地实现 RESTful API 服务,将数据直接以特定格式响应给调用端。
注意:在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
这里我们定义一个返回List集合的方法,最终到Controller层中标注@ResponseBody注解将集合数据转换成JSON数据
/**
* 返回List
* @param req
* @param hBook
* @return
*/
@ResponseBody
@RequestMapping("/list")
public List list(HttpServletRequest req, HBook hBook){
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
List lst = this.hBookbiz.listPager(hBook, pageBean);
return lst;
}
我们定义一个返回Map集合的方法,通过Controller中注解@ResponseBody,返回JSON格式数据
/**
* 返回List
测试结果
@ResponseBody
@RequestMapping("/jsonStr")
public String jsonStr(HttpServletRequest req, HBook hBook){
return "bookEdit";
}
测试结果
在整个Controller类中可将注解定义在类对象上面,这样整个类中的方法都使用了注解@ResponseBody
小结:由上面的案例得知,我们将对象、集合、字符串等类型数据,通过Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回
JSON
数据或者是XML数据。
Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。
特点
容易使用,提供了高层次外观,简化常用的用例。
无需创建映射,API提供了默认的映射大部分对象序列化。
性能高,快速,低内存占用
创建干净的json
不依赖其他库
代码开源
注解 | 说明 |
---|---|
@JsonIgnore | 作用在字段或方法上,用来完全忽略被注解的字段和方法对应的属性 |
@JsonProperty | 作用在字段或方法上,用来对属性的序列化/反序列化,可以用来避免遗漏属性,同时提供对属性名称重命名 |
@JsonIgnoreProperties | 作用在类上,用来说明有些属性在序列化/反序列化时需要忽略掉 |
@JsonUnwrapped | 作用在属性字段或方法上,用来将子JSON对象的属性添加到封闭的JSON对象 |
@JsonFormat | 指定序列化日期/时间值时的格式 |
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。
系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。
使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
使用@ControllerAdvice + @ExceptionHandler
error
error 获取定义的异常处理的页面
ex存储异常处理的异常信息
我们在controller层造出一个异常,在前端页面打印异常信息,并显示前端页面
@ResponseBody
@RequestMapping("/mapList")
public List mapList(HttpServletRequest req, HBook hBook){
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
List lst = this.hBookbiz.mapListPager(hBook, pageBean);
System.out.println(1/0);
return lst;
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
错误信息页面
${ex}
${msg}
测试结果
package com.YU.exception;
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);
}
}
它通过实现了HandlerExceptionResolver
接口,同时使用了@Component
注解,以被Spring框架管理和注册为一个组件。
这个异常处理器的主要作用是在Spring MVC应用程序中捕获并处理全局异常。当一个Controller方法抛出异常时,Spring MVC会将异常传递给注册的异常处理器来处理该异常,并跳转异常页面,通过判断异常类型,然后携带不同的异常信息传递到前端页面展示
package com.YU.component;
import com.YU.exception.GlobalException;
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;
@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) {
ModelAndView mv = new ModelAndView();
mv.setViewName("error");
if (e instanceof GlobalException){
GlobalException globalException = (GlobalException) e;
mv.addObject("ex",globalException.getMessage());
mv.addObject("msg","全局异常....");
}else if (e instanceof RuntimeException){
RuntimeException runtimeException = (RuntimeException) e;
mv.addObject("ex",runtimeException.getMessage());
mv.addObject("msg","运行时异常....");
}else{
mv.addObject("ex",e.getMessage());
mv.addObject("msg","其他异常....");
}
return mv;
}
}
通过这种方式,你可以统一处理全局的异常情况,并在异常发生时返回指定的错误视图,并且还可以根据不同的异常类型提供不同的错误信息,以便更好地提供错误处理和用户体验
测试结果
注意:前面两种异常处理不可同时使用,不然第二种会被覆盖并不产生效果
与前面两种不同的是,方式三使用注解@ResponseBody 和@ExceptionHandler,通过判断异常类型,将异常信息传递到map集合进行保存,并将其转换成JSON格式的数据传输到前端展示
@ControllerAdvice
public class GlobalExceptionHandler{
@ResponseBody
@ExceptionHandler
public Map handler(Exception e){
Map map = new HashMap();
if (e instanceof GlobalException){
GlobalException globalException = (GlobalException) e;
map.put("ex",globalException.getMessage());
map.put("msg","全局异常....");
}else if (e instanceof RuntimeException){
RuntimeException runtimeException = (RuntimeException) e;
map.put("ex",runtimeException.getMessage());
map.put("msg","运行时异常....");
}else {
map.put("ex",e.getMessage());
map.put("msg","其它异常....");
}
return map;
}
}
测试结果
总结:
在SpringMVC中三种方法的使用的优先级依次降低,但是在实际开发过程中第三种应用范围最广,也就是我们最常用的类型,当然JSON只是传递在后端进行判断所用,前端最后展现给客户页面需要我们自己根据逻辑判断异常信息,最终展示不同的前端页面
今天的学习到这里就结束了,感谢各位大大的观看,各位大大的三连是博主更新的动力,感谢谢谢谢谢谢谢谢谢各位的支持!!!!!