好久都没有写博客了,不是因为自己懒了,而是总感觉自己知道的只是太少了,每次想写博客的时候都不知道怎么下手,不过最近看到一篇博客说的是springmvc,给了我比较大的兴趣,感觉一下子对整个springmvc框架一下子清晰了,很多感觉模糊的东西一下子就清晰明了的。

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

  不过呢,如果只是将springmvc感觉不过瘾,于是顺带着说说servlet吧,以及为什么说springmvc本质上就是一个servlet,假如你能说明白这一点那么你的springmvc就掌握得很清楚了,后面我们根据那个老哥的博客,我们一起简单实现一下springmvc就差不多了。

1.简单看看servlet

  1.1.servlet继承关系

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

  然后我们看一下最简单的servlet用法,概念和由来就不说了,说了我们也不懂,就知道能够通过浏览器访问servlet就够了。

  

  1.2.servlet最简单的用法

  新建一个myspringmvc项目,然后弄一下如下配置

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

  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框架。

带着新人简单看看servlet到springmvc的更多相关文章

  1. servlet到springmvc的演进

    1.简单看看servlet 1.1.servlet继承关系 先看看下面servlet的这个继承关系,有点印象即可(可以暂时忽略ServletConfig,这个接口就是让我们可以从web.xml文件中拿 ...

  2. 简单的整合 shiro + SpringMVC 例子

    简单的整合shiro和springmvc的例子 想要整合Shiro和springmvc,在网上找了很多例子,感觉都有一点复杂.所以就自己写了一个最简单整合项目,记录在这里以备后面查看. 这个例子包含如 ...

  3. 用IDEA开发简单的Servlet

    最近学习java,主要是servlet相关的内容.IDEA和servlet之前都没有碰过,所以做了一下小实验,走了一些弯路:这里把一个完整的步骤写出来,加深一下印象. IDEA创建项目步骤 1. 在i ...

  4. 文件上传(Servlet/Struts2/SpringMVC)

    文件下载(Servlet/Struts2)的链接:http://www.cnblogs.com/ghq120/p/8328093.html 文件上传 Servlet实现 要实现文件上传的功能,必须在f ...

  5. 深入剖析tomcat之一个简单的servlet容器

    上一篇,我们讲解了如果开发一个简单的Http服务器,这一篇,我们扩展一下,让我们的服务器具备servlet的解析功能. 简单介绍下Servlet接口 如果我们想要自定义一个Servlet,那么我们必须 ...

  6. 在cmd下编译一个简单的servlet时出现程序包javax.servlet不存在

    由于servlet和JSP不是Java平台JavaSE(标准版)的一部分,而是Java EE(企业版)的一部分,因此,必须告知编译器servlet的位置. 解决“软件包 javax.servlet不存 ...

  7. Servlet复习1: 一个简单的Servlet的使用

    Servlet学习 1. Servlet与JSP的关系 2. Servlet的声明周期 3. 一个简单的Servlet的使用方法 什么是Servlet? 什么又是JSP? 继承了javax.servl ...

  8. 开发部署一个简单的Servlet

    Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编译成.class文件,然后将此class文件放在servlet Engline路径下.Servlet ...

  9. 通过Jetty搭建一个简单的Servlet运行环境

    最近在做一些简单的Servlet开发的时候,感觉每次调试的时候都要发布到tomcat上很麻烦,把程序共享给同事也很麻烦,需要帮他设置本地的tomcat环境. 在网上找了找其他的Servlet运行环境, ...

随机推荐

  1. Java 读书笔记 (十六) Java 继承

    例: 开发动物类,其中动物分别为企鹅以及老鼠,要求如下: 企鹅: 属性(姓名,id), 方法(吃,睡,自我介绍) 老鼠: 属性(姓名,id), 方法(吃,睡,自我介绍) 企鹅类: public cla ...

  2. bzoj 1592 dp

    就是dp啊 f[i][j]表示到第i位,最后一位高度是j的最小花费 转移::f[i][j]=minn(f[i-1][k])+abs(a[i]-num[j]);(k<=j) #include< ...

  3. BZOJ 1412 狼和羊的故事

    首先,题目目的就是为了分割狼群和羊群,即建立超级源和超级汇求最小割从而转化成用网络流来处理. 如果没有空地,那么就是简单的二分图最大匹配,但是题中有空地的出现,所以需要在点与点之间建立双向边(不算后向 ...

  4. laravel 分页和共多少条 加参数的分页链接

    <div class="pagers "> <span class="fs pager">共 {{$trades->total() ...

  5. 显著性检测(saliency detection)评价指标之NSS的Matlab代码实现

    calcNSSscore.m function [ score ] = calcNSSscore( salMap, eyeMap ) %calcNSSscore Calculate NSS score ...

  6. SPPNET

    SPPNet Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 文章地址:https://ar ...

  7. WebP 在减少图片体积和流量上的效果如何?MIP技术实践分享

    作者 | Jackson 编辑 | 尾尾 不论是 PC 还是移动端,图片一直占据着页面流量的大头,在图片的大小和质量之间如何权衡,成为了长期困扰开发者们的问题.而 WebP 技术的出现,为解决该问题提 ...

  8. 【Python3爬虫】用Python中的队列来写爬虫

    一.写在前面 当你看着你的博客的阅读量慢慢增加的时候,内心不禁有了些小激动,但是不得不吐槽一下--博客园并不会显示你的博客的总阅读量是多少.而这一篇博客就将教你怎么利用队列这种结构来编写爬虫,最终获取 ...

  9. DSAPI中TCP、UDP、HTTP的选择

    在DSAPI中,网络通讯主要有以下几种:1 [TCP] TCP服务端 TCP客户端 2 [UDP] UDP服务端 UDP客户端 UDP指令版服务端 UDP指令版客户端 3 [HTTP] HTTP服务端 ...

  10. SoEasyPlatform 代码生成器

    介绍 一款轻量级开源的代码生成器,相对较动软代码生成器而言要轻量的多,支持多种数据库,所用到dll组件也都在github有源码,代码非常的简单有点基础的看源码可以把生成的项目改成自已的风格. 特色 该 ...