什么是Handler
能够处理请求的方法或类
四种Handler
- 标有@RequestMapping注解的方法
@RestController
public class HelloController {
@RequestMapping("/hello")
public Object hello(){
return "success";
}
}
- 实现了Controller的类
@Component("/helloHandler")
public class HelloHandler implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("Controller handleRequest...");
return null;
}
}
- 实现了HttpRequestHandler接口的类
@Component("/helloHttpRequestHandler")
public class HelloHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloHttpRequestHandler");
}
}
- HandlerFunction的对象
@Configuration
public class HandlerConfig {
@Bean
public RouterFunction<ServerResponse> routerFunction(){
RouterFunction<ServerResponse> route = route()
.GET("/app/person", accept(APPLICATION_JSON), request->ServerResponse.ok().body("get hello router function"))
.POST("/app/person", request->ServerResponse.ok().body("post hello router function"))
.build();
return route;
}
}
Builder GET(String pattern, RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction);
@FunctionalInterface
public interface HandlerFunction<T extends ServerResponse> {
T handle(ServerRequest request) throws Exception;
}
HandlerMapping
public interface HandlerMapping {
// ...
@Nullable
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
三种HandlerMapping
在DispatcherServlet.properties中定义
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
org.springframework.web.servlet.function.support.RouterFunctionMapping
其中BeanNameUrlHandlerMapping内部存有实现了Controller的类和实现了HttpRequestHandler接口的类的映射规则,RequestMappingHandlerMapping内存存储了标有@RequestMapping注解的方法相关的映射,RouterFunctionMapping内部存储了HandlerFunction相关的映射规则
HandlerAdapter
public interface HandlerAdapter {
// 支不支持传入的handler
boolean supports(Object handler);
// 处理传入的handler
@Nullable
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
四种HandlerAdapter
-
RequestMappingHandlerAdapter 对应@RequestMapping的方法
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware, InitializingBean { }public abstract class AbstractHandlerMethodAdapter extends WebContentGenerator implements HandlerAdapter, Ordered { // ... @Override public final boolean supports(Object handler) { // HandlerMethod 对@RequestMapping标注的方法的封装 return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler)); } // ... } -
SimpleControllerHandlerAdapter 对应实现了Controller的类
public class SimpleControllerHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return (handler instanceof Controller); } @Override @Nullable public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return ((Controller) handler).handleRequest(request, response); } // ... } -
HttpRequestHandlerAdapter 对应实现了HttpRequestHandler接口的类
public class HttpRequestHandlerAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return (handler instanceof HttpRequestHandler); } @Override @Nullable public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { ((HttpRequestHandler) handler).handleRequest(request, response); return null; } @Override public long getLastModified(HttpServletRequest request, Object handler) { if (handler instanceof LastModified) { return ((LastModified) handler).getLastModified(request); } return -1L; } } -
HandlerFunctionAdapter 对应HandlerFunction的对象
public class HandlerFunctionAdapter implements HandlerAdapter, Ordered { //... @Override public boolean supports(Object handler) { // HandlerFunction对象 return handler instanceof HandlerFunction; } @Nullable @Override public ModelAndView handle(HttpServletRequest servletRequest, HttpServletResponse servletResponse, Object handler) throws Exception { HandlerFunction<?> handlerFunction = (HandlerFunction<?>) handler; ServerRequest serverRequest = getServerRequest(servletRequest); ServerResponse serverResponse = handlerFunction.handle(serverRequest); return serverResponse.writeTo(servletRequest, servletResponse, new ServerRequestContext(serverRequest)); } // ... }