我們所編寫的servlet應用程式,盡管不能說全部,但其中大多數要用到http。這意味着,可以利用http提供的特性。javax.servlet.http包是servlet api中的第二個包,其包含了編寫servlet應用程式的類和接口。javax.servlet.http中的許多類型覆寫了javax.servlet中的類型。
圖1-5展示了javax.servlet.http中的主要類型。
httpservlet類覆寫javax.servlet.genericservlet類。在使用httpservlet時,還要使用httpservletrequest和httpservletresponse對象,它們分别表示servlet請求和servlet響應。httpservletrequest接口繼承javax.servlet.servletrequest,httpservletresponse繼承javax.servlet.servletresponse。
httpservlet覆寫genericservlet中的service方法,并用以下簽名添加了另一個service方法:
這個新的service方法與javax.servlet.servlet中的差別在于,前者接受的是httpservlet-request和httpservletresponse,而不是servletrequest和servletresponse。
與往常一樣,servlet容器調用javax.servlet.servlet中原始的service方法,httpservlet中的service方法要如下這麼寫:
原始的service方法将請求和響應對象進行向下轉換,分别從servlet容器轉換成httpservletrequest和httpservletresponse,并調用新的service方法。向下轉換總是會成功,因為在調用一個servlet的service方法時,servlet容器總會預計使用http,是以傳遞一個httpservletrequest和一個httpservletresponse。即使正在實作javax.servlet.servlet接口或者繼承javax.servlet.genericservlet,也可以将傳給service方法的servlet請求和servlet響應,分别向下轉換成httpservletrequest和httpservletresponse。
之後,httpservlet中新的service方法會檢視通常用來發送請求(通過調用request.getmethod)的http方法,并調用以下某個方法(doget、dopost、dohead、doput、dotrace、dooptions和dodelete)。這7個方法各自表示一個http方法。其中,doget和dopost是最常用的。是以,通常不需要再覆寫service方法,而是覆寫doget或者dopost,或者将doget和dopost都覆寫掉。
總之,httpservlet中有兩項特性是genericservlet所沒有的:
不覆寫service方法,而是覆寫doget、dopost,或者兩者都覆寫掉。在極少數情況下,還要覆寫以下某個方法:dohead、doput、dotrace、dooptions或dodelete。
将用httpservletrequest和httpservletresponse代替servletrequest和servlet-response。
httpservletrequest表示http環境中的servlet請求。它繼承javax.servlet.servletrequest接口,并增加了幾個方法,例如:
傳回表示請求context的請求uri部分。
傳回一個cookie對象數組。
傳回指定http标頭的值。
傳回發出這條請求的http方法的名稱。
傳回請求url中的查詢字元串。
傳回與這個請求有關的session對象。如果沒有找到,則建立新的session對象。
傳回與這個請求有關的session對象。如果沒有找到,并且create參數為true,那麼将建立新的session對象。
在接下來的章節中,将學習如何使用這些方法。
httpservletresponse表示http環境下的servlet響應。下面是其中定義的部分方法:
給這個響應對象添加cookie。
給這個響應對象添加标頭。
發送響應代号,将浏覽器重定向到指定的位置。
在接下來的章節中将進一步學習這些方法。