每日大赛下载:开启你的无限可能,赢取属于你的荣耀!
文章目录配置类 SpringMvcInit配置类 MvcConfig全局异常处理器User实体类 (参数校验)UserController拦截器 MyInterceptor拦截器 MyInterceptor1配置类 SpringMvcInitpackagecom.cool.config;importorg.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;可以被 web项目加载会初始化ioc容器会设置 dispatcherServlet的地址publicclassSpringMvcInitextendsAbstractAnnotationConfigDispatcherServletInitializer{OverrideprotectedClass?[]getRootConfigClasses(){returnnewClass[0];}设置配置类OverrideprotectedClass?[]getServletConfigClasses(){returnnewClass[]{MvcConfig.class};}配置springmvc内部自带servlet的访问地址OverrideprotectedString[]getServletMappings(){returnnewString[]{/};}}配置类 MvcConfigpackagecom.cool.config;importcom.cool.interceptor.MyInterceptor;importcom.cool.interceptor.MyInterceptor1;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;importorg.springframework.web.servlet.config.annotation.EnableWebMvc;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;EnableWebMvcConfigurationComponentScan({com.cool.controller,com.cool.error})publicclassMvcConfigimplementsWebMvcConfigurer{/* 通过configurer.enable()启用默认Servlet处理。
当请求无法匹配到Spring的控制器时会回退到Servlet容器的默认Servlet如Tomcat的DefaultServlet 主要用于处理静态资源如HTML、JS、CSS。
典型场景 配置后对 /static/** 的请求会先由Spring处理未匹配则交给容器默认Servlet */OverridepublicvoidconfigureDefaultServletHandling(DefaultServletHandlerConfigurerconfigurer){configurer.enable();}OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){// 配置方案-1拦截全部请求registry.addInterceptor(newMyInterceptor());// 配置方案-2拦截指定的请求// *任意一层字符串**任意多层字符串registry.addInterceptor(newMyInterceptor()).addPathPatterns(/user/**);// 拦截 user/ 下的所有请求// 配置方案-3排除拦截// 拦截 user/ 下除了 /user/data1 之外的请求地址registry.addInterceptor(newMyInterceptor()).addPathPatterns(/user/**).excludePathPatterns(/user/data
;// 如果有多个拦截器执行流程是怎样的呢/* 先声明的优先级高优先级高的在外层 MyInterceptor.preHandle MyInterceptor
preHandle OrderController.data MyInterceptor
postHandle MyInterceptor.postHandle MyInterceptor
afterCompletion MyInterceptor.afterCompletion */registry.addInterceptor(newMyInterceptor());registry.addInterceptor(newMyInterceptor1());}}全局异常处理器全局异常处理器 GlobalException 使用了 RestControllerAdvice处理 ArithmeticException 和 Exception。
当 Controller 中的方法抛出这些异常时会被对应的 ExceptionHandler 方法捕获并处理。
packagecom.cool.error;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;/** * 全局异常处理器 * * ControllerAdvice * 作用全局异常发生就会走此类的方法可以返回 逻辑视图、转发、重定向 * * RestControllerAdvice * 相当于 ControllerAdvice 和 ResponseBody 的组合 * 可以直接返回 json 字符串 * */RestControllerAdvicepublicclassGlobalException{/* 发生异常后 - ControllerAdvice注解的类型 - ExceptionHandler(指定的异常) - 执行handler 如果没有找到指定的异常就会找父类Exception */精准匹配算术异常ExceptionHandler(ArithmeticException.class)publicObjectArithmeticExceptionHandler(ArithmeticExceptione){// 自定义异常处理即可Stringmessagee.getMessage();System.out.println(ArithmeticExceptionHandlermessage);returnmessage;}兜底所有异常ExceptionHandler(Exception.class)publicObjectExceptionHandler(Exceptione){Stringmessagee.getMessage();System.out.println(ExceptionHandlermessage);returnmessage;}}User实体类 (参数校验)packagecom.cool.pojo;importjakarta.validation.constraints.Email;importjakarta.validation.constraints.Min;importjakarta.validation.constraints.NotBlank;importjakarta.validation.constraints.Past;importlombok.Data;importorg.hibernate.validator.constraints.Length;importjava.util.Date;/** * name不为null、不为空字符串 * 字符串不为空NotBlank * 集合不为空NotEmpty * 包装类型不为空NotNull * * password长度大于6 */DatapublicclassUser{NotBlankprivateStringname;Length(min6,max
privateStringpassword;Min(
privateintage;EmailprivateStringemail;PastprivateDatebirthday;}UserControllerpackagecom.cool.controller;importcom.cool.pojo.User;importorg.springframework.validation.BindingResult;importorg.springframework.validation.annotation.Validated;importorg.springframework.web.bind.annotation.*;importjava.util.HashMap;importjava.util.Map;RestControllerRequestMapping(user)publicclassUserController{/** * 步骤1实体类属性添加校验注解 * 步骤2handler(Validated 实体类对象){} * 细节 * param、json 校验注解都有效果 * 只不过json参数的话需要用 RequestBody 修饰形参哦 * * 这里有个天坑如果不符合校验规则会直接向前端抛出异常 * 解决办法 * handler(Validated 实体类对象, BindingResult request){} * 多加一个 BindingResult request 参数 * 此参数必须紧挨着 Validated 实体类对象否则此参数不管用 */PostMapping(register)publicObjectregister(ValidatedRequestBodyUseruser,BindingResultresult){System.out.println(user user);if(result.hasErrors()){// 有错误的话就不直接返回给前端了可以在这里自定义内容返回给前端MapdatanewHashMap();data.put(code,
;data.put(msg,参数校验异常);returndata;}returnuser;}GetMapping(data)publicStringdata(){// 这个方法做成空指针异常Stringnamenull;name.toString();// NullPointerException报错后就不会执行下面的代码了就会取异常处理那里returndata - ok;}GetMapping(data
publicStringdata1(){// 这个方法做成算数异常inti1/0;// ArithmeticException: / by zeroreturndata1 - ok;}}拦截器 MyInterceptorpackagecom.cool.interceptor;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;/** * 声明好这个类之后 * 需要在 MvcConfig 类中注册上 */publicclassMyInterceptorimplementsHandlerInterceptor{/** * handler执行之前触发 * param request 请求对象 * param response 响应对象 * param handler 就是我们要调用的方法对象 * return true放行false拦截 * throws Exception */OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println(request request,response response,handler handler);System.out.println(MyInterceptor.preHandle);returntrue;}/** * 当 handler 执行完毕后触发此方法没有拦截机制了 * 此方法只有在 preHandle方法 return true 的时候才会被执行 * param request * param response * param handler * param modelAndView 返回的视图和共享域的数据对象如果没有的话返回null * throws Exception * * 对 响应结果 的处理 * */OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println(MyInterceptor.postHandle);}/** * 整体处理完毕后会触发这个方法 * param request * param response * param handler * param ex 如果 handler方法报错了这个参数就是异常对象 * throws Exception */OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println(MyInterceptor.afterCompletion);}}拦截器 MyInterceptor1packagecom.cool.interceptor;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;/** * 声明好这个类之后 * 需要在 MvcConfig 类中注册上 */publicclassMyInterceptor1implementsHandlerInterceptor{/** * handler执行之前触发 * param request 请求对象 * param response 响应对象 * param handler 就是我们要调用的方法对象 * return true放行false拦截 * throws Exception */OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println(MyInterceptor
preHandle);returntrue;}/** * 当 handler 执行完毕后触发此方法没有拦截机制了 * 此方法只有在 preHandle方法 return true 的时候才会被执行 * param request * param response * param handler * param modelAndView 返回的视图和共享域的数据对象如果没有的话返回null * throws Exception * * 对 响应结果 的处理 * */OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println(MyInterceptor
postHandle);}/** * 整体处理完毕后会触发这个方法 * param request * param response * param handler * param ex 如果 handler方法报错了这个参数就是异常对象 * throws Exception */OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println(MyInterceptor
afterCompletion);}}
百度百科投诉规则-百度百科投诉规则应用