Spring MVC源码学习

详解Servlet

Servlet(接口)

这里写图片描述

  1. init方法在容器启动时被容器调用,其中ServletConfig是容器传进去的
  2. service用于具体处理一个请求
  3. destroy用于servlet的销毁

GenericServlet(抽象类)

  1. 实现ServletConfig接口,可以直接调用ServletConfig里面的方法
  2. 提供了无参的init方法
  3. 提供了log方法

HttpServlet(抽象类)

一般写Servlet时直接继承HttpServlet类即可
这里写图片描述
容器调用HttpSerlvet的service方法,把ServletRequest和ServletResponse转化为HttpServletRequest和HttpServletResponse

@Override
public void service(ServletRequest req, ServletResponse res)
    throws ServletException, IOException
{
    HttpServletRequest  request;
    HttpServletResponse response;

    if (!(req instanceof HttpServletRequest &&
            res instanceof HttpServletResponse)) {
        throw new ServletException("non-HTTP request or response");
    }

    request = (HttpServletRequest) req;
    response = (HttpServletResponse) res;

    service(request, response);
}

再根据HttpServletRequest的请求方法,调用相应的方法

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) {
                // 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);
    }
}

DispatcherServlet

这里写图片描述
其中HttpServlet及其父类是Java EE中有的

public interface Aware {

}
public interface ApplicationContextAware extends Aware {
    void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
public interface EnvironmentAware extends Aware {
    void setEnvironment(Environment environment);
}
public interface EnvironmentCapable {
    Environment getEnvironment();
}

实现这些接口主要是为了获得ApplicationContext等
DispatcherServlet执行过程
这里写图片描述

  1. 发起请求到DispatcherServlet(前端控制器)
  2. DispatcherServlet请求HandlerMapping(处理器映射器)找到Handler
  3. HandlerMapping将Handler返回给DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter去执行Handler
  5. HandlerAdapter执行Handler
  6. Handler执行完成,将ModerlAndView返回HandlerAdapter
  7. HandlerAdapter将ModelAndView返回给DispatcherServlet
  8. DispatcherServlet请求ViewResolver进行视图解析
  9. ViewResolver将View返回给DispatcherServlet
  10. DispatcherServlet进行视图渲染
  11. DispatcherServlet向用户返回结果

组件分析

HandlerMapping(处理器映射器)

HandlerAdapter(处理器适配器)

HandlerExceptionResolver

ViewResolver(视图解析器)

RequestToViewNameTranslator

LocalResolver

ThemeResolver

MultipartResolver

FlashMapManager

参考博客

[1]http://blog.csdn.net/tzs_1041218129/article/category/6627771

猜你喜欢

转载自blog.csdn.net/zzti_erlie/article/details/79357816