总结

       本文首先总结一下Spring MVC的运行原理,然后通过实际跟踪一个请求来回顾整个处理过程;

Spring MVC原理总结

       Spring MVC本质上是一个Servlet,Servlet的运行需要一个Servlet容器,如Tomcat;

       Tomcat可以分为两部分:连接器和容器;连接器专门用于处理网络连接相关的事情,如Socket连接,request封装,连接线程池维护等工作;容器用来存放Web程序;

       Tomcat中一共有4层容器:Engine,Host,Context和Wrapper;一个Wrapper对应一个Servlet,一个Context对应一个应用,一个Host对应一个站点,Engine是引擎,一个容器只有一个;

        Context和Host的区别是Host代表站点,如不同的域名,而Context表示一个应用,比如,默认情况下webapps/ROOT中存放的为主应用,对应一个站点的根路径,如www.excelib.com;webapps下别的目录则存放别的子应用,对应站点的子路径,如webapps/test目录存放着www.excelib.com/test应用,而所有webapps下的应用都属于同一个站点,它们每一个都对应一个Context;如果想添加一个新站点,如blog.excelib.com,则需要使用Host;

       一套容器和多个连接器组成一个Service,一个Tomcat中可以有多个Service;



       Servlet接口有5个方法,其中init方法和destroy用于初始化和销毁Servlet,整个生命周期中只会被调用一次;service方法实际处理请求;getServletConfig方法返回的ServletConfig,可以获取到配置Servlet时使用init-param配置的参数,还可以获取ServletContext;getServletInfo方法可以获取到一些Servlet相关的信息,如作者,版权等,这个方法需要自己实现,默认返回空字符串;

       Java提供了两个Servlet的实现类:GenericServlet和HttpServlet;

       GenericServlet主要做了3件事:1.实现了ServletConfig接口,让我们可以直接调用ServletConfig中的方法;2.提供了无参的init方法;3.提供了log方法;HttpServlet主要做了2件事情:1.将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse;2.根据Http请求类型(如Get,Post等)将请求路由到了7个不同的处理方法,这样编写代码时只需要将不同类型的处理代码编写到不同的方法就可以了,如常见的doGet,doPost方法就是在这里定义的;

       Spring MVC的本质是个Servlet,这个Servlet继承自HttpServlet;

       Spring MVC中提供了三个层次的Servlet:HttpServletBean,FrameworkServ和DispatcherServlet;

       HttpServletBean直接继承自Java的HttpServlet;它用于将Servlet中配置的参数设置到相应的属性中;FramworkServlet初始化了Spring MVC中所使用的WebApplicationContext;DispatcherServlet中初始化具体处理请求的9个组件;


       Spring MVC中请求的处理主要在DispatcherServlet中,不过它的上一层FrameworkServlet也做了一些工作,首先它将所有类型的请求都转发到processRequest方法,然后在processRequest方法中做3件事:1.调用了doService模板方法具体处理请求,doService方法在DispatcherServlet中实现;2.将当前请求的LocaleContext和ServletRequestAttributes在处理请求前设置到了LocaleContextHolder和RequestContextHolder,并在请求处理完成后恢复;3.请求处理完成后发布一个ServletRequestHandledEvent类型的消息;

     DispatcherServlet在doServic方法中将webApplicationContext,localeResolver,themeResolver,themeSource,FlashMap和FlashMapManager设置到request的属性中以方便使用,然后将请求交给doDispatch方法进行具体处理;

       DispatcherServlet的doDispatcher方法按执行过程大致可以分为4步:1.根据request找到Handler;2.根据找到的Handler找到对应的HandlerAdapter;3.用HandlerAdapter调用Handler处理请求;4.调用processDispatchResult方法处理Handler处理之后的结果(主要处理异常和找到View并渲染输出给用户);

实际跟踪一个请求

       本节将通过实际跟踪一个请求来完整地梳理Spring MVC的请求处理过程;

       这里给大家设计一个给文章做评论的例子,先去掉评论中的敏感词,然后保存到数据库中,接着redirect到一个显示结果的处理器,在其中通过文章id获取文章标题和文章内容,最后显示到页面;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值