概述
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;
}
}
SpringMVC HandlerAdapter解析
本文深入探讨SpringMVC框架中HandlerAdapter的工作原理,重点介绍了SimpleControllerHandlerAdapter如何处理实现了Controller接口的控制器类,以及其在请求处理流程中的角色。
4万+

被折叠的 条评论
为什么被折叠?



