spring mvc3.2 请求及响应过程

doFilter-->doFilterInternal-->filterChain.doFilter-->HttpServlet service(request, response)-->doGet(req, resp)-->DispatcherServlet service(ServletRequest req, ServletResponse res)-->FrameworkServlet.processRequest-->doDispatch(request, response)-->DispatcherServlet.doDispatch调用实际action(HandlerAdapter,RequestMappingHandlerAdapter)-->RequestMappingHandlerAdapter.handle-->handleInternal
Resolver Handler Processor Discoverer resolve parameter provided Args


1,httpServlet
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
    {
String method = req.getMethod();


if (method.equals(METHOD_GET)) {
   long lastModified = getLastModified(req);
   if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
   } else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
   // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
   maybeSetLastModified(resp, lastModified);
   doGet(req, resp);
} else {
   resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
   }


} else if (method.equals(METHOD_HEAD)) {
   long lastModified = getLastModified(req);
   maybeSetLastModified(resp, lastModified);
   doHead(req, resp);


} else if (method.equals(METHOD_POST)) {
   doPost(req, resp);
   
} else if (method.equals(METHOD_PUT)) {
   doPut(req, resp);
   
} else if (method.equals(METHOD_DELETE)) {
   doDelete(req, resp);
   
} else if (method.equals(METHOD_OPTIONS)) {
   doOptions(req,resp);
   
} else if (method.equals(METHOD_TRACE)) {
   doTrace(req,resp);
   
} else {
   //
   // Note that this means NO servlet supports whatever
   // method was requested, anywhere on this server.
   //


   String errMsg = lStrings.getString("http.method_not_implemented");
   Object[] errArgs = new Object[1];
   errArgs[0] = method;
   errMsg = MessageFormat.format(errMsg, errArgs);
   
   resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
    }
    




2,httpServlet
    private static final String METHOD_DELETE = "DELETE";
    private static final String METHOD_HEAD = "HEAD";
    private static final String METHOD_GET = "GET";
    private static final String METHOD_OPTIONS = "OPTIONS";
    private static final String METHOD_POST = "POST";
    private static final String METHOD_PUT = "PUT";
    private static final String METHOD_TRACE = "TRACE";
3,DispatcherServlet获取执行的action   public class DispatcherServlet extends FrameworkServlet
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
for (HandlerMapping hm : this.handlerMappings) {
if (logger.isTraceEnabled()) {
logger.trace(
"Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
}
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) {
return handler;
}
}
return null;
}


先获取HandlerExecutionChain
接着获取HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();  for (int i = 0; i < interceptors.length; i++)
紧接着// Actually invoke the handler  mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
获取请求参数HandlerMethodParameter通过PathVariableMethodArgumentResolver eg:NamedValueInfo含有path的contentId
然后:在方法invokeHandlerMethod中创建ModelAndViewContainer并通过request来updateModel
在InvocableHandlerMethod调用实际
处理后在HandlerMethodReturnValueHandlerComposite处理响应,得到响应类型处理类RequestResponseBodyMethodProcessor
然后处理/ Apply postHandle methods of registered interceptors.  --》for (int i = interceptors.length - 1; i >= 0; i--)
渲染数据render(mv, processedRequest, response); view.render(mv.getModelInternal(), request, response);rd.forward出去


如果不是反回json而是view eg:view/workdetail 通过ViewNameMethodReturnValueHandler设置到界面 model.put(bindingResultKey, dataBinder.getBindingResult());  model---> ModelMap   ModelAndView(ModelAndView: reference to view with name 'view/workdetail'; model is {playMovieDTO=com.zqgame.zqyy.dto.PlayMovieDTO@1f60390, careerMap={}, styles=科幻, styleId=1, currentDate=Fri Nov 14 10:09:14 CST 2014, org.springframework.validation.BindingResult.playMovieDTO=org.springframework.validation.BeanPropertyBindingResult: 0 errors})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值