好久都没有写博客了,不是因为自己懒了,而是总感觉自己知道的只是太少了,每次想写博客的时候都不知道怎么下手,不过最近看到一篇博客说的是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用法,概念和由来就不说了,说了我们也不懂,就知道能够通过浏览器访问servlet就够了。

1.2.servlet最简单的用法

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

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

1.3.servlet生命周期

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

所以我们要站得高一点的角度看servlet的大概结构,如下图,最重要的就是这三个方法,还有另外两个方法暂时忽略:getServletConfig()是可以拿到web.xml中配置的等标签的参数,还有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框架。

java servlet spring_带着新人简单看看servlet到springmvc相关推荐

  1. java nio servlet_java nio http服务器(3)简单的Servlet容器

    Servlet容器中放着我们所有要访问的Servlet,根据我们具体的请求来访问不同的Servlet.下面是一个简单的Servlet容器的实现.request和response的封装以及连接器的实现代 ...

  2. java servlet例子_Servlet学习教程(三)---- 一个简单的Servlet例子

    我们用个最简单的Servlet例子来解说一下Servlet简单配置以及Servlet类实现类的写法. 第一,我们新建一个Dynamic Web Project,起名Servlet 点击NEXT,设置D ...

  3. Java WEB之Servlet学习之路(一)一个最简单的Servlet应用

    好久没有更新博客了,有点冷清,主要是最近忙着看Java WEb前段时间都是基础,一些http理论和WEB容器理论,没有什么实践性代码,所以没写代码,现在终于正式开始Servlet编程了,下面就得好好的 ...

  4. java从入门到精通二十三(Servlet)

    java从入门到精通二十三(Servlet) Servlet 说明 Servlet初步入门尝试 Servlet生命周期 Servlet方法说明和体系结构 方法说明 体系结构说明 一些优化封装 urlP ...

  5. 手把手教你用JSP+Servlet+Tomcat实现一个最简单的Web应用

    JSP+Servlet+Tomcat实现一个简单的Web应用 需要使用到的技术 ①JSP ② Servlet ③Tomcat Web开发中的常见概念 Demo *本文针对编程务实实验内容,简单演示一下 ...

  6. 从 Servlet 入手带你看架构和框架设计的套路

    以下代码相信大家都很熟悉,大学时学 Java Web 都写过这样的代码. 从第一次接触 Servlet 到之后的很长一段时间内,我都没理解 Servlet 是个什么玩意? 为什么要有 Servlet ...

  7. 10 Java程序员面试宝典视频课程之Servlet

    一.http 全称是什么? 有什么作用? 答: 1.超文本传输协议(HTTP:Hypertext Transport Protocol)是万维网应用层的协议,它通过两个程序实现:一个是客户端程序(各种 ...

  8. java与servlet JSP_java面试精品全集[jsp与servlet部分]

    一.Jsp方面 1.forward 和redirect的区别 答:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本 ...

  9. Java 面向对象编程、jQuery、JavaScript、servlet、javabean----理论知识

    一.继承 1.继承(优点:代码复用方便修改)     1.1 继承的关键字:extends     1.2 实现继承步骤(1.编写父类 2.编写子类继承父类)     1.3 调用父类方法的关键字:s ...

最新文章

  1. 获取一篇新闻的全部信息
  2. 网站建设都需要哪些步骤?
  3. 现在当兵有什么待遇复原以后_从今年征兵情况来看,以后当兵可能会越来越难,有6点原因...
  4. QT学习:基本对话框
  5. OpenCV 错误级别分析ELA的实例(附完整代码)
  6. java语言执行模式,使用java.exe执行静默模式
  7. angularjs中使用ng-repeat渲染最后一个li的时候设置不同样式
  8. shell笔记[转]
  9. 基于鱼群算法的函数寻优算法
  10. 4月编程排行榜出啦~速看新变化~
  11. 公众号推送长图最佳尺寸_微信公众平台图片尺寸是多少
  12. jmeter 取样器
  13. Linux:Ubuntu系统解决不能上网问题
  14. 怎么组建云计算中心?
  15. python网球比赛模拟主持稿_跪求:关于体育类节目的模拟主持稿
  16. mac电脑怎么彻底关闭系统更新提示?
  17. mas机 mysql_移动MAS机开发相关
  18. BLOCK层代码分析(1)数据的组织BIO
  19. ET篇:斗地主学习笔记(一)运行Demo
  20. 机器学习--手写英文字母1--分类流程

热门文章

  1. 算法学习三:使用霍纳规则计算多项式
  2. 头条三面: String.valueOf、toString()、(String)强转,有啥区别?
  3. jenkins没有参数化构建过程选项
  4. cookie、session和token
  5. 非集成搭建wampp环境
  6. 当你输入一个网址的时候,实际会发生什么?(转)
  7. 分类与回归机器学习模型的评价指标
  8. [Ubuntu] zsh
  9. 计算机教学软件cai,计算机毕业论文cai教学软件中数据的分割
  10. 计算机专业挂职锻炼,计算机学院挂职体验谈