1. 程式人生 > >Java Web學習筆記----詳解ServletAPI

Java Web學習筆記----詳解ServletAPI

開始 共享 擴展 學習java 將他 默認 config nta generic

昨天聊了一大堆亂七八糟的東西。今天給大家分享一下當初我學習JavaWeb的筆記吧。
Servlet技術是JavaWeb中的核心技術,emmmmmmmm。。。。
太枯燥了,還是先從API開始說吧,
首先ServletAPI中有4個Java包:
1、javax.servlet:其中包含定義Servlet和Servlet容器之間契約的類和接口
2、javax.servlet.http:其中包含定義HTTPServlet和Servlet容器之間契約的類和接口
3、javax.servlet.annotation: 其中包含Servlet、Filter、Listener的標註,它還為被標註元件定義元數據
4、javax.servlet.descriptor :其中包含提供程序化登錄web應用程序的配置信息的類型。
  二. Servlet技術概述


  Servlet技術的核心是Servlet接口,他是所有Servlet類必須直接或間接實現的一個接口,在編寫實現Servlet的Servlet類的時候是直接實現它,在擴展實現這個接口的類的時候就是間接實現它。
  Servlet接口中定義了Servlet與Servlet容器之間的契約,這個契約歸結起來就是:Servlet容器將Servlet類加載到內存,並在Servlet類的實例上調用具體的方法。在一個應用程序中每種Servlet類種只能有一個實例。
  用戶請求致使Servlet容器調用了Servlet類種的service方法,並且傳入一個ServletRequest實例和一個ServletResponse的實例,ServletRequest中封裝了當前的HTTP請求,
因此Servlet開發人員不必解析和操作原始的HTTP請求數據.ServletResponse表示=當前用戶的HTTP響,使得將響應發回客戶端變得十分容易.
  對於每一個應用程序,Servlet容器還會創建一個Servlet Context的實例,這個對象中封裝了上下文的環境詳情,每個上下文只有一個ServletContext.每個Servlet示例也都有一個封裝Servlet配置的ServletConfig
  三, Servlet接口

Servlet接口中定義了5個方法:

1、void init(ServletConfig config) throws ServletException
2、void service(ServletRequest request, ServletResponse response) throws ServletException,java.ioi.IOException
3、void destroy()
4、java.lang.String getServletInfo()
5、ServletConfig getServletConfig()
  這裏需要註意的是,在編寫Java方法簽名的時候,對於與包含該方法的類型不處於同一個包中的類型的時候要使用類的全名.所以在service方法中javax.servlet.ServletException的簽名中可以不用寫包的名稱,但是java.io.IOException則要編寫完整的類名稱.
  在這五個方法中,init、service和destroy是生命周期方法.Servlet容器根據以下規則調用這三個方法:
init: 當Servlet第一次被請求的時候Servlet容器會調用這個方法,在後續的請求中不會被再次調用
service: 每當請求Servlet的時候多會調用一次
destroy: 當銷毀Servlet的時候,該方法被調用.

一、ServletRequset接口
  對於每一個HTTP請求,Servlet容器都會創建一個ServletRequest實例,並將他傳遞給service方法。ServletRequset封裝了關於這個請求的信息。
  ServletRequset接口中定義了一些方法:
  

   getParameter是在ServletRequest中最常用的方法。該方法通常是用來返回HTML表單域的值,getParameter也可以用於獲取查詢字符串的值。
 二、ServletResponse接口

  javax.servlet.ServletResponse接口表示一個Servlet響應,在調用service方法之前Servlet容器首先創建一個ServletResponse的實例,並將他作為第二個參數傳入到service方法中,ServletResponse隱藏了像瀏覽器發送響應的復雜過程。
  在ServletResponse接口中,定義的方法之一是getWriter方法,該方法返回了一個可以向客戶端發送文本的java.io.aPrintWriter。默認的情況下該對象采用的是ISO-8859-1的編碼方式。
三、ServletConfig
當Servlet容器初始化Servlet的時候,Servlet容器會給Servlet的init方法傳入一個ServletConfig的實例,該實例中封裝了可以通過@WebServlet或者部署描述符傳遞給Servlet的配置信息
這樣傳入的每一條信息就是一個初始參數,一個初始參數有key合 value兩個元件
為了從Servlet內部獲取到初始參數的值,要在Servlet容器傳給Servlet的init方法的ServletConfig中調用getInitParameter方法,getInitParameter方法的簽名如下:

此外,getInitParameterNames方法則是返回所有初始化參數名稱的一個Enumeration:

舉個例子,當要獲取contactName參數的值,要使用下面的方法簽名

除了getInitParameter和getInitParameterNamespace之外,ServletConfig還提供了一個很有用的方法:getServletContext。利用這個方法可以從Servlet內部獲取ServletContext。

四、ServletContext
ServletContext表示Servlet應用程序,每個應用程序只有一個上下文對象,當把一個應用程序同時部署到多個容器的分布式環境中的時候,每個jvm上面的Web應用程序都會有一個ServletContext對象。
通過ServletConfig中調用getServletContext方法,可以獲得ServletContext實例,有了ServletContext就可以共享從應用程序中所有資料處訪問到的信息,並且可以動態的註冊web對象,前者將對象保存在ServletContext內部的Map中,
保存在ServletContext中的對象被稱作為屬性
ServletContext中的以下的方法負責處理屬性:

五、GenericServlet抽象類
GenericServlet實現了Servlet和ServletConfig兩個接口,並且完成了以下任務:
1、將init方法中的ServletConfig付給一個類級的變量,以便可以通過調用getServletConfig獲取,
2、將接口中的所有方法提供默認實現,
3、提供方法,包圍ServletConfig中的方法

六、HttpServlet
HttpServlet類覆蓋了javax.servlet.GenericServletl類,在使用HttpServlet的時候,還要借助分別代表Servlet請求和Servlet響應的HttpServletRequest和HttpServletResponse對象。
HttpServletRequest接口擴展了javax.servlet.ServletRequest,HttpServletResponse接口擴展了javax.servlet.ServletResponse。
HttpServlet覆蓋了GenericServlet中的service方法,並且通過下面的簽名再添加一個service方法:
protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,java.io.IOException
新的service方法和javax.servlet.Servlet中的service方法之間的區別在於參數列表不同

HttpServletRequest :表示Http環境中的Servlet請求,它擴展了javax.servlet.ServcletRequest接口,中年服裝你並添加了幾個擴展的方法

HttpServletResponse: 表示Http環境中的響應,該接口同樣的擴展了javax.servlet.ServletResponse接口,新增了以下的幾種方法:

Servlet小結
Servlet技術是javaEE技術的一部分,所有的Servlet都運行在Servlet容器中,容器和Servlet間的接口為javax.servlet.Servlet.javax.servlet包下還提供了一個名為GenericServlet的Servlet實現類,該類是一個輔助類。
以便可以更加方便的創建一個Servlet。不過由於大部分的Servlet都運行在Http的環境中,因此就派生出來了一個javax.servlet.http.HttpServlet的子類更加實用。註意,HttpServlet也是GenericServlet的子類。
emmmmm。。。。。。

一定很枯燥吧,但是沒有辦法,這些幹貨就是這樣,學技術的話還是要耐得住性子。好了,下一篇博客給大家用Servlet寫一個小Demo,希望能緩解一下大家的枯燥

Java Web學習筆記----詳解ServletAPI