声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。web
一个Servlet的web访问名称能够不止一个,而且除了用web.xml配置以外,还可使用注解的方式配置,如今主流的配置方式是使用注解,这是Servlet3.0的特性,注解的配置要比web.xml轻量、简单,可是不排除一些老工程仍然使用着web.xml的配置方式。
下面介绍一下,在注解上使用 * 通配符:
1./admin/* 这种配置表示访问的名称必须是以admin/开头,可是后面的字符串能够任意,*做为一个匹配任意字符串的存在,如下使用实际代码示例演示一下这个用法:编程
运行结果:设计模式
控制台:浏览器
2.*.action 表示访问的名称后缀必须是action ,前缀能够是任意的字符串:
运行结果:学习
控制台:网站
Servlet家族 Servlet家族派生体系中的最高父类是Servlet接口,此接口定义了其实现类必需要重写的基本方法。而后就是GenericServlet类,这是一个抽象类,是一个通用的Servlet,它实现于Servlet接口,这个类至关于给Servlet家族的派生体系增长了一个分支,接着就是到了具有协议的HttpServlet类,这也是一个抽象类继承于GenericServlet类,不过此类没有定义抽象方法,这是带有http协议的Servlet,是专门针对http所开发出来的。
如今的网站访问几乎都是http协议或https协议,为何不在父类上就定义好协议?若是这么干的话,就违反了设计模式的六大原则,在最高父类上就写死了带有哪些协议,那么之后衍生出别的协议或者须要使用别的协议的话,岂不是没法扩展,只能对父类进行修改?这在程序设计上是绝对不容许的,计模式的六大原则之一就是开放-封闭原则:对修改封闭—对扩展开放。
并且单一职责原则也不容许一个类包含太多不一样的功能,由于这会产生没必要要的高耦合性,一个类只作一件主要的事情。因此开发Servlet家族的工程师就比较聪明,使用了一个最高接口定义了全部Servlet类都必需要具有的基本方法,而后让子类去作实现,不一样的协议只须要增长不一样的子类便可,无需对父类进行修改,而且子类之间互相不依赖,这是迪米特法则,将全部类的依赖都抽象到一个接口父类上,这就是面向接口编程。
面向接口的概念就像修理电脑同样,电脑某个配件坏了,直接更换就能够了,不须要更换其余的配件。例如:内存条坏了,我就换根内存条就行了,我不须要换硬盘也不须要换主板。更换一个配件彻底不会影响到其余的配件正常使用,这是由于它们之间都不互相依赖,就像子类互相不依赖同样,它们都只依赖一个接口,只要接口合适安装上去就可使用了(扩展子类)。子类互相不依赖耦合性就低就不会互相影响,就好像让你修电脑好像很简单,基本上换个配件就能够了(毕竟都有防呆接口)。可是让你去修收音机就不是那么简单了,收音机的配件基本上都集成在一块线路板上,全是二极管、电阻、单片机什么的,除了专门修理的人员通常人是不会修的,这就是由于耦合性过高。若是子类之间也像线路板同样耦合性这么高,想一想也知道一旦出问题了修改起来有多麻烦。
因此为何不像电脑中的配件同样,将子类内部的复杂性封装起来,让它们都只依赖一个父类接口,出问题了只须要修改或更换某个子类就能够了,并且当要增长功能的时候,就直接扩展子类便可,不须要再进行其余的变更,就像我电脑要音质牛逼一点就加个独立声卡,想要网速快一些我能够加个网卡,这就是为何要去面向接口编程,为何开发Servlet家族的工程师可以将Servlet的灵活、扩展性作的这么好,这都是由于应用了面向接口编程。spa
以上用了一大堆废话说明了为何要面向接口编程,和面向接口编程的好处,接下来介绍一下Servlet接口,GenericServlet、HttpServlet类中的主要方法(不是所有):设计
Servlet接口源码:xml
GenericServlet中有一个init(),这个方法是用来给用户重写的,经过重写这个方法咱们能够在初始化时进行一些操做。其实这个方法会被init(ServletConfig)方法调用,因此才能在初始化时进行一些操做,看一下源码就知道了:对象
service(HttpServletRequest, HttpServletResponse)
这是HttpServlet的服务方法,是具体到了http协议的服务方法,这个方法会被service(ServletRequest, ServletResponse)调用,这个方法的HttpServletRequest和HttpServletResponse参数对象就是由这个不带协议的service方法传递过来的。
do...系列方法,这个系列的方法会被带有http协议的service方法调用,它们的参数对象也是由这个service方法传递进来的: doGet(HttpServletRequest, HttpServletResponse)
当浏览器是经过地址栏的URL或者超连接等链接的方式进行访问的,就会默认调用doGet方法,在表单中的提交访问则是能够选择性的调用。
doPost(HttpServletRequest, HttpServletResponse)
当浏览器是经过表单提交来进行访问的,能够选择调用doPost方法。
如下的五个方法的调用,是须要在http请求头文本中定义的:
doHead(HttpServletRequest, HttpServletResponse)
doPut(HttpServletRequest, HttpServletResponse)
doDelete(HttpServletRequest, HttpServletResponse)
doOptions(HttpServletRequest, HttpServletResponse)
doTrace(HttpServletRequest, HttpServletResponse)
从这几个方法的特性能够知道HttpServlet会调用哪一个do系列的方法,是由浏览器中定义的请求方式决定的,咱们能够们查看service(HttpServletRequest, HttpServletResponse)方法的源码,看看do系列方法是怎么被调用的:
从观察Servlet这几个类的派生体系,能够知道若是想要接收任何类型的浏览器请求,只须要重写service方法便可。
下面使用一个流程图来看一下Servlet的访问流程:
Servlet家族思惟导图: