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。