ChenZhen 搜索
首页 标签 归档 留言板 友链 ChatGPT 提示库 AI工具导航网 关于我

文章标题

Welcome to my website ——by 陈震 (Chen Zhen)

Handler

Handler是什么?

  • Handler是一个Controller的对象和请求方式的组合的一个对象,里面的属性有请求所在的类信息、请求方法、请求参数等内容。所以从这里可以认为handler相当于是平常业务代码中每个请求对应的的controller类以及方法信息

在5.3.22版本中,共有5Handler

1. Controller接口

Spring MVC提供了Controller接口,实现该接口的Handler也可以处理请求,beanName对应匹配的URL。

@Component(value = "/MyController")
public class MyController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.err.println("MyController");
        response.getWriter().println("OK");
        response.getWriter().close();
        return null;
    }
}

2.HttpRequestHandler

Spring MVC提供了HttpRequestHandler接口,实现该接口的Handler同样可以处理请求,beanName对应匹配的URL。

相比于Controller接口,他没有返回值。Controller可以选择自己通过response完成请求,返回null。也可以返回一个视图对象,交给DispatcherServlet继续执行后续的视图逻辑。但是HttpRequestHandler则只能自己处理请求。

@Component("/MyHttpRequestHandler")
public class MyHttpRequestHandler implements HttpRequestHandler {

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.err.println("MyHttpRequestHandler");
        response.getWriter().println("OK");
        response.getWriter().close();
    }
}

3. HandlerMethod

最常用的自然是通过@RequestMapping注解将方法定义为Handler了,这种HandlerSpring MVC里面通过HandlerMethod类来表示。

@RestController
public class MyController {

    @GetMapping("MyController")
    public Object test() {
        return "OK";
    }
}

4. Servlet

最后一种就是原生的javax.servlet.Servlet,把原生Servlet作为bean注册到容器,Spring MVC也可以把它当作Handler来处理请求。他也是早期SpringMVCHandler

@Component("/MyHttpServlet")
public class MyHttpServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.err.println("MyHttpServlet");
        resp.getWriter().println("OK");
        resp.getWriter().close();
    }
}

5. HandlerFunction

他是SpringMVC最近的新生儿,于5.2版本Spring推出了WebFlux(响应式web框架)才出现的。

Handler与HandlerMapping关系

Handler可以理解为具体干活的,也就是我们的业务处理逻辑。Handler最终是要通过url 来访问到,这样urlHandler之间就有一个映射关系了。

DispatcherServlet要将一个请求交给哪个特定的Handler,它需要咨询一个Bean——这个Bean的名字为“HandlerMapping”。HandlerMapping是把一个URL指定到一个Handler上,对外提供 通过url 查询Handler的服务。

HandlerMapping 接口,只定义了一个方法getHandler。此方法是各种HandlerMapping实现类对外提供获取Handler的核心方法

public interface HandlerMapping {
    HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}

HandlerAdapter

处理器的适配器,因为有很多种处理器的实现方式,例如直接是Servlet作为处理器、实现Controller接口、使用Controller注解等,每个接口方法的返回值各式各样,所以这里使用了适配器模式,让适配器对处理器的返回值统一输出为ModelAndView

© 版权声明
😀😃😄😁😆😅🤣😂🙂🙃😉😊😇🥰😍🤩😘😗😚😙😋😛😜🤪😝🤑🤗🤭🤫🤔🤐🤨😐😑😶😏😒🙄😬🤥😌😔😪🤤😴😷🤒🤕🤢🤮🤧🥵🥶🥴😵🤯🤠🥳😎🤓🧐😕😟🙁☹️😮😯😲😳🥺😦😧😨😰😥😢😭😱😖😣😞😓😩😫🥱😤😡😠🤬