Spring MVC 自定义HandlerAdapter处理器适配器
HandlerAdapter 接口定义了处理器的执行方式,DispatcherServlet 通过它调用处理器并返回 ModelAndView。
接口定义
Java
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
核心方法
| 方法 | 作用 |
|---|---|
| supports | 判断是否支持该处理器类型 |
| handle | 执行处理器并返回 ModelAndView |
| getLastModified | 返回最后修改时间(用于缓存) |
自定义处理器适配器
Java
@Component
public class CustomHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof CustomController;
}
@Override
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
CustomController controller = (CustomController) handler;
String result = controller.execute(request, response);
ModelAndView mav = new ModelAndView();
mav.setViewName(result);
mav.addObject("request", request);
return mav;
}
@Override
public long getLastModified(HttpServletRequest request, Object handler) {
return -1; // 不支持缓存
}
}
自定义处理器示例
Java
public interface CustomController {
String execute(HttpServletRequest request, HttpServletResponse response);
}
public class HelloController implements CustomController {
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) {
request.setAttribute("message", "Hello Custom MVC");
return "hello";
}
}
内置适配器
| 适配器 | 支持处理器类型 |
|---|---|
| RequestMappingHandlerAdapter | @RequestMapping 方法 |
| HttpRequestHandlerAdapter | HttpRequestHandler |
| SimpleControllerHandlerAdapter | Controller 接口 |
| ServletHandlerAdapter | Servlet |
注册自定义适配器
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public CustomHandlerAdapter customHandlerAdapter() {
return new CustomHandlerAdapter();
}
}
HandlerAdapter 与 HandlerMapping 配合使用,映射器决定用哪个处理器,适配器决定如何调用。
要点总结
- supports 方法匹配处理器类型
- handle 方法执行具体的调用逻辑
- 返回 null 的 ModelAndView 表示已直接处理响应
- 大多数场景使用 RequestMappingHandlerAdapter 即可
📝 发现内容有误?点击此处直接编辑