简化DispatcherServlet,理解调用流程

import java.util.List;
import java.util.Locale;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;

public class DispatcherServletDemo {
	private List<HandlerMapping> handlerMappings = null;
	private List<HandlerAdapter> handlerAdapters = null;
	private List<HandlerExceptionResolver> handlerExceptionResolvers = null;
	private List<ViewResolver> viewResolvers = null;

	public void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView modelAndView = null;
		Exception dispatchException = null;
		HandlerExecutionChain handlerChain = null;

		try {
			// get handlerChain that consisting of "handler object" and any "handler interceptors"
			handlerChain = getHandler(request);
			if (handlerChain == null) {
				response.sendError(HttpServletResponse.SC_NOT_FOUND);
				return;
			}
			// get handlerAdapter
			HandlerAdapter handlerAdapter = getHandlerAdapter(handlerChain);
			// insert "handler interceptors" preHandle method
			// call "handler object" by handlerAdapter
			modelAndView = handlerAdapter.handle(request, response, handlerChain.getHandler());
			// insert "handler interceptors" postHandle method
		} catch (Exception ex) {
			dispatchException = ex;
		}
		if (dispatchException != null) {
			modelAndView = processHandlerException(request, response, handlerChain.getHandler(), dispatchException);
		}
		if (modelAndView != null) {
			render(modelAndView, request, response);
		}
		// insert "handler interceptors" afterCompletion method
	}

	private HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		for (HandlerMapping handlerMapping : handlerMappings) {
			HandlerExecutionChain handler = handlerMapping.getHandler(request);
			if (handler != null) {
				return handler;
			}
		}
		return null;
	}

	private HandlerAdapter getHandlerAdapter(HandlerExecutionChain handlerChain) throws ServletException {
		for (HandlerAdapter handlerAdapter : handlerAdapters) {
			if (handlerAdapter.supports(handlerChain)) {
				return handlerAdapter;
			}
		}
		throw new ServletException("No adapter for handler");
	}

	private ModelAndView processHandlerException(HttpServletRequest request, HttpServletResponse response,
			Object handler, Exception dispatchException) throws Exception {
		ModelAndView exModelAndView = null;
		for (HandlerExceptionResolver handlerExceptionResolver : handlerExceptionResolvers) {
			exModelAndView = handlerExceptionResolver.resolveException(request, response, handler, dispatchException);
			if (exModelAndView != null) {
				break;
			}
		}
		if (exModelAndView != null) {
			return exModelAndView;
		}
		throw dispatchException;
	}

	private void render(ModelAndView modelAndView, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		Locale locale = null; // LocaleResolver
		View view = null;
		if (modelAndView.isReference()) {
			for (ViewResolver viewResolver : this.viewResolvers) {
				View v = viewResolver.resolveViewName(modelAndView.getViewName(), locale);
				if (v != null) {
					view = v;
					break;
				}
			}
			if (view == null) {
				throw new ServletException("Could not resolve view with the name");
			}
		} else {
			view = modelAndView.getView();
		}
		view.render(modelAndView.getModel(), request, response);
	}
}


转载于:https://my.oschina.net/koulikoro/blog/358791

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值