概述
Spring MVC
的一个HandlerAdapter
实现,用于支持实现了接口Controller
的控制器类,如下例子所示 :
// Controller 实现类例子
public class WelcomeController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mav = new ModelAndView("welcome");
mav.addObject("now", LocalDateTime.now().toString());
String name = request.getParameter("name");
mav.addObject("name", name == null ? "欢迎 " : name);
return mav;
}
}
// 配置类
@Configuration
public class ControllerBeanConfig {
/**
* 这里定义一个 web controller bean, 注意 :
* 1. 该 bean 实现了接口 Controller,
* 2. 该 bean 没有使用注解 @Controller,
* (如果使用了注解@Controller,会被RequestMappingHandlerMapping接管,而不是由BeanNameUrlHandlerMapping接管)
* 3. 映射到匹配 welcome* 的url
* @return
*/
@Bean(name = "/welcome*")
public WelcomeController beanWelcomeController() {
return new WelcomeController();
}
}
Spring MVC
配置机制的bean
组件BeanNameUrlHandlerMapping beanNameHandlerMapping
初始化时会检测到如上例子所示的控制器类配置并登记管理。
然后当客户请求到达时,DispatcherServlet
会根据请求的URL
寻找能处理它的Handler
,比如对于/welcome.html
这样一个URL
来讲,按照上面例子所示,目标Handler
就会是WelcomeController bean
组件,而真正的Handler
调用,DispatcherServlet
会使用SimpleControllerHandlerAdapter
来进行,实际上就是执行目标控制器bean
组件的方法handleRequest
。
源代码
源代码版本 Spring Web MVC 5.1.5.RELEASE
package org.springframework.web.servlet.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.ModelAndView;
/**
* Adapter to use the plain Controller workflow interface with
* the generic org.springframework.web.servlet.DispatcherServlet.
* Supports handlers that implement the LastModified interface.
*
* This is an SPI class, not used directly by application code.
*
*/
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
// 仅仅支持实现了接口 Controller 的Handler
@Override
public boolean supports(Object handler) {
return (handler instanceof Controller);
}
@Override
@Nullable
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 调用目标 Handler 的处理逻辑,因为目标 Handler 实现了接口 Controller,所以这里只是简单地调用目标
// Handler 的方法 handleRequest
return ((Controller) handler).handleRequest(request, response);
}
// 对 LastModified 机制的支持
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
if (handler instanceof LastModified) {
return ((LastModified) handler).getLastModified(request);
}
return -1L;
}
}