聲明:本欄目所使用的素材都是凱哥學堂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家族思惟導圖: