springboot的handle层是什么层_spring

        前面的文章中我们学习了 Spring MVC 的启动流程以及 HandlerMapping,其中有一个步骤就是查找 Handler,用于处理客户端请求并返回响应结果,不同的Handler类型有不同的作用和实现方式。今天我们就来学习一下 Spring 都为我们提供了哪些 Handler:

springboot的handle层是什么层_ide_02

Controller

        Controller 是Spring MVC 中最常见的 Handler 类型,它用于处理客户端请求并返回响应结果。Controller 通常被定义为一个类,使用 @Controller 注解标识,同时也可以使用 @RequestMapping 注解来指定处理的 URI。

@Controller

@RequestMapping("/user")

public class UserController {

    @RequestMapping("/list")

    public String listUsers(Model model) {

        // 查询用户列表并设置到Model中

        List<User> userList = userService.listUsers();

        model.addAttribute("userList", userList);

        // 返回对应的视图名称

        return "user/list";

    }

}
复制代码

        在上面的例子中,UserController 是一个 Controller 类型的 Handler,它处理的 URI 为 /user/list,处理方法为 listUsers。在 listUsers 方法中,我们可以通过 userService 查询用户列表,并将其设置到 Model 中,最后返回对应的视图名称,Spring MVC 会根据视图名称来渲染响应结果。

RestController

        RestController 是一种特殊的 Controller 类型,它使用 @RestController 注解标识,用于处理 RESTful 风格的 API 请求。与普通的 Controller 不同,RestController 处理的方法返回的是 JSON 格式的数据,而不是视图名称。

@RestController

@RequestMapping("/user")

public class UserController {

    @GetMapping("/{id}")

    public User getUser(@PathVariable Long id) {

        // 查询用户信息

        User user = userService.getUserById(id);

        // 返回JSON格式的用户信息

        return user;

    }

}
复制代码

        在上面的例子中,UserController 是一个 RestController 类型的 Handler,它处理的 URI 为 /user/{id},处理方法为 getUser。在 getUser 方法中,我们可以通过 userService 查询指定 id 的用户信息,并将其返回,Spring MVC 会自动将返回结果序列化为 JSON 格式的数据。

HandlerInterceptor

        HandlerInterceptor 用于拦截客户端请求,并在处理前或处理后执行一些自定义的逻辑。通过实现实现 HandlerInterceptor 接口,并使用 @Component注解标识。

@Component

public class AuthInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

    // 判断用户是否登录,如果未登录则跳转到登录页面

    if (!isLoggedIn(request.getSession())) {

        response.sendRedirect("/login");

        return false;

    }

    // 用户已登录,继续处理请求

    return true;

}
复制代码

}

        在上面的例子中,AuthInterceptor 是一个 HandlerInterceptor 类型的 Handler,它用于在处理请求前拦截请求,并判断用户是否登录。如果用户未登录,则跳转到登录页面并中断请求处理,否则继续处理请求。

HandlerExceptionResolver

        HandlerExceptionResolver 用于处理异常情况,并返回对应的错误响应结果。通过实现 HandlerExceptionResolver 接口,并使用 @Component 注解标识。

@Component

public class CustomExceptionHandler implements HandlerExceptionResolver {

    @Override

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        // 处理异常情况并返回对应的错误响应结果

        if (ex instanceof CustomException) {

            CustomException customException = (CustomException) ex;

            ModelAndView mav = new ModelAndView("error");

            mav.addObject("errorCode", customException.getErrorCode());

            mav.addObject("errorMessage", customException.getErrorMessage());

            return mav;

        }

        // 其他异常情况交给默认的异常处理器处理

        return null;

    }

}
复制代码

        在上面的例子中,CustomExceptionHandler 是一个 HandlerExceptionResolver 类型的 Handler,它用于处理 CustomException 类型的异常。如果出现 CustomException 异常,则返回对应的错误响应结果,否则交给默认的异常处理器处理。

WebSocketHandler

        WebSocketHandler 用于处理 WebSocket 协议的客户端请求。需要实现WebSocketHandler接口,并使用 @Component 注解标识。

@Component

public class CustomWebSocketHandler implements WebSocketHandler {

    @Override

    public void afterConnectionEstablished(WebSocketSession session) throws Exception {

        // WebSocket连接建立成功后执行的逻辑

    }

    @Override

    public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {

        // 处理客户端发送的文本消息

    }

    @Override

    public void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {

        // 处理客户端发送的二进制消息

    }

    @Override

    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {

        // 处理WebSocket传输错误

    }

    @Override

    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {

        // WebSocket连接关闭后执行的逻辑

    }

}

复制代码

        在上面的例子中,CustomWebSocketHandler 是一个 WebSocketHandler 类型的 Handler,它用于处理 WebSocket 协议的客户端请求。在 CustomWebSocketHandler 中,我们可以实现afterConnectionEstablished、handleTextMessage、handleBinaryMessage、handleTransportError、afterConnectionClosed 等方法,用于处理 WebSocket 连接建立、消息传输、传输错误等情况。

总结

        Spring MVC提供了多种Handler类型,用于处理不同类型的客户端请求并返回对应的响应结果。常用的 Handler 类型包括Controller、RestController、HandlerInterceptor、HandlerExceptionResolver 和 WebSocketHandler 等。不同类型的 Handler 有不同的作用和实现方式,可以根据具体的业务需求选择合适的Handler类型,并实现对应的逻辑。