目录
一.JSON数据的返回
二.异常处理机制
2.1 异常处理方式一
2.2 异常处理方式二
2.3 异常处理方式三
一.JSON数据的返回
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web应用程序和服务之间的数据传输。通过使用JSON,数据可以以一种结构化的方式进行组织和存储,并可以方便地在不同的编程语言和平台之间进行解析和使用。
1.1 要想使用JSON,首先老规矩先导入pom.xml依赖
com.fasterxml.jackson.corejackson-databind2.9.3com.fasterxml.jackson.corejackson-core2.9.3com.fasterxml.jackson.corejackson-annotations2.9.3
1.2 接着就是spring-mvc.xml文件
text/html;charset=UTF-8text/json;charset=UTF-8application/json;charset=UTF-8
1.3.@ResponseBody注解
我们使用json技术转换时,要先来了解这个注解:@ResponseBody
注解的作用是将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON
数据或者是XML数据。注意:在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
1.4 基础入门
接下来,分别写几个方法,来返回不同的返回值分别是返回一个对象,一个数组,返回对象数组,返回JSON字符串.
在这些方法上面都用到了@ResponseBody注解,如果这整个类里面的方法都是JSON格式的话就可以不需要在每一个方法上面写注解,而是可以在类上面打一个注解就好,
package com.yinzi.web;/** * @author yinzi * @create 2023-09-13 14:06 */import com.yinzi.Biz.StrutsBiz;import com.yinzi.model.Struts;import com.yinzi.util.PageBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;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@RequestMapping("/struts/json")public class JsonController {@Autowiredprivate StrutsBiz StrutsBiz;/** * 返回List *//*@ResponseBody*/@RequestMapping("/list")public List list(HttpServletRequest req, Struts struts){PageBean pageBean = new PageBean();pageBean.setRequest(req);List lst = this.StrutsBiz.selectList(struts,pageBean);return lst;}/** * 返回T * @param req * @return *//*@ResponseBody*/@RequestMapping("/load")public Struts load(HttpServletRequest req, Struts struts){if(struts.getCid() != null){List lst = this.StrutsBiz.selectList(struts, null);return lst.get(0);}return null;}/** * 返回List
1.5 结果测试
大家可以看到输入框中的路径的变化,调用了不同的方法
1.6 @JsonIgnore注解使用
如果我们要隐藏属性不被看到的话就可以把这个注解放在属性的上面
可以和上方动图比较,有了这个注解,页面上就不会显示 pic 这个属性了
二.异常处理机制
全局异常处理指的是在应用程序的运行过程中,捕获和处理未被明确捕获的异常。它的目的是在发生异常时,能够提供一个统一的处理方式,以保证应用程序的稳定性和可靠性。
系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。
2.1 异常处理方式一
改变spring-mvc配置文件
error
error.jsp界面
Title 错误❌信息页面${ex}
接着创建一个错误,以演示
结果:
2.2 异常处理方式二
1.通过instanceof判断异常类型
2.通过设置mv.setView(new MappingJackson2JsonView())方式返回JSON数据
建立一个全局异常的类
package com.yinzi.Component;import com.yinzi.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;/** * @author yinzi * @create 2023-09-13 16:28 */@Componentpublic class GlobalExceptionHandler implements HandlerExceptionResolver {@Overridepublic 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;}}
在方法中调用
结果:
2.3 异常处理方式三
建立异常类
package com.yinzi.Component;import com.yinzi.Exception.GlobalException;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;import java.util.Map;@ControllerAdvicepublic class GlobalExceptionResolver {//跳转错误页面//@ExceptionHandler//public ModelAndView handler(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","运行时异常....");//}//return mv;//}// 返回错误json数据@ResponseBody@ExceptionHandlerpublic 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;}}
结果:
返回的是json数据,而不是页面,如果打开上面的就是返回页面