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的别的研究我们将在以后分享
浙公网安备 33010602011771号