当前位置: 首页 > article >正文

Spring MVC 启动之 Handler 揭秘

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

d.png

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类型,并实现对应的逻辑。


http://www.kler.cn/a/4256.html

相关文章:

  • 如何在谷歌浏览器中设置自定义安全警告
  • 【PHP】双方接口通信校验服务
  • git操作(Windows中GitHub)
  • 以太网实战AD采集上传上位机——FPGA学习笔记27
  • 《自动驾驶与机器人中的SLAM技术》ch4:预积分学
  • 金融项目实战 05|Python实现接口自动化——登录接口
  • C#学习 Day2
  • gunicorn启动flask输出调试信息
  • CocosCreator实战篇 | 实现刮刮卡和橡皮擦 | 擦除效果
  • Mysql语句复习
  • 安装及使用本地Maven仓库
  • 面经-javascript基础
  • get和post的区别
  • python使用正则表达式re
  • Linux 多线程:多线程和多进程的对比
  • ChatGPT再掀AI资本狂潮,30位科技创新VC投资者齐聚“实在智能”
  • 2023年科睿唯安官方剔除的35本SCI清单
  • 【CSS】清除浮动 ③ ( 清除浮动 - 使用 after 伪元素 | 语法简介 | 兼容低版本浏览器 | 原理分析 )
  • 深度好文,无代码平台如何解决软件开发成本居高不下?
  • 【Python】大杀器:Photon超快速帮助你搜集信息
  • 大学生问AI
  • 2023年全国最新保安员精选真题及答案34
  • Nginx——Nginx优化方案设计
  • Day929.运用自动化工具诊断分析Sharing项目 -系统重构实战
  • LeetCode1207. 独一无二的出现次数(python)
  • C++ 多线程学习