带着新人简单看看servlet到springmvc

   很久都没有写博客了,不是由于本身懒了,而是总感受本身知道的只是太少了,每次想写博客的时候都不知道怎么下手,不过最近看到一篇博客说的是springmvc,给了我比较大的兴趣,感受一会儿对整个springmvc框架一会儿清晰了,不少感受模糊的东西一会儿就清晰明了的。html

  我把那个老哥原博客网址贴出来:https://www.cnblogs.com/xdp-gacl/p/4101727.html前端

  不过呢,若是只是将springmvc感受不过瘾,因而顺带着说说servlet吧,以及为何说springmvc本质上就是一个servlet,假如你能说明白这一点那么你的springmvc就掌握得很清楚了,后面咱们根据那个老哥的博客,咱们一块儿简单实现一下springmvc就差很少了。java

 

1.简单看看servletweb

  1.1.servlet继承关系spring

  先看看下面servlet的这个继承关系,有点印象便可(能够暂时忽略ServletConfig,这个接口就是让咱们能够从web.xml文件中拿到标签中的参数,好比<servlet-name>,<init-param>等标签中的参数)浏览器

  而后咱们看一下最简单的servlet用法,概念和由来就不说了,说了咱们也不懂,就知道可以经过浏览器访问servlet就够了。tomcat

  

  1.2.servlet最简单的用法mvc

  新建一个myspringmvc项目,而后弄一下以下配置框架

  能够了,就这么多,而后咱们运行eclipse中集成的tomcat,在浏览器输入url就能访问了,很容易。eclipse

 

  1.3.servlet生命周期

  这个时候有个小问题,为何咱们发送一个get请求(在浏览器输入网址),就会直接跳转到get方法呢?这么智能的么,这么牛?

  因此咱们要站得高一点的角度看servlet的大概结构,以下图,最重要的就是这三个方法,还有另外两个方法暂时忽略:getServletConfig()是能够拿到web.xml中配置的<init-param>等标签的参数,还有getServletInfo()其实就是返回做者信息,版本信息等等,貌似还没用过。。。。。

  最重要的就是那三个方法,通常别人都把这三个方法叫作servlet的生命周期。(注意service方法的两个参数,没有实现HTTP协议)

  到了这里,假如就给你这样一个接口,让你本身写实现类,你感受怎么样?反正我是很绝望的,不知道从哪里下手,这么多功能要实现,本身水平又比较菜,怎么编写一个彻底的servlet实现类呢?

  因而啊,一个抽象类就出来了GenericServlet,这个抽象类实现了Servlet接口,把几乎全部的方法都给你实现出来了,好比获取servlet上下文,获取initParameter等等经常使用的功能,就留下了那三个生命周期方法init(), service(),destroy()没有实现,这就须要咱们本身去实现类,因此咱们能够继承这个抽象类,实现这三个方法就ok了。

  可是啊,我仍是有点不会,由于我是用过浏览器发请求过来啊,你这个service方法要干吗呢?主要逻辑是什么啊?并且每次都要实现这三个方法,好麻烦的啊,由于还要判断是get仍是post方式提交,再调用get或者post方法,并且都是重复的东西,有点不会。

  终于,出来了一个比较全面的抽象类HttpServlet,这个类继承了GenericServlet,还实现了http协议,其中作的最主要的是就是将那service()生命周期方法给实现了,而且在这里会根据浏览器提交过来数据的方式,给分发到各自的方法去实现,好比分发到doGet(),doPost()等,简单看一下源码

  后面还有post,put,delete方法的判断,跟这里几乎同样,并且在本类中已经定义了doGet(),doPost()等方法,几乎没有怎么实现,因此啊,咱们只须要继承HttpServlet类,根据咱们的请求方式实现doGet(),doPost()等方法就能够了,分工明确,用起来也很舒服。

  并且这里新手可能有点头晕,为何会调用咱们实现的doGet,doPost方法,而不是父类中的那些doXXX()方法呢?其实啊,这里又是一个基础知识,好比子类B继承父类A,重写父类方法aa(),那么实例化子类以后(这里就是多态的用法),调用aa()方法确定是先在子类中找有没有aa()方法,有的话就调用子类的,没有的话就调用父类的!应该在java基础的时候这种问题贼多,坑了不少新人。

  到这里Servlet的大概轮廓就清楚了,咱们再来看看最上面的那个截图,是否是以为懂了一点点了

 

2.简单看看springmvc初始化过程

  还记得最开始学习springmvc的时候是本身看视频学习的,刚开始有不少的问题不懂,要本身慢慢理解,而后大量的查资料,记得比较清楚的一句话是说:springmvc中那个前端控制器其实就是一个servlet,springmvc的本质就是一个servlet!

  反正我是牢记这个概念,哦哦,原来springmvc本质就是一个servlet啊,而后我就放着无论了,也不是怎么懂,反正我springmvc用的贼熟练。不就是那几个处理器吗?前端控制器,处理器映射器,处理器控制器,controller,视图解析器,我常常简单的这么一配置,就能够用了,而后和spring一整合,ok了!

  

  2.1.springmvc和servlet的关系

  首先问一个问题,为何前端控制器是一个servlet啊?难道也是继承了HttpServlet吗?其中大概的流程是怎么样的呢?总感受很模糊,似懂非懂。

  那么咱们就先来看一个前端控制器(DispatcherServlet)的继承结构(混个眼熟):

  上图很明显,有三个新增的类,分别是HttpServletBean,FrameworkServlet,DispatcherServlet;这三个类我第一眼看过去反正我是不知道干吗用的,就大概知道最后那个前端控制器,因此咱们就慢慢的来看看前面两个类是干吗用的啊?把前面两个弄清楚了,就差很少了。

 

  2.2.随便看看HttpServletBean,FrameworkServlet

  对于HttpServletBean,咱们先回忆前面的servlet的内容,在HttpServlet总只是实现了service()方法并在其中作了方法分发,可是servlet生命周期但是有三个方法啊,还有init()和destroy(),因而咱们在这里就会用到init方法了;

  这里会重写GenericServlet的init方法(其实就是重写HttpServlet的父类GenericServlet的init方法)

  

  因为这个initServletBean()方法是一个空方法,确定是留给子类去实现的,而后咱们去FrameworkServlet中还真的找到了这个initServletBean()方法。

  这里就是一个比较重要的地方了,稍微截一下initServletBean()方法中的代码:

 

 

  注意:你们知不知道springmvc+spring整合的时候,会有父子容器的概念!父容器就是ioc容器,启动toncat就会被web.xml中的那个监听器监听到,立马就会建立ioc容器,里面放的是service,dao,以及其余的各类bean;这里的子容器是springmvc的容器,里里面放着web层的全部组件,处理器映射器,处理器适配器,视图解析器,controller等;

  还有我没有记错的话,因为父容器先建立,子容器后建立。因此父容器的引用会保存在子容器一份,因此能够经过子容器获取父容器的实例,而后再获取其中的bean;

  在initWebApplicationContext()方法中,其实就是对spring 子容器的建立以及刷新,这里就随便提一下,不深刻了!咱们只看其中的刷新方法:

  你点开刷新方法你会发现这又是一个空方法,等着子类去实现的!不知道你们到这里有没有看到一个颇有趣的逻辑,就是不少时候,一个类中有些方法本身是不会去实现的,而是要留给子类去实现,哈哈哈!子类假如会说话,确定会说:我真是日了狗哦!

 

  2.3.继续随便看看DispatcherServlet

  终于到这个类了,前面说了这么多,都快睡着了。。。

  由上面能够知道,DispatcherServlet中确定要实现那个刷新方法,因而咱们就直接到这个刷新方法看看究竟是什么鬼!

   能够看到初始化了好多组件,注意一点:这里的context是子容器。

 

 3.springmvc处理请求

  前面springmvc初始化说了这么多,其实就是将子容器建立,而后初始化了那9个组件放进去就ok了,那么接下来就说说怎么处理一个请求吧!

  还记得前面说处理请求,也就是咱们在浏览器输入网址,一点回车,就会执行相应servlet的service()方法吧!

  在HttpServlet中的service()方法中接收请求,根据请求方式(Get,Post等)分发到相应的doGet(),doPost()等方法,而后咱们在FrameworkServlet中会发现,这个类将这些service和doGet(),doPost()等方法都重写了,是个狠类啊!

  咱们就来简单看看FrameworkServlet中的方法执行流程吧,不细看源码!

 

  打开doGet方法,发现也是到processRequest()方法中

 

 

  咱们继续往processRequest()方法看:

 

   咱们接下来就是在DispatcherServlet中看看有没有doService()方法了;

 

   看看最后的doDispatcher方法:

  

  到这里,基本就差很少了,把整个结构都给梳理了一遍!确定还有不少小伙伴对后半段有点迷糊,放心,我下一篇博客会一块儿来简单实现一下咱们本身的springmvc框架。

相关文章
相关标签/搜索