1. 程式人生 > >Servlet詳解——學習筆記(一)

Servlet詳解——學習筆記(一)

此為是我接觸Java web的第一篇部落格,希望能堅持下來。本文主要是解釋Struts框架中的Servlet技術,希望能讓大家對Servlet有更好的理解。

       在JSP應用中,Servlet是一種獨立於平臺和協議的伺服器端的Java應用程式,能夠生成動態的Java web頁面,採用“請求----響應”模式提供web服務。Servlet擔當了web瀏覽器或其他HTTP客戶程式請求和HTTP伺服器上的資料庫或應用程式之間的中間層。與傳統的從命令列啟動的Java應用程式不同,Servlet是由web伺服器載入的,而web伺服器必須包含支援Servlet的JVM。狹義的Servlet是指Java語言實現的一個

介面,廣義的Servlet是指任何實現了這個Servlet介面的,一般情況下,人們將Servlet理解為後者。

一、Servlet的優點(主要針對CGI)

(1)高效。在Servlet中,每個請求由一個輕量級的java執行緒處理(而不是重量級的OS程序)。

(2)方便。它提供了大量的實用工具例程,例如自動地解析和解碼HTML表單資料、讀取和設定HTTP頭,處理Cookie、跟蹤會話狀態等,這樣方便coder的工作。

(3)功能強大。例如Servlet能夠直接與web伺服器互動,而普通的CGI程式則不能。Servlet還能夠在各個程式之間共享資料,使得資料庫連線池之類的功能很容易實現。

(4)可移植性好。

(5)節省投資

Servlet的永續性主要分為初始化、請求處理、終止這幾個階段,JSP的本質是Servlet,coder編寫的JSP頁面由Web容器編譯成對應的Servlet。當Servlet在容器中執行時,Servlet例項的建立及銷燬等都不是由coder決定的,而是由web容器進行控制。

二、Servlet的生命週期分為四個階段
(1)建立Servlet物件,通過伺服器反射機制建立Servlet物件,第一次請求時才會建立。(預設)
(2)呼叫Servlet物件的init()方法,初始化Servlet的資訊,init()方法只會在建立後被呼叫一次
(3)響應請求,呼叫service()或者是doGet(),doPost()方法來處理請求,這些方法是執行的在多執行緒狀態下的。
(4)在長時間沒有被呼叫或者是伺服器關閉時,會呼叫destroy()方法來銷燬Servlet物件。

三、Servlet建立時機:
(1)第一個請求到來的時候建立
(2)在web.xml中<servlet>標籤下新增<load-on-startup>2</load-on-startup>,則在伺服器啟動的時候就建立 標籤體是正數的時候,啟動伺服器,即建立servlet 並且當多個<servlet>標籤都定義了這個時,數字小的先載入

四、Servlet與Applet的異同

Applet與Servlet的相同之處在於它們不是獨立的應用程式,沒有main()方法。它們不是由coder呼叫,而是由另外一個應用程式(容器)呼叫,它們都有一個生存週期,包含init()和destroy()方法;不同之處在於Applet具有好的使用者介面(AWT),與瀏覽器一起,在客戶端執行,Servlet則沒有圖形介面,執行在伺服器端。

五、Servlet開發體驗

Servlet通常被稱為伺服器端小程式,是執行在伺服器端的程式,功能是處理並響應客戶端的請求。Servlet是一個特殊的Java類,此Java類必須繼承於HttpServlet,每一個Servlet可以響應客戶端的請求。

Servlet為我們提供下列方法以響應客戶端的請求:

  • doGet:用於響應客戶端的GET請求
  • doPost:用於......................POST請求
  • doPut:................................PUT請求
  • doDelete:..........................DELETE請求
通常Java web應用中的客戶端的請求只有兩種,分別為GET和POST,Servlet為了響應這兩種請求,必須重寫doGet和doPost方法。如果響應4種請求,需重寫4個方法。在大多數情況下,Servlet對於所有請求的響應都是完全一樣的,這樣就可以重寫一個方法來代替上面4種方法,此時只需重寫service()即可響應客戶端的所有請求。此外,在HttpServlet中還包含了如下兩方法:
  • init(Servlet config):建立Servlet例項時,呼叫該方法初始化Servlet資源。
  • destory():銷燬Servlet例項時,自動呼叫該方法回收資源
通常無需重寫上面兩方法,除非需要要在初始化Servlet時完成某些資源的初始化,才重寫init方法,重寫該方法,首先要重寫該方法的第一行呼叫super.init(config),該方法呼叫HttpServlet的init方法;銷燬Servlet之前先完成某些資源的回收,比如關閉資料庫連線,才重寫destory方法。不用為Servlet類編寫建構函式,如需對類進行初始化,應將此操作放入init方法中。

初次練習:

package jweb;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class HelloServlet extends HttpServlet{

    public void init(ServletConfig config) throws ServletException
    {
        super.init(config);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html; charset=GB2312");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>Hello - Servlet</title></head>");

        out.println("<body>");
        out.println(" Hello World <br>");
        out.println("</body>");
        out.println("</html>");

        out.close();
    }

    public String getServletInfo()
    {
        return "com.sdc.www.HelloServlet Infomation.";
    }

    public void destory()
    {
    }
}
將檔案儲存為HelloServlet.java,上面是一個很簡單的servlet程式,只是簡單的輸出一個Hello world,注意,用javac編譯時,一定要將環境建好:即將Tomcat中的servlet-api.jar檔案複製到JDK資料夾的“jre\lib\ext”中,然後編譯成.class檔案(使用javac HelloServlet.java來編譯,會生成HelloSevlet.class檔案)。 四、配置tomcat 配置tomcat,啟動tomcat,在tomcat的webapps目錄下新建一個資料夾,名字可以隨便,我這裡my_example
目錄結構
webapps
      |-------my_example
                       |-------WEB-INF
                       |                |-----------classes
                       |                |-----------web.xml
                       |-------index.html


其中classes檔案就是放剛剛生成HelloServlet.class檔案,由於上面的程式碼是包含在包jweb中,所以是放在classes/jweb/HelloServlet.class
配置web.xml,是Servlet對外可見 <?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    <description>Examples</description>
    <display-name>Examples</display-name>
     <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>jweb.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
   <servlet-name>HelloServlet</servlet-name>
   <url-pattern>/HelloServlet</url-pattern>
    </servlet-mapping> 
</web-app>


這樣我們就可以通過http://localhost:8080/my_example/HelloServlet來訪問了.