Spring MVC 拦截器,Spring MVC 异常处理机制:

什么是Rest,有什么特点

Rest、Restful

REST:是一种规则或风格。

Roy Thomas Fielding

RESTFul:按RESTful规则的一种应用。

目前主流的RESTful应用,都是REST规则在HTTP协议之上一种应用。

基于URL定位资源,通过HTTP动作做不同操作。

http://localhost:8888/news/2
GET 查询
POST 添加
PUT 更新
DELETE 删除

使用技术目的:前后分离模式,异构系统之间交互更规范。搜索引擎更敏感。

什么是Thymeleaf,有什么特点,常用属性标记

Thymeleaf是一种模板技术,例如veloctiy、freemarker等。

Thymeleaf是对JSP替代,性能好。跟其他模板技术比,扩展名为html可以直接用浏览器打开,所见即所得。SpringBoot主推Thymeleaf。

th:text 、th:each、 th:if、 th:value、 th:href等

SpringBoot MVC机制:

Spring MVC 拦截器:

  1. 按规则编写拦截器组件,实现HandlerInterceptor接口

     @Component//扫描
     public class SomeInterceptor implements HandlerInterceptor{
    
         //在controller前执行,如果方法返回false就是阻止流程继续执行
         public boolean preHandle(HttpServletRequest request, 
                 HttpServletResponse response, Object handler)
                 throws Exception {
             System.out.println("preHandle");
             return true;
         }
    
         //在controller后执行,可以改变ModelAndView结果
         public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                 @Nullable ModelAndView modelAndView) throws Exception {
             System.out.println("postHandle");
         }
    
         //在响应输出前
         public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                 @Nullable Exception ex) throws Exception {
             System.out.println("afterCompletion");
         }
    
     }
    
  1. 编写配置类,实现WebMvcConfigurer接口

     @Configuration
     public class MyInterceptorConfiguration implements WebMvcConfigurer{
    
         @Autowired
         private SomeInterceptor some;
    
         public void addInterceptors(InterceptorRegistry registry) {
    
             registry.addInterceptor(some).addPathPatterns("/demo1");
         }
    
     }
    

Spring MVC 异常处理机制:

  1. SpringBoot异常处理过程

    SpringBoot提供了一个自动配置组件ErrorMvcAutoConfiguration,自动创建一个BasicErrorController对象,该对象有两个/error请求处理,一个返回html响应;另一个返回json响应。当Boot底层发生异常,会自动以转发方式调用/error请求,返回处理结果,显示白板界面。

  2. 自定义异常处理Controller

    编写Controller,实现ErrorController,底层自动配置BasicErrorController将失效。

     @Controller
     @RequestMapping("/error")
     public class MyErrorController implements ErrorController{
    
         public String getErrorPath() {
             return "/error";
         }
    
         @RequestMapping(produces=MediaType.TEXT_HTML_VALUE)
         public ModelAndView errorHtml() {
             ModelAndView mav = new ModelAndView();
             mav.setViewName("myerror");
             mav.getModel().put("msg", "自定义异常处理");
             return mav;
         }
    
         @RequestMapping
         @ResponseBody
         public Object error() {
             Map<String,Object> map = new HashMap<String, Object>();
             map.put("msg", "自定义异常");
             map.put("error", "json类型响应");
             return map;
         }
    
     }
    

    提示:追加thymeleaf支持,在templates下添加myerror.html模板文件。

  1. @ExceptionHanlder处理

    在Controller中添加异常处理方法,处理当前Controller内的异常。

     @Controller
     public class Demo2Controller{
    
         @GetMapping("/demo2")
         @ResponseBody
         public Object say() {
             Map<String, Object> data = new HashMap<String, Object>();
             data = null;
             data.put("id", 1);
             data.put("name", "tom");
             return data;
         }
    
         @ExceptionHandler
         @ResponseBody
         public Object handleException(Exception ex) {
             Map<String, Object> data = new HashMap<String, Object>();
             data.put("msg", "发生异常了");
             data.put("type", ex.getClass().getName());
             return data;
         }
    
     }
    

    提示:可以提成一个BasicController父类处理多个Controller异常,也可以添加@ControllerAdvice用于所有Controller异常处理。