Spring MVC:DispatcherServlet源码结构

来源:互联网 发布:淘宝网隐形降权 编辑:程序博客网 时间:2024/06/07 19:42
public classDispatcherServlet extendsFrameworkServlet {
002  
003    /** List of HandlerMappings used by this servlet */
004    privateList<HandlerMapping> handlerMappings;
005 
006    /** List of HandlerAdapters used by this servlet */
007    privateList<HandlerAdapter> handlerAdapters;
008 
009    /** List of ViewResolvers used by this servlet */
010    privateList<ViewResolver> viewResolvers;
011 
012    /**
013     * Exposes the DispatcherServlet-specific request attributes and delegates to {@link #doDispatch}
014     * for the actual dispatching.
015     */
016    @Override
017    protectedvoid doService(HttpServletRequest request, HttpServletResponse response) {
018        doDispatch(request, response);
019    }
020 
021    /**
022     * Process the actual dispatching to the handler.
023     * <p>The handler will be obtained by applying the servlet's HandlerMappings in order.
024     * The HandlerAdapter will be obtained by querying the servlet's installed HandlerAdapters
025     * to find the first that supports the handler class.
026     * <p>All HTTP methods are handled by this method. It's up to HandlerAdapters or handlers
027     * themselves to decide which methods are acceptable.
028     * @param request current HTTP request
029     * @param response current HTTP response
030     * @throws Exception in case of any kind of processing failure
031     */
032    protectedvoid doDispatch(HttpServletRequest request, HttpServletResponse response) {
033        HttpServletRequest processedRequest = request;
034        HandlerExecutionChain mappedHandler =null;
035        ModelAndView mv;
036 
037        // Determine handler for the current request.
038        mappedHandler = getHandler(processedRequest,false);
039 
040        // Determine handler adapter for the current request.
041        HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
042 
043        // Apply preHandle methods of registered interceptors.
044        HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
045        for(int i = 0; i < interceptors.length; i++) {
046                HandlerInterceptor interceptor = interceptors[i];
047                interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())
048        }
049 
050        // Actually invoke the handler.
051        mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
052 
053        // Apply postHandle methods of registered interceptors.
054        for(int i = interceptors.length - 1; i >=0; i--) {
055                HandlerInterceptor interceptor = interceptors[i];
056                interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv);
057        }
058 
059        // Did the handler return a view to render?
060        render(mv, processedRequest, response);
061 
062        // Trigger after-completion for successful outcome.
063        triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response,null);
064    }
065 
066  
067    /**
068     * Return the HandlerExecutionChain for this request.
069     * <p>Tries all handler mappings in order.
070     * @param request current HTTP request
071     * @return the HandlerExecutionChain, or <code>null</code> if no handler could be found
072     */
073    protectedHandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
074        for(HandlerMapping hm : this.handlerMappings) {
075            HandlerExecutionChain handler = hm.getHandler(request);
076            if(handler != null) {
077                returnhandler;
078            }
079        }
080        returnnull;
081    }
082  
083    /**
084     * Return the HandlerAdapter for this handler object.
085     * @param handler the handler object to find an adapter for
086     * @throws ServletException if no HandlerAdapter can be found for the handler. This is a fatal error.
087     */
088    protectedHandlerAdapter getHandlerAdapter(Object handler) throwsServletException {
089        for(HandlerAdapter ha : this.handlerAdapters) {
090            if(ha.supports(handler)) {
091                returnha;
092            }
093        }
094    }
095 
096    /**
097     * Render the given ModelAndView.
098     * <p>This is the last stage in handling a request. It may involve resolving the view by name.
099     * @param mv the ModelAndView to render
100     * @param request current HTTP servlet request
101     * @param response current HTTP servlet response
102     * @throws ServletException if view is missing or cannot be resolved
103     * @throws Exception if there's a problem rendering the view
104     */
105    protectedvoid render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response)throws Exception {
106        View view;
107        view = mv.getView();
108        view.render(mv.getModelInternal(), request, response);
109    }
110}
原创粉丝点击