SpringMVC研究

要弄懂SpringMVC 主要得研究DispatcherServlet。

从源码可以看出,DispatcherServlet的继承关系如图:

我们将一点点的分析DispatcherServlet的实现过程。

GenericServlet

GenericServlet 实现的两个接口 Servlet ServletConfig.

Servlet就是提供给Servlet容器(一般是Tomcat)的接口

其中init destory 分别为容器构建和销毁Servlet实例时调用的方法。

void service(ServletRequest req, ServletResponse res)为接收请求以后做的操作。

其中ServletRequest ServletResponse 里包含了读写二进制的Stream,读写字符串的reader writer,hostname ip port protocol encode等等,此处不展开。

其中ServletContext是一个接口,用来定义一系列的方法来让Servlet和Servlet容器进行交互。 比如:获取MIME 文件, dispatch requests, 写log。一个JVM中的一个web application 只有一个 ServletContext。 

 

HTTPServlet

HttpServlet只负责处理HTTP请求。

Http在service里创建了很多虚函数用来实现HTTP的方法。

protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {

    String method = req.getMethod();
    if (method.equals(METHOD_GET)) {
        // ...
        doGet(req, resp);
    } else if (method.equals(METHOD_HEAD)) {
        // ...
        doHead(req, resp);
    } else if (method.equals(METHOD_POST)) {
        doPost(req, resp);
        // ...
    }

 我们可以直接通过继承HttpServlet来编写简单的HttpServer,只用实现其中的doGet, doPost方法,然后在通过其HttpServletRequest里的函数来获取path parameter等信息,然后写上正则表达式之类的判定做出相应的操作。

编写简单的服务器这样写会比用SpringMVC简单,但当服务器复杂起来,这就变得难以维护了。

所以我们接着研究SpringMVC。

 

HttpServletBean

HttpServletBean是刚才的继承链中第一个有着Spring装备能力的类。因为他实现了Servlet接口里的init()方法,虽然同时在里面他也添加了两个空函数 initBeanWrapper(BeanWrapper bw) initServletBean() 他可以通过web.xml或者是WebApplicationInitializer来注入init-param。也就是说可以在xml中:

<bean id="xxx" class="...">
    <property name="..." value="..."/>
</bean>

 

 

FrameworkServlet

HttpServletBean具有了可以被注入init-params的资格,但是他没有应用上下文。也就是说,没有配置到Spring容器来生产HttpServletBean对象。所以在这里FrameworkServlet实现了ApplicationContextAware接口的setApplicationContext(ApplicationContext applicationContext)添加了他的应用上下文,

默认的是XmlWebApplicationContext,也就是会在xml里去配置这个Bean。或者也可以自己编写application context。

到FrameworkServlet这里,拥有Spring功能的Servlet就实现了。

 

DispatcherServlet

DispatcherServlet主要是为了处理dispatch而存在的。

DispatcherServlet将实现所有实现了@Controller的对象,并将句柄分发给他,然后他根据句柄处理相应的方法,返回了一个Model和一个View路径。然后DispatcherServlet再根据这个View路径去解析view,加载model并渲染。最后返回给Response.

具体解释就是,由于面向对象的设计原则,这里匹配的不是字符串而是一个字符串生成的对象——句柄(handler)

Handler负责将句柄和每个继承Controller接口(或者有@Controller)的类匹配(class级别)并将句柄传递给此类的对象。HandlerAdapter就是方法级别的匹配,将句柄匹配到相应的方法,并返回一个ModelAndView对象。

 

解析和渲染是Resolver对象做的事情我们就暂时不分析了,至此DispatcherServlet分析完毕。在Spring框架中,Spring将从ApplicationContext中找到这个Servlet的Bean,并装配他,从而实现了Servlet接口所需要的所有方法。

对Spring的别的研究我们将在以后分享

 

posted @ 2019-04-01 07:00  yuysyu  阅读(89)  评论(0)    收藏  举报