Servlet概述
學號:201631062509
姓名:楊菓
1.Servlet 是什麼?
Java Servlet 是執行在 Web 伺服器或應用伺服器上的程式,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 伺服器上的資料庫或應用程式之間的中間層。
使用 Servlet,您可以收集來自網頁表單的使用者輸入,呈現來自資料庫或者其他源的記錄,還可以動態建立網頁。
Java Servlet 通常情況下與使用 CGI(Common Gateway Interface,公共閘道器介面)實現的程式可以達到異曲同工的效果。但是相比於 CGI,Servlet 有以下幾點優勢:
- 效能明顯更好。
- Servlet 在 Web 伺服器的地址空間內執行。這樣它就沒有必要再建立一個單獨的程式來處理每個客戶端請求。
- Servlet 是獨立於平臺的,因為它們是用 Java 編寫的。
- 伺服器上的 Java 安全管理器執行了一系列限制,以保護伺服器計算機上的資源。因此,Servlet 是可信的。
- Java 類庫的全部功能對 Servlet 來說都是可用的。它可以通過 sockets 和 RMI 機制與 applets、資料庫或其他軟體進行互動。
2.Servlet 架構
下圖顯示了 Servlet 在 Web 應用程式中的位置。
3.Servlet 任務
Servlet 執行以下主要任務:
- 讀取客戶端(瀏覽器)傳送的顯式的資料。這包括網頁上的 HTML 表單,或者也可以是來自 applet 或自定義的 HTTP 客戶端程式的表單。
- 讀取客戶端(瀏覽器)傳送的隱式的 HTTP 請求資料。這包括 cookies、媒體型別和瀏覽器能理解的壓縮格式等等。
- 處理資料並生成結果。這個過程可能需要訪問資料庫,執行 RMI 或 CORBA 呼叫,呼叫 Web 服務,或者直接計算得出對應的響應。
- 傳送顯式的資料(即文件)到客戶端(瀏覽器)。該文件的格式可以是多種多樣的,包括文字檔案(HTML 或 XML)、二進位制檔案(GIF 影象)、Excel 等。
- 傳送隱式的 HTTP 響應到客戶端(瀏覽器)。這包括告訴瀏覽器或其他客戶端被返回的文件型別(例如 HTML),設定 cookies 和快取引數,以及其他類似的任務。
4.Servlet 包
Java Servlet 是執行在帶有支援 Java Servlet 規範的直譯器的 web 伺服器上的 Java 類。
Servlet 可以使用 javax.servlet 和 javax.servlet.http 包建立,它是 Java 企業版的標準組成部分,Java 企業版是支援大型開發專案的 Java 類庫的擴充套件版本。
這些類實現 Java Servlet 和 JSP 規範。在寫本教程的時候,二者相應的版本分別是 Java Servlet 2.5 和 JSP 2.1。
Java Servlet 就像任何其他的 Java 類一樣已經被建立和編譯。在您安裝 Servlet 包並把它們新增到您的計算機上的 Classpath 類路徑中之後,您就可以通過 JDK 的 Java 編譯器或任何其他編譯器來編譯 Servlet。
5.環境設定
已經在上一個作業中設定過環境,所以就不再闡述。
6.Servlet 生命週期
Servlet 生命週期可被定義為從建立直到毀滅的整個過程。以下是 Servlet 遵循的過程:
- Servlet 通過呼叫 init () 方法進行初始化。
- Servlet 呼叫 service() 方法來處理客戶端的請求。
- Servlet 通過呼叫 destroy() 方法終止(結束)。
- 最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。
架構圖
下圖顯示了一個典型的 Servlet 生命週期方案。
- 第一個到達伺服器的 HTTP 請求被委派到 Servlet 容器。
- Servlet 容器在呼叫 service() 方法之前載入 Servlet。
- 然後 Servlet 容器處理由多個執行緒產生的多個請求,每個執行緒執行一個單一的 Servlet 例項的 service() 方法。
7.工作原理
Tomcat容器—>Servlet容器—>Context容器
1、Web Client 向Servlet容器(Tomcat)發出Http請求
2、Servlet容器接收Web Client的請求
3、Servlet容器建立一個HttpRequest物件,將Web Client請求的資訊封裝到這個物件中
4、Servlet容器建立一個HttpResponse物件
5、Servlet容器呼叫HttpServlet物件的service方法,把HttpRequest物件與HttpResponse物件作為引數
傳給 HttpServlet物件
6、HttpServlet呼叫HttpRequest物件的有關方法,獲取Http請求資訊
7、HttpServlet呼叫HttpResponse物件的有關方法,生成響應資料
8、Servlet容器把HttpServlet的響應結果傳給Web Client
8.例項
下面是 Servlet 輸出 Hello World 的示例原始碼:
// 匯入必需的 java 庫
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// 擴充套件 HttpServlet 類
public class HelloWorld extends HttpServlet {
private String message;
public void init() throws ServletException
{
// 執行必需的初始化
message = "Hello World";
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 設定響應內容型別
response.setContentType("text/html");
// 實際的邏輯是在這裡
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void destroy()
{
// 什麼也不做
}
}
編譯 Servlet
讓我們把上面的程式碼寫在 HelloWorld.java 檔案中,把這個檔案放在 C:\ServletDevel(在 Windows 上)或 /usr/ServletDevel(在 UNIX 上)中,還需要把這些目錄新增到 CLASSPATH 中。
進入 ServletDevel 目錄,並編譯 HelloWorld.java,如下所示:
$ javac HelloWorld.java
如果 Servlet 依賴於任何其他庫,必須在 CLASSPATH 中包含那些 JAR 檔案。在這裡,只包含了 servlet-api.jar JAR 檔案,因為沒有在 Hello World 程式中使用任何其他庫。
該命令列使用 Sun Microsystems Java 軟體開發工具包(JDK)內建的 javac 編譯器。為使該命令正常工作,您必須 PATH 環境變數中使用的 Java SDK 的位置。
如果一切順利,上面編譯會在同一目錄下生成 HelloWorld.class 檔案。
Servlet 部署
預設情況下,Servlet 應用程式位於路徑 <Tomcat-installation-directory>/webapps/ROOT 下,且類檔案放在 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes 中。
有一個完全合格的類名稱 com.myorg.MyServlet,那麼這個 Servlet 類必須位於 WEB-INF/classes/com/myorg/MyServlet.class 中。
現在,把 HelloWorld.class 複製到 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes 中,並在位於 <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/ 的 web.xml 檔案中建立以下條目:
<web-app>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
</web-app>
上面的條目要被建立在 web.xml 檔案中的 <web-app>...</web-app> 標籤內。
使用 <Tomcat-installation-directory>\bin\startup.bat(在 Windows 上)或 <Tomcat-installation-directory>/bin/startup.sh(在 Linux/Solaris 等上)啟動 tomcat 伺服器,最後在瀏覽器的位址列中輸入 http://localhost:8080/HelloWorld。
得到結果: