1. 前言
在Spring MVC的架构里面,负责处理HTTP请求的组件叫Handler
。DispatcherServlet会根据请求的URL查找对应的处理器Handler
,再根据Handler
查找对应的适配器HandlerAdapter
,再通过HandlerAdapter
协调Handler
处理请求。
Spring MVC并没有限制Handler
的类型,使用Object
来表示,Handler
可以以任何形式存在。正因为如此,所以需要适配器HandlerAdapter
来协调Handler
工作。
Spring MVC默认有四种类型的Handler
,对应的也就有四种适配器HandlerAdapter
。
2. HandlerMethod
最常用的自然是通过@RequestMapping
注解将方法定义为Handler了,这种Handler在Spring MVC里面通过org.springframework.web.method.HandlerMethod
类来表示。
java
@RestController
public class MyController {
@GetMapping("MyController")
public Object test() {
return "OK";
}
}
3. Controller
Spring MVC提供了org.springframework.web.servlet.mvc.Controller
接口,实现该接口的Handler也可以处理请求,beanName对应匹配的URL。
java
@Component(value = "/MyControllerImpl")
public class MyControllerImpl implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.err.println("MyControllerImpl");
response.getWriter().println("OK");
response.getWriter().close();
return null;
}
}
4. HttpRequestHandler
Spring MVC提供了org.springframework.web.HttpRequestHandler
接口,实现该接口的Handler同样可以处理请求,beanName对应匹配的URL。
java
@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();
}
}
5. Servlet
最后一种就是原生的javax.servlet.Servlet
,把原生Servlet作为bean注册到容器,Spring MVC也可以把它当作Handler来处理请求。
java
@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();
}
}
默认情况下,Spring MVC不会处理原生Servlet,原因是对应的适配器SimpleServletHandlerAdapter
默认不会注册,默认适配器Spring MVC通过配置文件DispatcherServlet.properties
管理,内容如下:
properties
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
要想Spring MVC处理原生Servlet,首先得注册适配器SimpleServletHandlerAdapter
。