? ? ? ? javax.servlet.Servlet接口定義了一些方法携取。關(guān)鍵的是其中四個:
? ? ? ? 本來接口Servlet的直接抽象實現(xiàn)類是javax.servlet.GenericServlet变屁。但是它又實現(xiàn)了ServletConfig接口,所以先看該接口意狠。
? ? ? ? 下面看GenericServlet院塞,GenericServlet并無任何非凡之處遮晚,但是還是做了一些小的工作:
? ? ? ? 前面指出Servlet容器在實例化Servlet接口實現(xiàn)類后县遣,會調(diào)用init(ServletConfig)方法,并自動注入ServletConfig實現(xiàn)類汹族。這里多說一句萧求,ServletConfig的實現(xiàn)類的內(nèi)容是怎樣的,getServletName方法顶瞒、getInitParameter(String)等會返回什么信息夸政,這是根據(jù)代碼編寫者的設(shè)置決定。如何給出這些信息那是另外一個問題了榴徐。
? ? ? ? 此時只需在整體上了解到守问,當(dāng)Servlet容器決定要實例化一個Servlet實現(xiàn)類時,會根據(jù)代碼編寫者給出的信息坑资,如在web.xml中的<servlet-name>耗帕,自動的生成ServleConfig實現(xiàn)類。然后實例化Servlet實現(xiàn)類袱贮,之后調(diào)用init(ServletConfig)方法仿便,注入自動生成的ServleConfig實現(xiàn)類。
? ? ? ? 話說回來,從GenericServlet開始探越,實例域就持有一個ServletConfig類型成員狡赐。而在其Init(ServletConfig)方法中,引用容器傳入的ServletConfig钦幔。然后調(diào)用GenericServlet自己定義的Init()方法枕屉。從此以后,任何GenericServlet的子類鲤氢,在Servlet層面的初始化動作轉(zhuǎn)移到init()方法搀擂。
? ? ? ? GenericServlet的直接子類是HttpServlet。從類名可以看出這是處理以HTTP協(xié)議連接客戶端和服務(wù)器端的服務(wù)卷玉。因為HTTP設(shè)置了好幾種請求方式哨颂,因此在HttpServlet的service(HttpServletRequest,HttpServletResponse)中是根據(jù)請求方式來決定交由哪一個方法處理請求,例如doGet相种、DoPost威恼。所以,HttpServlet的子類只需要重寫好對應(yīng)的響應(yīng)方法寝并,doPost等箫措,就可以了,無需自己去實現(xiàn)將請求方式映射到處理方法衬潦。如果足夠細(xì)心斤蔓,可以看到在Servlet接口定義的Service方法的方法參數(shù)是ServletRequest和ServletResponse。在HttpServlet中還進(jìn)行了如下處理: