html5期末大作业个人网站制作,动易 网站首页,没有icp备案的ip地址访问的网站会被各搜索引擎收录吗,网页设计图片免费目录 前言
一、JSON数据返回
1.导入依赖
2.配置spring-mvc.xml
3.使用ResponseBody注解
4.Jackson
4.1.介绍
4.2.常用注解
二、异常处理机制
1.为什么要全局异常处理
2.异常处理思路
3.SpringMVC异常分类
4.综合案例
4.1.异常处理方式一
4.2.异常处理方式二
4.3…目录 前言
一、JSON数据返回
1.导入依赖
2.配置spring-mvc.xml
3.使用ResponseBody注解
4.Jackson
4.1.介绍
4.2.常用注解
二、异常处理机制
1.为什么要全局异常处理
2.异常处理思路
3.SpringMVC异常分类
4.综合案例
4.1.异常处理方式一
4.2.异常处理方式二
4.3异常处理方式三
5.响应封装类 前言 Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架通过一套注解我们可以快速的搭建一个Web应用。在本文中我们将重点介绍如何在Spring MVC中返回JSON数据以及如何处理异常。
一、JSON数据返回
1.导入依赖
为了使ResponseBody注解生效我们需要配置一个Jackson消息转换器用于将Java对象序列化为JSON字符串。需要在pom.xml文件中添加Jackson依赖
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.9.3/version
/dependency
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-core/artifactIdversion2.9.3/version
/dependency
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-annotations/artifactIdversion2.9.3/version
/dependency
2.配置spring-mvc.xml
bean classorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapterproperty namemessageConverterslistref beanmappingJackson2HttpMessageConverter//list/property
/bean
bean idmappingJackson2HttpMessageConverter
classorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter!--处理中文乱码以及避免IE执行AJAX时返回JSON出现下载文件--property namesupportedMediaTypeslistvaluetext/html;charsetUTF-8/valuevaluetext/json;charsetUTF-8/valuevalueapplication/json;charsetUTF-8/value/list/property
/bean 3.使用ResponseBody注解 在SpringMVC中我们可以使用ResponseBody注解将Controller方法的返回值直接转换为JSON格式。这样当客户端请求该方法时将会收到一个JSON格式的响应。
package com.ctb.controller;import com.ctb.biz.UserBiz;
import com.ctb.model.User;
import com.ctb.utils.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 javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;Controller
RequestMapping(/user/json)
public class JsonController {Autowiredprivate UserBiz userBiz;/*** 返回ListT JSON数组* param req* param user* return*/ResponseBodyRequestMapping(/list)public ListUser list(HttpServletRequest req, User user){PageBean pageBean new PageBean();pageBean.setRequest(req);ListUser lst this.userBiz.listPager(user, pageBean);System.out.println(1 / 0);return lst;}/*** 返回T JSON对象* param req* param user* return*/ResponseBodyRequestMapping(/load)public User load(HttpServletRequest req, User user){if(user.getId() ! null){ListUser lst this.userBiz.listPager(user, null);return lst.get(0);}return null;}/*** 返回ListMap JSON数组* param req* param user* return*/ResponseBodyRequestMapping(/mapList)public ListMap mapList(HttpServletRequest req, User user){PageBean pageBean new PageBean();pageBean.setRequest(req);ListMap lst this.userBiz.mapListPager(user, pageBean);return lst;}/*** 返回Map JSON对象* param req* param user* return*/ResponseBodyRequestMapping(/mapLoad)public Map mapLoad(HttpServletRequest req, User user){if(user.getId() ! null){ListMap lst this.userBiz.mapListPager(user, null);return lst.get(0);}return null;}//混合ResponseBodyRequestMapping(/all)public Map all(HttpServletRequest req, User user){PageBean pageBean new PageBean();pageBean.setRequest(req);ListUser lst this.userBiz.listPager(user, pageBean);Map map new HashMap();map.put(lst,lst);map.put(pageBean,pageBean);return map;}ResponseBody//RequestMapping(/jsonStr)public String jsonStr(HttpServletRequest req, User user){return userEdit;}}注意在使用此注解之后不会再走视图解析器而是直接将数据写入到输入流中他的效果等同于通过response对象输出指定格式的数据。分别为对象数组对象数组混合 以下是部分方法运行结果 4.Jackson
4.1.介绍
Jackson是一个简单基于Java应用库Jackson可以轻松的将Java对象转换成json对象和xml文档同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少简单易用并且性能也要相对高些并且Jackson社区相对比较活跃更新速度也比较快。
特点 容易使用提供了高层次外观简化常用的用例。 无需创建映射API提供了默认的映射大部分对象序列化。 性能高快速低内存占用 创建干净的json 不依赖其他库 代码开源
4.2.常用注解
注解说明JsonIgnore作用在字段或方法上用来完全忽略被注解的字段和方法对应的属性JsonProperty作用在字段或方法上用来对属性的序列化/反序列化可以用来避免遗漏属性同时提供对属性名称重命名JsonIgnoreProperties作用在类上用来说明有些属性在序列化/反序列化时需要忽略掉JsonUnwrapped作用在属性字段或方法上用来将子JSON对象的属性添加到封闭的JSON对象JsonFormat指定序列化日期/时间值时的格式
二、异常处理机制
1.为什么要全局异常处理
我们知道系统中异常包括编译时异常和运行时异常RuntimeException前者通过捕获异常从而获取异常信息后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中不管是dao层、service层还是controller层都有可能抛出异常在springmvc中能将所有类型的异常处理从各处理过程解耦出来既保证了相关处理过程的功能较单一也实现了异常信息的统一处理和维护。
2.异常处理思路
系统的dao、service、controller出现异常都通过throws Exception向上抛出最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器一个系统只有一个异常处理器进行统一异常处理。 3.SpringMVC异常分类 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器 使用ControllerAdvice ExceptionHandler
4.综合案例
4.1.异常处理方式一
SpringMVC中自带了一个异常处理器叫SimpleMappingExceptionResolver该处理器实现了HandlerExceptionResolver 接口全局异常处理器都需要实现该接口。
!-- springmvc提供的简单异常处理器 --
bean classorg.springframework.web.servlet.handler.SimpleMappingExceptionResolver!-- 定义默认的异常处理页面 --property namedefaultErrorView valueerror/!-- 定义异常处理页面用来获取异常信息的变量名也可不定义默认名为exception -- property nameexceptionAttribute valueex/!-- 定义需要特殊处理的异常这是重要点 -- property nameexceptionMappingspropsprop keyjava.lang.RuntimeExceptionerror/prop/props!-- 还可以定义其他的自定义异常 --/property
/bean
注页面跳转由SpringMVC来接管了所以此处的定义默认的异常处理页面都应该配置成逻辑视图名。
前端页面 % page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle错误界面/title
/head
body
错误信息界面。。。。。。
${ex}
/body
/html4.2.异常处理方式二 创建一个名为GlobalException的自定义异常类
这是一个名为GlobalException的Java类它继承自RuntimeException。RuntimeException是Java中所有未检查异常的父类。这个类提供了多种构造方法用于创建不同类型的异常对象。
package com.ctb.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);}
}创建一个名为GlobalExceptionHandler的类并实现了HandlerExceptionResolver接口。
package com.ctb.component;import com.ctb.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 {Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o, Exception e) {ModelAndView mv new ModelAndView();mv.setViewName(error);//error.jspif (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;}
}
它实现了HandlerExceptionResolver接口异常处理解析器。当应用程序中抛出异常时这个处理器会被调用返回一个ModelAndView对象用于渲染错误页面。 代码解析 Component注解表示这个类是一个Spring组件Spring会自动扫描并管理这个类的实例。 GlobalExceptionHandler类实现了HandlerExceptionResolver接口该接口只有一个方法resolveExceptionSpring在处理异常时会调用这个方法。 resolveException方法接收四个参数分别是HttpServletRequest、HttpServletResponse、Object和Exception。HttpServletRequest和HttpServletResponse是HTTP请求和响应的对象Object是当前处理的请求或响应的对象Exception是发生的异常。 在resolveException方法中首先创建了一个ModelAndView对象mv然后设置了视图名称为error即错误页面。 接着判断异常的类型如果是GlobalException类型则获取其消息并添加到mv中同时添加一条全局异常....的消息。如果是RuntimeException类型则获取其消息并添加到mv中同时添加一条运行时异常....的消息。 最后返回mv对象Spring会根据这个对象渲染错误页面。 部分方法测试 4.3异常处理方式三 ControllerAdvice这是一个全局的异常处理器可以捕获所有控制器中抛出的异常。通常我们会使用 ControllerAdvice 注解来标记一个类为 ControllerAdvice然后在该类中定义异常处理方法。 ExceptionHandler这是一个用于处理方法参数中抛出的指定类型的异常的注解。我们可以在方法上使用 ExceptionHandler 注解来指定要处理的异常类型以及处理方法的名称。
package com.ctb.component;import com.ctb.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;ControllerAdvice
public 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数据ResponseBodyExceptionHandlerpublic 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;}
}
代码解析 handler(Exception e)方法 使用ResponseBody注解表示将返回的对象作为响应体发送给客户端。使用ExceptionHandler注解表示该方法用于处理控制器中抛出的异常。创建一个HashMap对象用于存储异常信息。判断异常类型如果是GlobalException则将异常信息添加到map中并设置提示信息为全局异常....;如果异常类型是RuntimeException则将异常信息添加到map中并设置提示信息为运行时异常....;其他类型的异常将异常信息添加到map中并设置提示信息为其它异常....;返回map对象。 部分方法测试 5.响应封装类 创建自定义异常类BusinessException
BusinessException自定义异常类将继承RuntimeException异常该异常类用于处理在程序代码运行过程所产生的运行时业务异常信息。 创建响应枚举类JsonResponseStatus
JsonResponseStatus响应枚举类用于自定义错误码。 创建响应封装类JsonResponseBody
JsonResponseBody响应封装类用于以JSON的形式统一输出错误信息。
// 响应封装类ResponseBodyExceptionHandlerpublic R handler(Exception e){if (e instanceof GlobalException){GlobalException globalException (GlobalException) e;return R.ok(666,全局异常....,globalException.getMessage());}else if (e instanceof RuntimeException){RuntimeException runtimeException (RuntimeException) e;return R.ok(666,运行异常....,runtimeException.getMessage());}else {return R.ok(666,其它异常....,e.getMessage());}}
根据传入的异常对象进行类型判断并返回相应的响应结果。
部分方法测试