CZ / ChenZhen
运行中
Article / 文章

SpringMVC-什么是handler、Handler与HandlerMapping关系?

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

Handler

Handler是什么?

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

在5.3.22版本中,共有5种Handler

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了,这种Handler在Spring MVC里面通过HandlerMethod类来表示。

@RestController
public class MyController {

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

4. Servlet

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

@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 来访问到,这样url 与Handler之间就有一个映射关系了。

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。

评论

共 0 条
头像预览

还没有评论,来说第一句吧。

赞赏码

如果我的博客帮助到了您,您可以友情支持一下。

微信
微信赞赏码
支付宝
支付宝赞赏码
Search / 搜索

输入后稍候,结果按标题匹配