Spring-DispatcherServlet请求处理

本文详细解析了Spring MVC中的DispatcherServlet处理HTTP请求的过程,包括初始化、请求映射、选择合适的HandlerAdapter以及视图渲染等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring-DispatcherServlet初始化详解:[url]http://donald-draper.iteye.com/blog/2325394[/url]
Spring的DefaultAnnotationHandlerMapping详解:[url]http://donald-draper.iteye.com/blog/2325453[/url]
前面我们已经探究过DispatcherServlet的初始化,下面我们来看看
DispatcherServlet如何处理web请求
//DispatcherServlet
 public class DispatcherServlet extends FrameworkServlet
{
}

从DispatcherServlet我们看不到任何请求处理入口再来看FrameworkServlet
public abstract class FrameworkServlet extends HttpServletBean
implements ApplicationContextAware
{
public FrameworkServlet(WebApplicationContext webApplicationContext)
{
contextClass = DEFAULT_CONTEXT_CLASS;
contextInitializers = new ArrayList();
publishContext = true;
publishEvents = true;
threadContextInheritable = false;
dispatchOptionsRequest = false;
dispatchTraceRequest = false;
webApplicationContextInjected = false;
refreshEventReceived = false;
this.webApplicationContext = webApplicationContext;
}
//在这里我们发现了处理请求的方法,默认方法
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String method = request.getMethod();
if(method.equalsIgnoreCase(RequestMethod.PATCH.name()))
processRequest(request, response);
else
super.service(request, response);
}
//GET
protected final void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
processRequest(request, response);
}
//POST
protected final void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
processRequest(request, response);
}
//PUT
protected final void doPut(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
processRequest(request, response);
}
//DELETE
protected final void doDelete(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
processRequest(request, response);
}
//实际处理请求方法
protected final void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
try
{
//处理请求
doService(request, response);
}
}
//带子类DispatcherServlet扩展
protected abstract void doService(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
throws Exception;
public static final String DEFAULT_NAMESPACE_SUFFIX = "-servlet";
public static final Class DEFAULT_CONTEXT_CLASS = org/springframework/web/context/support/XmlWebApplicationContext;
public static final String SERVLET_CONTEXT_PREFIX = (new StringBuilder()).append(org/springframework/web/servlet/FrameworkServlet.getName()).append(".CONTEXT.").toString();
private static final String INIT_PARAM_DELIMITERS = ",; \t\n";
private String contextAttribute;
private Class contextClass;
private String contextId;
private String namespace;
private String contextConfigLocation;
private final ArrayList contextInitializers;
private String contextInitializerClasses;
private boolean publishContext;
private boolean publishEvents;
private boolean threadContextInheritable;
private boolean dispatchOptionsRequest;
private boolean dispatchTraceRequest;
private WebApplicationContext webApplicationContext;
private boolean webApplicationContextInjected;
private boolean refreshEventReceived;
}

我们来看DispatcherServlet
public class DispatcherServlet extends FrameworkServlet
{
public DispatcherServlet(WebApplicationContext webApplicationContext)
{
super(webApplicationContext);
detectAllHandlerMappings = true;
detectAllHandlerAdapters = true;
detectAllHandlerExceptionResolvers = true;
detectAllViewResolvers = true;
throwExceptionIfNoHandlerFound = false;
cleanupAfterInclude = true;
}
//处理请求
protected void doService(HttpServletRequest request, HttpServletResponse response)
throws Exception
{
//设置请求属性,web上下文,本地化,主题
request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, localeResolver);
request.setAttribute(THEME_RESOLVER_ATTRIBUTE, themeResolver);
request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());
FlashMap inputFlashMap = flashMapManager.retrieveAndUpdate(request, response);
if(inputFlashMap != null)
request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
request.setAttribute(OUTPUT_FLASH_MAP_ATTRIBUTE, new FlashMap());
request.setAttribute(FLASH_MAP_MANAGER_ATTRIBUTE, flashMapManager);
//委托给doDispatch
doDispatch(request, response);

}

protected void doDispatch(HttpServletRequest request, HttpServletResponse response)
throws Exception
{
HttpServletRequest processedRequest;
HandlerExecutionChain mappedHandler;
boolean multipartRequestParsed;
WebAsyncManager asyncManager;
processedRequest = request;
mappedHandler = null;
multipartRequestParsed = false;
asyncManager = WebAsyncUtils.getAsyncManager(request);
ModelAndView mv;
Exception dispatchException;
mv = null;
dispatchException = null;
processedRequest = checkMultipart(request);
multipartRequestParsed = processedRequest != request;
//获取控制器处理器链
mappedHandler = getHandler(processedRequest);
HandlerAdapter ha;
//获取控制器方法适配器
ha = getHandlerAdapter(mappedHandler.getHandler());
//获取处理视图
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//返回视图
applyDefaultViewName(request, mv);
}
//获取控制器处理器链
protected HandlerExecutionChain getHandler(HttpServletRequest request)
throws Exception
{
//List<HashMap<String,HandlerMapping>>
for(Iterator iterator = handlerMappings.iterator(); iterator.hasNext();)
{
HandlerMapping hm = (HandlerMapping)iterator.next();
if(logger.isTraceEnabled())
logger.trace((new StringBuilder()).append("Testing handler map [").append(hm).append("] in DispatcherServlet with name '").append(getServletName()).append("'").toString());
HandlerExecutionChain handler = hm.getHandler(request);
if(handler != null)
return handler;
}
}
//获取控制器方法适配器
protected HandlerAdapter getHandlerAdapter(Object handler)
throws ServletException
{
//List<HashMap<String,HandlerAdapter>>
for(Iterator iterator = handlerAdapters.iterator(); iterator.hasNext();)
{
HandlerAdapter ha = (HandlerAdapter)iterator.next();
if(logger.isTraceEnabled())
logger.trace((new StringBuilder()).append("Testing handler adapter [").append(ha).append("]").toString());
if(ha.supports(handler))
return ha;
}
}
private List handlerMappings;//List<HashMap<String,HandlerMapping>>,Key为beanName,value值为HandlerMapping实例
private List handlerAdapters;//List<HashMap<String,HandlerAdapter>>,Key为beanName,value值为HandlerAdapter实例
private List handlerExceptionResolvers;
private List viewResolvers;

static
{
try
{
//加载默认配置文件
ClassPathResource resource = new ClassPathResource("DispatcherServlet.properties", org/springframework/web/servlet/DispatcherServlet);
defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
}
}
}

[color=blue]总结:
DispatcherServlet处理请求实际上是通过FrameworkServlet的Service()和do*类方法,
而这些方式实际的处理逻辑在DispatcherServlet的doService和doDispatch中,doDispatch
先找出控制器处理器,然后再找出控制器方法适配器,通过控制器方法适配器,来处理具体请求。[/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值