当一个请求到达Spring MVC时,它将会被DispatcherServlet
处理,然后将请求转发到相应的Controller中。在控制器中给出响应后,DispatcherServlet再度介入,选择合适的视图并将处理模型渲染到视图上。
下面是从源码角度看Spring MVC请求处理过程的攻略:
概述
Spring MVC负责来自客户端的请求,并通过处理器映射器(HandlerMapper)来查找和处理合适的处理战量。处理器适配器(HandlerAdapter)被用来提供通用的处理器方法规范,而视图解析器(ViewResolver)将ModelAndView对象结合特定的视图进行呈现,以便向客户端提供响应。
请求处理流程
- 从DispatcherServlet中获取相应的Handler
- 使用
HandlerMapping
策略来查找并选择相应的处理程序 - 选择适当的
HandlerAdapter
- 处理程序执行并返回
ModelAndView
ModelAndView
结合适当的视图并呈现给客户端
从源码角度看的请求处理过程
首先来看DispatcherServlet
对象,它是Spring MVC的核心组成部分,是所有请求处理的入口点。
public class DispatcherServlet extends FrameworkServlet {
private List<HandlerMapping> handlerMappings;
private List<HandlerAdapter> handlerAdapters;
private ViewResolver viewResolver;
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
HandlerExecutionChain mappedHandler = getHandler(request);
if (mappedHandler == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());
render(mv, request, response);
} catch (Exception ex) {
throw ex;
}
}
//...其他方法
}
其实现中存在以下几个要点:
doDispatch
方法是核心处理方法,它执行了整个请求处理流程的主要逻辑。getHandler
方法使用HandlerMappings决定相应的处理器,在doDispatch
方法的开头进行处理。getHandlerAdapter
方法根据处理程序匹配适当的handler adapter,然后执行处理程序并返回ModelAndView
。- 一旦获得的
ModelAndView
中包含视图,render
方法即可呈现视图。
示例1: RequestMappingHandlerMapping
RequestMappingHandlerMapping是Spring的默认处理器映射器,它通过分析@RequestMapping注解来管理URL。
public class RequestMappingHandlerMapping extends AbstractHandlerMethodMapping<RequestMappingInfo>{
@Override
protected boolean isHandler(Class<?> beanType) {
return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}
@Override
protected void registerHandlerMethod(Object handler, Method method,
RequestMappingInfo mapping) {
this.handlerMethods.put(mapping, createHandlerMethod(handler, method));
}
@Override
public HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
for (RequestMappingInfo mapping : handlerMethods.keySet()) {
if (mapping.matches(request)) {
HandlerMethod handlerMethod = handlerMethods.get(mapping);
return new HandlerExecutionChain(handlerMethod);
}
}
return null;
}
//...其他方法
}
在上述示例中,把注解和类检测委托给了AnnotatedElementUtils
,而Method级别的@RequestMapping注解则处理为RequestMappingInfo。同时,当HTTP请求到达时,getHandler
方法将遍历请求可用的请求映射,找到一个可以处理请求的处理程序。然后将其封装成HandlerExecutionChain对象返回。
示例2:RequestMappingHandlerAdapter
DefaultAnnotationHandlerMapping类是Spring的默认处理器适配器之一,它充当了所有处理器方法公共规范的角色,并将所需的请求参数传递给方法。这是通过扫描@RequestMapping注解来实现的,@RequestParam注解则用于处理方法的参数。
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter {
@Override
protected ModelAndView handleInternal(HttpServletRequest request,
HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
Object[] args = getMethodArgumentValues(request, response, handlerMethod);
Object result = handlerMethod.invoke(args);
if (result instanceof ModelAndView) {
return (ModelAndView) result;
} else if (result instanceof String) {
return new ModelAndView((String) result);
} else {
return null;
}
}
//...其他方法
}
在上述示例中,handleInternal
方法使用反射机制将请求参数传递给@RequestParam注解处理的方法,并将结果包装在ModelAndView
中。注意:在基于@Autowired的依赖注入和其他检测操作已执行之后,才会执行这个方法。
总结
以上就是从源码角度看Spring MVC请求处理过程的攻略。在Spring MVC请求处理流程中最重要的组成部分有:DispatcherServlet、HandlerMapping、HandlerAdapter和ViewResolver。在此基础上,可以通过使用注解和反射机制快速开发出具有丰富功能的Web应用程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从源码角度看spring mvc的请求处理过程 - Python技术站