黑马程序员springmvc教程第二天:数据回显和异常处理

合集下载

黑马程序员springmvc教程第二天:springmvc校验

黑马程序员springmvc教程第二天:springmvc校验

springmvc校验校验理解项目中,通常使用较多是前端的校验,比如页面中js校验。

对于安全要求较高点建议在服务端进行校验。

服务端校验:控制层conroller:校验页面请求的参数的合法性。

在服务端控制层conroller 校验,不区分客户端类型(浏览器、手机客户端、远程调用)业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数。

持久层dao:一般是不校验的。

springmvc校验需求springmvc使用hibernate的校验框架validation(和hibernate没有任何关系)。

校验思路:页面提交请求的参数,请求到controller方法中,使用validation进行校验。

如果校验出错,将错误信息展示到页面。

具体需求:商品修改,添加校验(校验商品名称长度,生产日期的非空校验),如果校验出错,在商品修改页面显示错误信息。

环境准备hibernate的校验框架validation所需要jar包:配置校验器校验器注入到处理器适配器中在pojo中添加校验规则在ItemsCustom.java中添加校验规则:CustomValidationMessages.propert ies在CustomValidationMessages.properties配置校验错误信息:捕获校验错误信息//在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult bindingResult接收校验出错信息//注意:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。

在页面显示校验错误信息在controller中将错误信息传到页面即可。

页面显示错误信息:分组校验需求在pojo中定义校验规则,而pojo是被多个 controller所共用,当不同的controller方法对同一个pojo进行校验,但是每个controller方法需要不同的校验。

SpringMVC异常处理详解

SpringMVC异常处理详解

SpringMVC异常处理详解Spring MVC中异常处理的类体系结构下图中,我画出了Spring MVC中,跟异常处理相关的主要类和接⼝。

在Spring MVC中,所有⽤于处理在请求映射和请求处理过程中抛出的异常的类,都要实现HandlerExceptionResolver接⼝。

AbstractHandlerExceptionResolver实现该接⼝和Orderd接⼝,是HandlerExceptionResolver类的实现的基类。

ResponseStatusExceptionResolver等具体的异常处理类均在AbstractHandlerExceptionResolver之上,实现了具体的异常处理⽅式。

⼀个基于Spring MVC的Web应⽤程序中,可以存在多个实现了HandlerExceptionResolver的异常处理类,他们的执⾏顺序,由其order属性决定, order值越⼩,越是优先执⾏, 在执⾏到第⼀个返回不是null的ModelAndView的Resolver时,不再执⾏后续的尚未执⾏的Resolver的异常处理⽅法。

下⾯我逐个介绍⼀下SpringMVC提供的这些异常处理类的功能。

DefaultHandlerExceptionResolverHandlerExceptionResolver接⼝的默认实现,基本上是Spring MVC内部使⽤,⽤来处理Spring定义的各种标准异常,将其转化为相对应的HTTP Status Code。

其处理的异常类型有:handleNoSuchRequestHandlingMethodhandleHttpRequestMethodNotSupportedhandleHttpMediaTypeNotSupportedhandleMissingServletRequestParameterhandleServletRequestBindingExceptionhandleTypeMismatchhandleHttpMessageNotReadablehandleHttpMessageNotWritablehandleMethodArgumentNotValidExceptionhandleMissingServletRequestParameterhandleMissingServletRequestPartExceptionhandleBindExceptionResponseStatusExceptionResolver⽤来⽀持ResponseStatus的使⽤,处理使⽤了ResponseStatus注解的异常,根据注解的内容,返回相应的HTTP Status Code和内容给客户端。

【SpringBoot】统一返回对象和统一异常处理

【SpringBoot】统一返回对象和统一异常处理

【SpringBoot】统⼀返回对象和统⼀异常处理为什么要统⼀异常Java异常分为unchecked和checked,对于unchecked的那些异常⼀般都是代码写的有问题,⽐如你没有处理null对象,直接就⽤这个对象的⽅法或者属性了(NullPointException),或者是除0(ArithmeticException),或者是数组下标越界了(ArrayIndexOutOfBoundsException),这种的你要是能意识到try或者throw,那肯定不可能写错了。

但是对于checked,就是java要求我们处理的异常了,⽐如说SQLException , IOException,ClassNotFoundException,如果我们不做统⼀处理,那前端收到的会是⼀坨异常调⽤栈,⾮常恐怖,⽽且花样繁多,⽐如hibernate-validator的异常栈....还有就是业务异常,这种的都是⾃定义的异常,⼀般都是基于RuntimeException改的。

所以,为了把这些乱七⼋糟的都统⼀起来,按照与前端约定好的格式返回,统⼀异常⾮常有必要。

为什么要统⼀返回值不统⼀的话,返回值会五花⼋门,对于前端来说⽆法做⼀些统⼀处理,⽐如说统⼀通过状态为快速判断接⼝调⽤情况,接⼝调⽤失败原因获取每个接⼝都要⾃定义⼀个。

如果统⼀了,则前端可以写⼀个调⽤回调解析⽅法,就能快速获取接⼝调⽤情况了,⼗分便捷。

如下代码:{"state": false,"code": "-1","data": "数据库中未查询到该学⽣","timestamp": 1640142947034}前端可以通过code直接判断接⼝调⽤情况,通过data获取异常信息,或者是需要查询的数据。

如何实现统⼀异常Spring为我们提供了⼀个注解:@ControllerAdvice@ControllerAdvice@Slf4jpublic class GlobalExceptionHandler {/*** 处理⾃定义的业务异常* @param e* @return*/@ExceptionHandler(value = BusinessException.class)@ResponseBodypublic ResponseEntity businessExceptionHandler(BusinessException e){log.error("发⽣业务异常!原因是:{}",e.getMessage());return ResponseHelper.failed(e.getMessage());}}我们只需要在@ExceptionHandler这⾥写上想拦截处理的异常,就可以了,在该⽅法中,你可以把关于这个异常的信息获取出来⾃由拼接,然后通过统⼀返回格式返回给前端,⽅便前端处理展⽰。

黑马程序员springmvc教程第二天:拦截器(1)

黑马程序员springmvc教程第二天:拦截器(1)

拦截器拦截定义定义拦截器,实现HandlerInterceptor接口。

接口中提供三个方法。

publicclass HandlerInterceptor1implements HandlerInterceptor { //进入 Handler方法之前执行//用于身份认证、身份授权//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行@Overridepublicboolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {//return false表示拦截,不向下执行//return true表示放行returnfalse;}//进入Handler方法之后,返回modelAndView之前执行//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图@Overridepublicvoid postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception { }//执行Handler完成执行此方法//应用场景:统一异常处理,统一日志处理@Overridepublicvoid afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {}}拦截器配置针对HandlerMapping配置springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该拦截器。

SpringMVC处理方法返回值过程解析

SpringMVC处理方法返回值过程解析

SpringMVC处理⽅法返回值过程解析这篇⽂章主要介绍了Spring MVC处理⽅法返回值过程解析,⽂中通过⽰例代码介绍的⾮常详细,对⼤家的学习或者⼯作具有⼀定的参考学习价值,需要的朋友可以参考下对于Spring MVC处理⽅法⽀持⽀持⼀系列的返回⽅式:(1)ModelAndView(2)Model(3)ModelMap(4)Map(5)View(6)String(7)Void(8)Object⼀,ModelAndView@RequestMapping("/threadRequest*")public ModelAndView threadRequest(){ModelAndView mv=new ModelAndView();mv.setViewName("index");mv.addObject("user","王五");return mv;}通过ModelAndView构造⽅法可以指定返回的页⾯名称,也可以通过setViewName()⽅法跳转到指定的页⾯ ,使⽤addObject()设置需要返回的值,addObject()有⼏个不同参数的⽅法,可以默认和指定返回对象的名字。

调⽤addObject()⽅法将值设置到⼀个名为ModelMap的类属性,ModelMap是LinkedHashMap的⼦类,⼆,ModelModel是⼀个接⼝,其实现类为ExtendedModelMap,继承了ModelMap类。

model.addAttribute("pojo", pojo);三,ModelMapModel 是⼀个接⼝,其实现类为ExtendedModelMap,继承了ModelMap类。

四,Map@RequestMapping("/show")public Map<String, String> getMap() {Map<String, String> map = new HashMap<String, String>();map.put("key1", "value-1");map.put("key2", "value-2");return map;}五,View可以返回pdf excel六,String@RequestMapping("/RequestMethod")public String index(Model model) {String retVal = "user/index";List<User> users = userService.getUsers();model.addAttribute("users", users);return retVal;}1、如果返回值为null,那么以请求名作为视图名进⾏跳转2、如果指定返回值,那么按照指定返回值作为视图名进⾏跳转,可以通过model,modeMap携带数据。

springmvc-机制(拦截器、aop、异常)

springmvc-机制(拦截器、aop、异常)

◆Spring-mvc知识➢概念Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

图1 Spring Web MVC核心架构图理解这张图之前我们得先知道以下的几个名词:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器(Validator)、命令对象(Command 请求参数绑定到的对象就叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)步骤解析:核心架构的具体流程步骤如下:1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;2、DispatcherServlet——>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;3、DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);5、ModelAndView的逻辑视图名——> ViewResolver,ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

springmvc请求参数异常统一处理

springmvc请求参数异常统一处理

springmvc请求参数异常统⼀处理 1、ExceptionHandlerControllerpackage com.oy.controller;import java.text.MessageFormat;import org.springframework.beans.TypeMismatchException;import org.springframework.http.HttpStatus;import org.springframework.http.converter.HttpMessageNotReadableException;import org.springframework.web.HttpRequestMethodNotSupportedException;import org.springframework.web.bind.MissingServletRequestParameterException;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.ResponseStatus;import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;import com.alibaba.fastjson.JSONObject;import com.oy.exception.ForbiddenException;import com.oy.utils.UtilFunctions;@ControllerAdvicepublic class ExceptionHandlerController {@ExceptionHandler(RuntimeException.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ResponseBodypublic JSONObject runtimeExceptionHandler(RuntimeException ex) {UtilFunctions.log.error("runtimeExceptionHandler, msg:{}, exception:{}", ex.toString(), ex);JSONObject response = new JSONObject();response.put("message", "Internal Server Error");return response;}@ExceptionHandler(NullPointerException.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)@ResponseBodypublic JSONObject nullPointerExceptionHandler(NullPointerException ex) {UtilFunctions.log.error("nullPointerExceptionHandler, msg:{}, exception:{}", ex.toString(), ex);JSONObject response = new JSONObject();response.put("message", "Internal Server Error");return response;}/*----- REQUEST ERROR -----*/@ExceptionHandler({ ForbiddenException.class })@ResponseStatus(HttpStatus.FORBIDDEN)@ResponseBodypublic JSONObject requestForbidden(ForbiddenException ex) {UtilFunctions.log.error("ForbiddenExceptionHandler, msg:{}, exception:{}", ex.toString(), ex);JSONObject response = new JSONObject();response.put("message", ex.getMessage());return response;}@ExceptionHandler({ TypeMismatchException.class })@ResponseStatus(HttpStatus.BAD_REQUEST)@ResponseBodypublic JSONObject requestTypeMismatch(TypeMismatchException ex) {UtilFunctions.log.error("TypeMismatchExceptionHandler, msg:{}, exception:{}", ex.toString(), ex);JSONObject response = new JSONObject();// response.put("message", "Bad Request");// response.put("message", "Bad Request, parameter type of " + ex.getPropertyName() + " need be " + ex.getRequiredType());if (Double.class.equals(ex.getRequiredType()) || Integer.class.equals(ex.getRequiredType())) {response.put("message", "Bad Request, " + ex.getValue() + " not a number");} else {String strTemplate = "Bad Request, {0} is invalid, a type of {1} is needed";response.put("message", MessageFormat.format(strTemplate, ex.getValue(), ex.getRequiredType().getName()));}return response;}@ExceptionHandler({ MissingServletRequestParameterException.class })@ResponseStatus(HttpStatus.BAD_REQUEST)@ResponseBodypublic JSONObject requestMissingServletRequest(MissingServletRequestParameterException ex) {UtilFunctions.log.error("MissingServletRequestParameterExceptionHandler, msg:{}, exception:{}", ex.toString(), ex);JSONObject response = new JSONObject();// response.put("message", "Bad Request");String strTemplate = "Bad Request, param:{0} is required, type:{1}";response.put("message", MessageFormat.format(strTemplate, ex.getParameterName(), ex.getParameterType()));return response;}@ExceptionHandler({ NoSuchRequestHandlingMethodException.class })@ResponseStatus(HttpStatus.BAD_REQUEST)@ResponseBodypublic JSONObject NoSuchRequestHandlingMethodExceptionHandler(NoSuchRequestHandlingMethodException ex) { UtilFunctions.log.error("NoSuchRequestHandlingMethodExceptionHandler, msg:{}, exception:{}", ex.toString(), ex); JSONObject response = new JSONObject();response.put("message", "Not Found");return response;}/*----- REQUEST ERROR -----*/@ExceptionHandler({ HttpMessageNotReadableException.class })@ResponseStatus(HttpStatus.BAD_REQUEST)@ResponseBodypublic JSONObject requestNotReadable(HttpMessageNotReadableException ex) {UtilFunctions.log.error("HttpMessageNotReadableExceptionHandler, msg:{}, exception:{}", ex.toString(), ex);JSONObject response = new JSONObject();response.put("message", "Bad Request");return response;}@ExceptionHandler({ HttpRequestMethodNotSupportedException.class })@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)@ResponseBodypublic JSONObject request405(HttpRequestMethodNotSupportedException ex) {UtilFunctions.log.error("HttpRequestMethodNotSupportedExceptionHandler, msg:{}, exception:{}", ex.toString(), ex); JSONObject response = new JSONObject();// response.put("message", "Method Not Allowed");response.put("message", ex.getMessage());return response;}}2、postman测试3、异常增强类型: NullPointerException,RunTimeException,ClassCastException, NoSuchMethodException,IOException,IndexOutOfBoundsException 以及springmvc⾃定义异常等,如下: SpringMVC⾃定义异常对应的status codeException HTTP Status CodeConversionNotSupportedException 500 (Internal Server Error)HttpMessageNotWritableException 500 (Internal Server Error)HttpMediaTypeNotSupportedException 415 (Unsupported Media Type) HttpMediaTypeNotAcceptableException 406 (Not Acceptable) HttpRequestMethodNotSupportedException 405 (Method Not Allowed) NoSuchRequestHandlingMethodException 404 (Not Found)TypeMismatchException 400 (Bad Request)HttpMessageNotReadableException 400 (Bad Request)MissingServletRequestParameterException 400 (Bad Request)参考资料: (1) (2) (3)。

springmvc-机制(拦截器、aop、异常)

springmvc-机制(拦截器、aop、异常)

◆Spring-mvc知识概念Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

图1 Spring Web MVC核心架构图理解这张图之前我们得先知道以下的几个名词:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器( Validator)、命令对象(Command 请求参数绑定到的对象就叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)步骤解析:核心架构的具体流程步骤如下:1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;2、 DispatcherServlet——>HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);5、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;6、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据回显
什么数据回显
提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面。

pojo数据回显方法
1、springmvc默认对pojo数据进行回显。

pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写)
使用@ModelAttribute指定pojo回显到页面在request中的key
2、@ModelAttribute还可以将方法的返回值传到页面
在商品查询列表页面,通过商品类型查询商品信息。

在controller中定义商品类型查询方法,最终将商品类型传到页面。

页面上可以得到itemTypes数据。

3、使用最简单方法使用model,可以不用@ModelAttribute
简单类型数据回显
使用最简单方法使用model。

model.addAttribute("id", id);
异常处理
异常处理思路
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

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

相关文档
最新文档