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
。