servlet知識

有關Java Servlets
      JavaTM servlets 是一個不受平臺約束的Java小程序,它可以被用來通過多種方法擴充一個Web服務器的功能。你可以把Servlet理解成Server上的 applets,它被編譯成字節碼,這樣它就可以被動態地載入並用效地擴展主機的處理能力。
      Servlet與applets不同的地方是,它不運行在Web瀏覽器或其他圖形化的用戶界面上。Servlet通過servlet引擎運行在Web服務器中,以執行請求和響應,請求、響應的典型範例是HTTP協議。
       一個客戶端程序,可以是一個Web瀏覽器,或者是非其他的可以連接上Internet的程序,它會訪問Web服務器併發出請求。這個請求被運行在Web服務器上的Servlet引擎處理,並返回響應到Servlet。Servlet通過HTTP將這個響應轉發到客戶端。
在功能上,Servlet與 CGI、NSAPI有點類似,但是,與他們不同的是:Servlet具有平臺無關性。


      Java Servlet概論
      Servlet與其他普通的server擴展機制有以下進步:
      因爲它採用了不同的進程處理模式,所以它比CGI更快。
      它使用了許多Web服務器都支持的標準的API。
      它繼承了Java的所有優勢,包括易升級以及平臺無關性。
      它可以調用Java所提供的大量的API的功能模塊。
      這份文檔說明了Java Servlet API的類和接口的方法。有關更多的信息,請參看下面的API說明。


      Servlet的生命週期
      一個Java servlet具有一個生命週期,這個生命週期定義了一個Servlet如何被載入並被初始化,如何接收請求並作出對請求的響應,如何被從服務中清除。 Servlet的生命週期被javax.servlet.Servlet這個接口所定義。
       所有的Java Servlet都會直接地或間接地執行javax.servlet.Servlet接口,這樣它才能在一個Servlet引擎中運行。 Servlet引擎是Web 服務器按照Java Servlet API定製的擴展。Servlet引擎提供網絡服務,能夠理解MIME請求,並提供一個運行Servlet的容器。
      javax.servlet.Servlet接口定義了在Servlet的生命週期中特定時間以及特定順序被調用的方法。


      Servlet的解析和載入
      Servlet引擎解析並載入一個Servlet,這個過程可以發生在引擎啓動時,需要一個Servlet去響應請求時,以及在此之間的任何時候。
      Servlet引擎利用Java類載入工具載入一個Servlet,Servlet引擎可以從一個本地的文件系統、一個遠程的文件系統以及網絡載入 Servlet。


      Servlet的初始化
      Servlet引擎載入Servlet後,Servlet引擎必須對Servlet進行初始化,在這一過程中,你可以讀取一些固定存儲的數據、初始化 JDBC的連接以及建立與其他資源的連接。
      在初始化過程中,javax.servlet.Servlet接口的init()方法提供了Servlet的初始化信息。這樣,Servlet可以對自己進行配置。
      init()方法獲得了一個Servlet配置對象(ServletConfig)。這個對象在Servlet引擎中執行,並允許Servlet通過它獲處相關參數。這個對象使得Servlet能夠訪問ServletContext對象。


      Servlet處理請求
      Servlet被初始化之後,它已經可以處理來自客戶端的請求,每一個來自客戶端的請求都被描述成一個ServletRequest對象,Servlet 的響應被描述成一個ServletResponse對象。
      當客戶端發出請求時,Servlet引擎傳遞給Servlet一個ServletRequest對象和一個ServletResponse對象,這兩個對象作爲參數傳遞到service()方法中。
      Servlet 也可以執行ServletRequest接口和ServletResponse接口。ServletRequest接口使得Servlet有權使用客戶端發出的請求。Servlet可以通過ServletInputStream對象讀取請求信息。
      ServletResponse接口允許Servlet建立響應頭和狀態代碼。通過執行這個接口,Servlet有權使用 ServletOutputStream類來向客戶端返回數據。


      多線程和映射
      在多線程的環境下,Servlet必須能處理許多同時發生的請求。例外的情況是這個Servlet執行了SingleThreadModel接口,如果是那樣的話,Servlet只能同時處理一個請求。
      Servlet依照Servlet引擎的映射來響應客戶端的請求。一個映射對包括一個Servlet實例以及一個Servlet返回數據的URL,例如:HelloServlet with /hello/index.html。
       然而,一個映射可能是由一個URL和許多Servlet實例組成,例如:一個分佈式的Servlet引擎可能運行在不止一個的服務器中,這樣的話,每一個服務器中都可能有一個Servlet實例,以平衡進程的載入。作爲一個Servlet的開發者,你不能假定一個Servlet只有一個實例。


      Servlet的卸載
      Servlet引擎並不必需保證一個Servlet在任何時候或在服務開啓的任何時候都被載入。Servlet引擎可以自由的在任何時候使用或清除一個 Servlet。因此,我們不能依賴一個類或實例來存儲重要的信息。
      當Servlet引擎決定卸載一個Servlet時(例如,如果這個引擎被關閉或者需要讓資源),這個引擎必須允許Servlet釋放正在使用的資源並存儲有關資料。爲了完成以上工作,引擎會調用Servlet的destroy()方法。 
       在卸載一個Servlet之前,Servlet引擎必須等待所有的service()方法完成或超時結束(Servlet引擎會對超時作出定義)。當一個 Servlet被卸載時,引擎將不能給Servlet發送任何請求。引擎必須釋放Servlet並完成無用存儲單元的收集


      Servlet映射技術
      作爲一個Servlet引擎的開發者,你必須對於如何映射客戶端的請求到Servlet有大量的適應性。這份說明文檔不規定映射如何發生。但是,你必須能夠自由地運用下面的所有技術:


      映射一個Servlet到一個URL
      例如,你可以指定一個特殊的Servlet它僅被來自/feedback/index.html的請求調用。


      映射一個Servlet到以一個指定的目錄名開始的所有URL
       例如,你可以映射一個Servlet到/catalog,這樣來自/catalog/、 /catalog/garden和 /catalog/housewares/index.html的請求都會被映射到這個Servlet。但是來自/catalogtwo 或 /catalog.html的請求沒被映射。


      映射一個Servlet到所有以一個特定的字段結尾的所有URL
      例如,你可以映射一個來自於所有以in.thtml結尾的請求到一個特定的Servlet。


      映射一個Servlet到一個特殊的URL /servlet/servlet_name。
      例如,如果你建立了一個名叫listattributes的Servlet,你可以通過使用/servlet/listattributes來訪問這個 Servlet。


      通過類名調用Servlet
       例如,如果Servlet引擎接收了來自/servlet/com.foo.servlet.MailServlet的請求,Servlet引擎會載入這個com.foo.servlet.MailServlet類,建立實例,並通過這個Servlet來處理請求。


      Servlet環境
      ServletContext 接口定義了一個Servlet環境對象,這個對象定義了一個在Servlet引擎上的Servlet的視圖。通過使用這個對象,Servlet可以記錄事件、得到資源並得到來自Servlet引擎的類(例如RequestDispatcher對象)。一個Servlet只能運行在一個Servlet環境中,但是不同的Servlet可以在Servlet引擎上有不同的視圖。
      如果Servlet引擎支持虛擬主機,每個虛擬主機有一個Servlet環境。一個Servlet環境不能在虛擬主機之間共享。
      Servlet引擎能夠允許一個Servlet環境有它自己的活動範圍。
      例如,一個Servlet環境是屬於bank應用的,它將被映射到/bank目錄下。在這種情況下,一個對getContext方法的調用會返回 /bank的Servlet環境。


      HTTP會話
      HTTP是一個沒有狀態的協議。要建立一個有效的Web服務應用,你必須能夠識別一個連續的來自遠端的客戶機的唯一的請求。隨着時間的過去,發展了許多會話跟蹤的技術,但是使用起來都比較麻煩。
      Java Servlet API提供了一個簡單的接口,通過這個接口,Servlet引擎可以有效地跟蹤用戶的會話。


      建立Session
      因爲HTTP是一個請求-響應協議,一個會話在客戶機加入之前會被認爲是一個新的會話。加入的意思是返回會話跟蹤信息到服務器中,指出會話已被建立。在客戶端加入之前,我們不能判斷下一個客戶端請求是目前會話的一部分。
      在下面的情況下,Session會被認爲是新的Session。
      客戶端的Session在此之前還不知道
      客戶端選擇不加入Session,例如,如果客戶端拒絕接收來自服務器的cookie
作爲一個Servlet的開發者,你必須決定你的Web應用是否處理客戶機不加入或不能加入Session。服務器會在Web服務器或Servlet規定的時間內維持一個Session對象。當Session終止時,服務器會釋放Session對象以及所有綁定在Session上的對象。
綁定對象到 Session中
       如果有助於你處理應用的數據需求,你也許需要綁定對象到Session中,你可以通過一個唯一的名字綁定任何的對象到Session中,這時,你需要使用 HttpSession對象。任何綁定到Session上的對象都可以被處理同一會話的Servlet調用。
      有些對象可能需要你知道什麼時候會被放置到Session中或從Session中移開。你可以通過使用 HttpSessionBindingListener接口獲得這些信息。當你的應用存儲數據到Session中,或從Session中清除數據,Servlet都會通過HttpSessionBindingListener檢杳什麼類被綁定或被取消綁定。這個接口的方法會通報被綁定或被取消綁定的對象。
API對象的說明
      這一部分包含了對Java Servlet API的全部類和接口的詳細說明。這個說明與Javadoc API差不多,但是這份文檔提供了更多的信息。
API包含了兩個軟件包,十二個接口和九個類。
軟件包:javax.servlet 
所包含的接口:RequestDispatcher;Servlet;ServletConfig;ServletContext;ServletRequest;ServletResponse;SingleThreadModel。
所包含的類:GenericServlet;ServletInputStream;ServletOutputStream;ServletException;UnavailableException。


      一、RequestDispatcher接口:
      定義:
      public interface RequestDispatcher;
      定義一個對象,從客戶端接收請求,然後將它發給服務器的可用資源(例如Servlet、CGI、HTML文件、JSP文件)。Servlet引擎創建 request dispatcher對象,用於封裝由一個特定的URL定義的服務器資源。
      這個接口是專用於封裝Servlet的,但是一個Servlet引擎可以創建request dispatcher對象用於封裝任何類型的資源。
      request dispatcher對象是由Servlet引擎建立的,而不是由Servlet開發者建立的。
      方法
      1、forward
      public void forward(ServletRequest request, ServletReponse response)
            throws ServletException, IOException;
      被用來從這個Servlet向其它服務器資源傳遞請求。當一個Servlet對響應作了初步的處理,並要求其它的對象對此作出響應時,可以使用這個方法。
      當request對象被傳遞到目標對象時,請求的URL路徑和其他路徑參數會被調整爲反映目標對象的目標URL路徑。
      如果已經通過響應返回了一個ServletOutputStream對象或PrintWriter對象,這個方法將不能使用,否則,這個方法會拋出一個 IllegalStateException。
      2、include
      public void include(ServletRequest request, ServletResponse response)
            throws ServletException, IOException
      用來包括髮送給其他服務器資源的響應的內容。本質上來說,這個方法反映了服務器端的內容。
      請求對象傳到目標對象後會反映調用請求的請求URL路徑和路徑信息。這個響應對象只能調用這個Servlet的ServletOutputStream對象和PrintWriter對象。
       一個調用include的Servlet不能設置頭域,如果這個Servlet調用了必須設置頭域的方法(例如cookie),這個方法將不能保證正常使用。作爲一個Servlet開發者,你必須妥善地解決那些可能直接存儲頭域的方法。例如,即使你使用會話跟蹤,爲了保證session的正常工作,你必須在一個調用include的Servlet之外開始你的session


      二、Servlet接口。
      定義
      public interface Servlet
      這個接口定義了一個Servlet:一個在Web服務器上繼承了這個功能的Java類。
      方法
      1、init
      public void init(ServletConfig config) throws ServletException;
      Servlet引擎會在Servlet實例化之後,置入服務之前精確地調用init方法。在調用service方法之前,init方法必須成功退出。
      如果init方法拋出一個ServletException,你不能將這個Servlet置入服務中,如果init方法在超時範圍內沒完成,我們也可以假定這個Servlet是不具備功能的,也不能置入服務中。
      2、service
      public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException;
      Servlet引擎調用這個方法以允許Servlet響應請求。這個方法在Servlet未成功初始化之前無法調用。在Servlet被初始化之前,Servlet引擎能夠封鎖未決的請求。
      在一個Servlet對象被卸載後,直到一個新的Servelt被初始化,Servlet引擎不能調用這個方法
      3、destroy
      public void destroy();
      當一個Servlet被從服務中去除時,Servlet引擎調用這個方法。在這個對象的service方法所有線程未全部退出或者沒被引擎認爲發生超時操作時,destroy方法不能被調用。
      4、getServletConfig
      public ServletConfig getServletConfig();
      返回一個ServletConfig對象,作爲一個Servlet的開發者,你應該通過init方法存儲ServletConfig對象以便這個方法能返回這個對象。爲了你的便利,GenericServlet在執行這個接口時,已經這樣做了。
      5、getServletInfo
      public String getServletInfo();
      允許Servlet向主機的Servlet運行者提供有關它本身的信息。返回的字符串應該是純文本格式而不應有任何標誌(例如HTML,XML等)。


      三、ServletConfig接口
      定義
      public interface ServletConfig
      這個接口定義了一個對象,通過這個對象,Servlet引擎配置一個Servlet並且允許Servlet獲得一個有關它的ServletContext 接口的說明。每一個ServletConfig對象對應着一個唯一的Servlet。
      方法
      1、getInitParameter
      public String getInitParameter(String name);
      這個方法返回一個包含Servlet指定的初始化參數的String。如果這個參數不存在,返加空值。
      2、getInitParameterNames
      public Enumeration getInitParameterNames();
      這個方法返回一個列表String對象,該對象包括Servlet的所有初始化參數名。如果Servlet沒有初始化參數,getInitParameterNames返回一個空的列表。
      3、getServletContext
      public ServletContext getServletContext();
      返回這個Servlet的ServletContext對象。


      四、ServletContext接口
      定義
      public interface ServletContext
      定義了一個Servlet的環境對象,通過這個對象,Servlet引擎向Servlet提供環境信息。
       一個Servlet的環境對象必須至少與它所駐留的主機是一一對應的。在一個處理多個虛擬主機的Servlet引擎中(例如,使用了HTTP1.1的主機頭域),每一個虛擬主機必須被視爲一個單獨的環境。此外,Servlet引擎還可以創建對應於一組Servlet的環境對象。
      方法 
      1、getAttribute
      public Object getAttribute(String name); 
      返回Servlet環境對象中指定的屬性對象。如果該屬性對象不存在,返回空值。這個方法允許訪問有關這個Servlet引擎的在該接口的其他方法中尚未提供的附加信息。
      2、getAttributeNames
      public Enumeration getAttributeNames();
      返回一個Servlet環境對象中可用的屬性名的列表。
      3、getContext
      public ServletContext getContext(String uripath);
      返回一個Servlet環境對象,這個對象包括了特定URI路徑的Servlets和資源,如果該路徑不存在,則返回一個空值。URI路徑格式是/dir /dir/filename.ext。
      爲了安全,如果通過這個方法訪問一個受限制的Servlet的環境對象,會返回一個空值。
      4、getMajorVersion
      public int getMajorVersion();
      返回Servlet引擎支持的Servlet API的主版本號。例如對於2.1版,這個方法會返回一個整數2。
      5、getMinorVersion
      public int getMinorVersion();
      返回Servlet引擎支持的Servlet API的次版本號。例如對於2.1版,這個方法會返回一個整數2。
      6、getMimeType
      public String getMimeType(String file);
      返回指定文件的MIME類型,如果這種MIME類型未知,則返回一個空值。MIME類型是由Servlet引擎的配置決定的。
      7、getRealPath
      public String getRealPath(String path);
       一個符合URL路徑格式的指定的虛擬路徑的格式是:/dir/dir/filename.ext。用這個方法,可以返回與一個符合該格式的虛擬路徑相對應的真實路徑的String。這個真實路徑的格式應該適合於運行這個Servlet引擎的計算機(包括其相應的路徑解析器)。
      不管是什麼原因,如果這一從虛擬路徑轉換成實際路徑的過程不能執行,該方法將會返回一個空值。
      8、getResource
      public URL getResource(String uripath);
       返回一個URL對象,該對象反映位於給定的URL地址(格式:/dir/dir/filename.ext)的Servlet環境對象已知的資源。無論 URLStreamHandlers對於訪問給定的環境是不是必須的,Servlet引擎都必須執行。如果給定的路徑的Servlet環境沒有已知的資源,該方法會返回一個空值。
      這個方法和java.lang.Class的getResource方法不完全相同。 java.lang.Class的getResource方法通過裝載類來尋找資源。而這個方法允許服務器產生環境變量給任何資源的任何Servlet,而不必依賴於裝載類、特定區域等等。
      9、getResourceAsStream
      public InputStream getResourceAsStream(String uripath);
      返回一個InputStream對象,該對象引用指定的URL的Servlet環境對象的內容。如果沒找到Servlet環境變量,就會返回空值,URL 路徑應該具有這種格式:/dir/dir/filename.ext。
      這個方法是一個通過getResource方法獲得URL對象的方便的途徑。請注意,當你使用這個方法時,meta-information(例如內容長度、內容類型)會丟失。
      10、getRequestDispatcher
      public RequestDispatcher getRequestDispatcher(String uripath);
       如果這個指定的路徑下能夠找到活動的資源(例如一個Servlet,JSP頁面,CGI等等)就返回一個特定URL的RequestDispatcher 對象,否則,就返回一個空值,Servlet引擎負責用一個request dispatcher對象封裝目標路徑。這個 request dispatcher對象可以用來完全請求的傳送。
      11、getServerInfo
      public String getServerInfo();
      返回一個String對象,該對象至少包括Servlet引擎的名字和版本號。
      12、log
      public void log(String msg);
      public void log(String msg, Throwable t);
      public void log(Exception exception, String msg); // 這種用法將被取消
      寫指定的信息到一個Servlet環境對象的log文件中。被寫入的log文件由Servlet引擎指定,但是通常這是一個事件log。當這個方法被一個異常調用時,log中將包括堆棧跟蹤。
      13、setAttribute
      public void setAttribute(String name, Object o);
      給予Servlet環境對象中你所指定的對象一個名稱。
      14、removeAttribute
      public void removeAttribute(String name);
      從指定的Servlet環境對象中刪除一個屬性。
      注:以下幾個方法將被取消
      15、getServlet
      public Servlet getServlet(String name) throws ServletException;
       最初用來返回一個指定名稱的Servlet,如果沒找到就返回一個空值。如果這個Servlet能夠返回,這就意味着它已經被初始化,而且已經可以接受 service請求。這是一個危險的方法。當調用這個方法時,可能並不知道Servlet的狀態,這就可能導致有關服務器狀態的問題。而允許一個 Servlet訪問其他Servlet的這個方法也同樣的危險。
      現在這個方法返回一個空值,爲了保持和以前版本的兼容性,現在這個方法還沒有被取消。在以後的API版本中,該方法將被取消。
      16、getServletNames
      public Enumeration getServletNames();
      最初用來返回一個String對象的列表,該列表表示了在這個Servlet環境下所有已知的Servlet對象名。這個列表總是包含這個Servlet 自身。
基於與上一個方法同樣的理由,這也是一個危險的方法。
      現在這個方法返回一個空的列表。爲了保持和以前版本的兼容性,現在這個方法還沒有被取消。在以後的API版本中,該方法將被取消。
      17、getServlets
      public Enumeration getServlets();
      最初用來返回在這個Servelet環境下所有已知的Servlet對象的列表。這個列表總是包含這個Servlet自身。
基於與 getServlet方法同樣的理由,這也是一個危險的方法。
      現在這個方法返回一個空的列表。爲了保持和以前版本的兼容性,現在這個方法還沒有被取消。在以後的API版本中,該方法將被取消。


      五、ServletRequest接口
      定義
      public interface ServletRequest
      定義一個Servlet引擎產生的對象,通過這個對象,Servlet可以獲得客戶端請求的數據。這個對象通過讀取請求體的數據提供包括參數的名稱、值和屬性以及輸入流的所有數據。
      方法
      1、getAttribute
      public Object getAttribute(String name);
      返回請求中指定屬性的值,如果這個屬性不存在,就返回一個空值。這個方法允許訪問一些不提供給這個接口中其他方法的請求信息以及其他Servlet放置在這個請求對象內的數據。
      2、getAttributeNames
      public Enumeration getAttributeNames();
      返回包含在這個請求中的所有屬性名的列表。
      3、getCharacterEncoding
      public String getCharacterEncoding();
      返回請求中輸入內容的字符編碼類型,如果沒有定義字符編碼類型就返回空值。
      4、getContentLength
      public int getContentLength();
      請求內容的長度,如果長度未知就返回-1。
      5、getContentType
      public String getContentType();
      返回請求數據體的MIME類型,如果類型未知返回空值。
      6、getInputStream
      public ServletInputStream getInputStream() throws IOException;
      返回一個輸入流用來從請求體讀取二進制數據。如果在此之前已經通過getReader方法獲得了要讀取的結果,這個方法會拋出一個 IllegalStateException。
      7、getParameter
      public String getParameter(String name);
       以一個String返回指定的參數的值,如果這個參數不存在返回空值。例如,在一個HTTP Servlet中,這個方法會返回一個指定的查詢語句產生的參數的值或一個被提交的表單中的參數值。如果一個參數名對應着幾個參數值,這個方法只能返回通過getParameterValues方法返回的數組中的第一個值。因此,如果這個參數有(或者可能有)多個值,你只能使用 getParameterValues方法。
      8、getParameterNames
      public Enumeration getParameterNames();
      返回所有參數名的String對象列表,如果沒有輸入參數,該方法返回一個空值。
      9、getParameterValues
      public String[] getParameterValues(String name);
      通過一個String對象的數組返回指定參數的值,如果這個參數不存在,該方法返回一個空值。
      10、getProtocol
      public String getProtocol();
      返回這個請求所用的協議,其形式是協議/主版本號.次版本號。例如對於一個HTTP1.0的請求,該方法返回HTTP/1.0。
      11、getReader
      public BufferedReader getReader() throws IOException;
      這個方法返回一個buffered reader用來讀取請求體的實體,其編碼方式依照請求數據的編碼方式。如果這個請求的輸入流已經被getInputStream調用獲得,這個方法會拋出一個IllegalStateException。
      12、getRemoteAddr
      public String getRemoteAddr();
      返回發送請求者的IP地址。
      13、getRemoteHost
      public String getRemoteHost();
      返回發送請求者的主機名稱。如果引擎不能或者選擇不解析主機名(爲了改善性能),這個方法會直接返回IP地址。
      14、getScheme
      public String getScheme();
      返回請求所使用的URL的模式。例如,對於一個HTTP請求,這個模式就是http。
      15、getServerName
      public String getServerName();
      返回接收請求的服務器的主機名。
      16、getServerPort
      public int getServerPort();
      返回接收請求的端口號。
      17、setAttribute
      public void setAttribute(String name, Object object);
      這個方法在請求中添加一個屬性,這個屬性可以被其他可以訪問這個請求對象的對象(例如一個嵌套的Servlet)使用。
      注:以下方法將被取消
      getRealPath
      public String getRealPath(String path);
      返回與虛擬路徑相對應的真實路徑,如果因爲某種原因,這一過程不能進行,該方法將返回一個空值。
       這個方法和ServletContext接口中的getRealPath方法重複。在2.1版中,ServletContext接口將闡明一個 Servlet所能用的所有的路徑的映射。該方法執行的結果將會與ServletContext中getRealPath方法的結果完全一樣。


      六、ServletResponse接口
      定義
      public interface ServletResponse
      定義一個Servlet引擎產生的對象,通過這個對象,Servlet對客戶端的請求作出響應。這個響應應該是一個MIME實體,可能是一個HTML頁、圖象數據或其他MIME的格式。
      方法
      1、getCharacterEncoding
      public String getCharacterEncoding();
      返回MIME實體的字符編碼。這個字符編碼可以是指定的類型,也可以是與請求頭域所反映的客戶端所能接受的字符編碼最匹配的類型。在HTTP協議中,這個信息被通過Accept-Charset傳送到Servlet引擎。
      有關字符編碼和MIME的更多信息請參看RFC 2047。
      2、getOutputStream
      public ServletOutputStream getOutputStream() throws IOException;
      返回一個記錄二進制的響應數據的輸出流。
      如果這個響應對象已經調用getWriter,將會拋出IllegalStateException。
      3、getWriter
      public PrintWriter getWriter throws IOException;
      這個方法返回一個PringWriter對象用來記錄格式化的響應實體。如果要反映使用的字符編碼,必須修改響應的MIME類型。在調用這個方法之前,必須設定響應的content類型。
      如果沒有提供這樣的編碼類型,會拋出一個UnsupportedEncodingException,如果這個響應對象已調用 getOutputStream,會拋出一個getOutputStream。
      4、setContentLength
      public void setContentLength(int length);
      設置響應的內容的長度,這個方法會覆蓋以前對內容長度的設定。
      爲了保證成功地設定響應頭的內容長度,在響應被提交到輸出流之前必須調用這個方法。
      5、setContentType
      public void setContentType(String type);
      這個方法用來設定響應的content類型。這個類型以後可能會在另外的一些情況下被隱式地修改,這裏所說的另外的情況可能當服務器發現有必要的情況下對 MIME的字符設置。
      爲了保證成功地設定響應頭的content類型,在響應被提交到輸出流之前必須調用這個方法。


      七、SingleThreadModel接口
      定義
      public interface SingleThreadModel;
      這是一個空接口,它指定了系統如何處理對同一個Servlet的調用。如果一個Servlet被這個接口指定,那麼在這個Servlet中的 service方法中將不會有兩個線程被同時執行。
      Servlet可以通過維持一個各自獨立的Servlet實例池,或者通過只讓Servlet的service中只有一個線程的方法來實現這個保證。


      八、GenericServlet類
      public abstract class GenericServlet implements Servlet,
            ServletConfig, Serializable;
      這個類的存在使得編寫Servlet更加方便。它提供了一個簡單的方案,這個方案用來執行有關Servlet生命週期的方法以及在初始化時對 ServletConfig對象和ServletContext對象進行說明。
      方法
      1、destroy
      public void destroy();
      在這裏destroy方法不做任何其他的工作。
      2、getInitParameter
      public String getInitParameter(String name);
      這是一個簡便的途徑,它將會調用ServletConfig對象的同名的方法。
      3、getInitParameterNames
      public Enumeration getInitParameterNames();
      這是一個簡便的途徑,它將會調用ServletConfig對象的同名的方法。
      4、getServletConfig
      public ServletConfig getServletConfig();
      返回一個通過這個類的init方法產生的ServletConfig對象的說明。
      5、getServletContext
      public ServletContext getServletContext();
      這是一個簡便的途徑,它將會調用ServletConfig對象的同名的方法。
      6、getServletInfo
      public String getServletInfo();
      返回一個反映Servlet版本的String。
      7、init
      public void init() throws ServletException;
      public void init(ServletConfig config) throws ServletException;
      init(ServletConfig config)方法是一個對這個Servlet的生命週期進行初始化的簡便的途徑。
      init()方法是用來讓你對GenericServlet類進行擴充的,使用這個方法時,你不需要存儲config對象,也不需要調用 super.init(config)。
      init(ServletConfig config)方法會存儲config對象然後調用init()。如果你重載了這個方法,你必須調用super.init(config),這樣 GenericServlet類的其他方法才能正常工作。
      8、log
      public void log(String msg);
      public void log(String msg, Throwable cause);
      通過Servlet content對象將Servlet的類名和給定的信息寫入log文件中。
      9、service
      public abstract void service(ServletRequest request, ServletResponse
            response) throws ServletException, IOException;
      這是一個抽象的方法,當你擴展這個類時,爲了執行網絡請求,你必須執行它。


      九、ServletInputStream類
      定義
      public abstract class ServletInputStream extends InputStream
      這個類定義了一個用來讀取客戶端的請求信息的輸入流。這是一個Servlet引擎提供的抽象類。一個Servlet通過使用ServletRequest 接口獲得了對一個ServletInputStream對象的說明。
      這個類的子類必須提供一個從InputStream接口讀取有關信息的方法。
      方法
      1、readLine
      public int readLine(byte[] b, int off, int len) throws IOException;
      從輸入流的指定的偏移量開始將指定長度的字節讀入到指定的數組中。如果該行所有請求的內容都已被讀取,這個讀取的過程將結束。如果是遇到了新的一行,新的一行的首個字符也將被讀入到數組中。


      十、ServletOutputStream類
      定義
      public abstract class ServletOutputStream extends OutputStream
      這是一個由Servlet引擎使用的抽象類。Servlet通過使用ServletResponse接口的使用獲得了對一個這種類型的對象的說明。利用這個輸出流可以將數據返回到客戶端。
      這個類的子類必須提供一個向OutputStream接口寫入有關信息的方法。
      在這個接口中,當一個刷新或關閉的方法被調用時。所有數據緩衝區的信息將會被髮送到客戶端,也就是說響應被提交了。請注意,關閉這種類型的對象時不一定要關閉隱含的socket流。
      方法
      1、print
      public void print(String s) throws IOException;
      public void print(boolean b) throws IOException;
      public void print(char c) throws IOException;
      public void print(int i) throws IOException;
      public void print(long l) throws IOException;
      public void print(float f) throws IOException;
      public void print(double d) throws IOException;
      輸出變量到輸出流中
      2、println
      public void println() throws IOException;
      public void println(String s) throws IOException;
      public void println(boolean b) throws IOException;
      public void println(char c) throws IOException;
      public void println(int i) throws IOException;
      public void println(long l) throws IOException;
      public void println(float f) throws IOException;
      public void println(double d) throws IOException;
      輸出變量到輸出流中,並增加一個回車換行符


      十一、ServletException類
      定義
      public class ServletException extends Exception
      當Servlet遇到問題時拋出的一個異常。
      構造函數
      public ServletException();
      public ServletException(String message);
      public ServletException(String message, Throwable cause);
      public ServletException(Throwable cause);
      構造一個新的ServletException,如果這個構造函數包括一個Throwable參數,這個Throwable對象將被作爲可能拋出這個異常的原因。
      方法
      1、getRootCause
      public Throwable getRootCause();
      如果配置了拋出這個異常的原因,這個方法將返回這個原因,否則返回一個空值。


      十二、UnavailableException類
      定義
      public class UnavailableException extends ServletException
      不論一個Servlet是永久地還是臨時地無效,都會拋出這個異常。Servlet會記錄這個異常以及Servlet引擎所要採取的相應措施。
      臨時的無效是指Servlet在某一時間由於一個臨時的問題而不能處理請求。例如,在另一個不同的應用層的服務(可能是數據庫)無法使用。這個問題可能會自行糾正或者需要採取其他的糾正措施。
      永久的無效是指除非管理員採取措施,這個Servlet將不能處理客戶端的請求。例如,這個Servlet配置信息丟失或Servlet的狀態被破壞。
      Servlet 引擎可以安全地處理包括永久無效在內的這兩種異常,但是對臨時無效的正常處理可以使得Servlet引擎更健壯。特別的,這時對Servlet的請求只是被阻止(或者是被延期)一段時間,這顯然要比在service自己重新啓動前完全拒絕請求更爲科學。
      構造函數
      public UnavailableException(Servlet servlet, String message);
      public UnavailableException(int seconds, Servlet servlet, 
            String message);
      構造一個包含指定的描述信息的新的異常。如果這個構造函數有一個關於秒數的參數,這將給出Servlet發生臨時無效後,能夠重新處理請求的估計時間。如果不包含這個參數,這意味着這個Servlet永久無效。
      方法
      1、getServlet
      public Servlet getServlet();
      返回報告無效的Servlet。這被Servlet引擎用來識別受到影響的Servlet。
      2、getUnavailableSeconds
      public int getUnavailableSeconds();
      返回Servlet預期的無效時間,如果這個Servlet是永久無效,返回-1。
      3、isPermanent
      public boolean isPermanent();
      如果這個Servlet永久無效,返回布爾值true,指示必須採取一些管理行動以使得這個Servlet可用。 


servlet生成驗證碼jsp 筆記 2010-01-03 21:01:51 閱讀15 評論0   字號:大中小 訂閱 .


package com.xasxt.validate;


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;


import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class myvalidate extends HttpServlet {


    Random rd = new Random();
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
/**
 * 設置瀏覽器不要緩存,當有緩存時,驗證碼刷新時不變!
 */
//        response.setHeader("Pragma","No-cache");    
//        response.setHeader("Cache-Control","no-cache");    
//        response.setDateHeader("Expires", 0); 
        response.setContentType("image/png");
        String code = codeRandom(4);
        HttpSession session = request.getSession();
        session.setAttribute("validate", code);
        BufferedImage image = new BufferedImage(130,40,BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();
        g.setColor(Color.gray);
        g.fillRect(0,0, image.getWidth(), image.getHeight());
        //干擾線
        for(int i=0;i<20;i++){
            g.setColor(new Color(rd.nextInt(256),rd.nextInt(256),rd.nextInt(256)));
            g.drawOval(rd.nextInt(70), rd.nextInt(20), rd.nextInt(40), rd.nextInt(60));
        }
        //輸出文字
        Color[] cs = new Color[]{Color.red,Color.blue,Color.green,Color.yellow};
        for (int i = 0; i <code.length(); i++) {
            String s = code.charAt(i) + "";
            g.setFont(new Font("IMPACT",Font.BOLD,18));
            g.setColor(Color.BLACK);
            int y = rd.nextInt(10);
            g.drawString(s, image.getWidth()/code.length()*i + 2+2, 20+y+2);
            g.setColor(cs[rd.nextInt(4)]);
            g.drawString(s, image.getWidth()/code.length()*i + 2, 20+y);
        }
        ImageIO.write(image, "png", response.getOutputStream());
    }


    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {


        doGet(request,response);
    }


    
    private  String codeRandom(int n){
        String s = "123456789ABCDEFGHKMNPQSYXRZWTUVW";
        String code = "";
        for(int i=0;i<n;i++){
            code += s.charAt(rd.nextInt(s.length()));
        }
        return code;
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章