spring中dispatcherservlet的运行机制
dispatcherservlet是spring的web框架(以下简称springweb)中的核心servlet."spring的web框架——象其它web框架一样——是一个请求驱动的web框架,其设计围绕一个能将请求分发到控制器的servlet,它也提供其它功能帮助web应用开发。"----《spring framework 开发参考手册(中文版)》而在springweb框架中这个servlet就是org.springframework.web.servlet.dispatcherservlet。这个servlet的继承关系如下图所示:springweb首先将传统的httpservlet抽象类包装成了bean;frameworkservlet抽象出了web框架中的servlets的一些基本行为,比如对application context的访问;dispatcherservlet的主要工作就是将一个request分发到一个合适的处理器上,并将处理返回的modelandview绘制出来返回给客户端。
dispatcherservlet作为一个servlet那他一定有两个主要的方法:init()和doservice()。
一 init()初始化。dispatcherservlet继承体系中init()方法的实现位于httpservletbean中,httpservletbean首先调用initbeanwrapper(),初始化beanwrapper,然后调用抽象方法initservletbean(),这个方法的实现位于他的子类frameworkservlet中;framewordservlet中的initservletbean()方法将调用initwebapplicationcontext(),初始化webapplicationcontext,然后同样调用他的抽象方法initframeworkservlet(),而这个抽象方法的实现位于最终的dispatcherservlet中;dispatcherservlet中的initframeworkservet()将依次初始化multipar(用作文件上传)解析器、本地化信息解析器、主题解析器处理器映射等等内容。所以dispatcherservlet的初始化顺序为init();initbeanwrapper();
initservletbeaninitwebapplicationcontext()
initframework();initmultipartresolver();initlocaleresolver();initthemeresolver();inithandlermappings();inithandleradapters();inithandlerexceptionresolvers();initviewresolvers();
二 doservice()处理请求。dispatcherservlet中无论是通过post方式还是get方式提交的request,最终都会交由doservice()处理。doservice()中的处理逻辑大致分以下六个步骤:1.if(request是multipart,即文件上传) 则将request解析并包装成multiparthttpservletrequest2.mappedhandler = gethandler(request)根据request得到相应的处理器3.调用注册的所有拦截器的prehandle方法4.调用处理器 handleradapter ha = new gethandleradapter(mappedhandler.gethandler()); modelandview mv = ha.handle(req, res, mappedhandler.gethandler())//这里使用了adapter模式5.调用注册的所有拦截器的posthandle方法6.绘制mv
也许spring不像struts、hibernate那样是使用最为广泛的,但他是全面的、轻量级的、足够灵活的、容易替换、容易扩展的。springweb是springframework中的一个部分,而dispatcherservlet又是springweb中的一小部分,要弄懂spring以及他背后的设计思想,对我等菜鸟而言,还是有很长一段路要走的。但愿在新的一条路出现之前,我们已经走遍了这条路。路漫漫其修远兮,吾将上下而求索。继续研究ing...to be continue...
大盘预测
国富论
posted on 2007-08-29 12:25
华梦行 阅读(688)
评论(0) 编辑 收藏 所属分类:
Spring