Servle t其實就是一個 Java 類別,它實作 javax.servlet.Servlet 介面,可以繼承實作該介面的子類別 javax.servlet.http.HttpServlet 類別來撰寫 Servlet,其專門用於處理HTTP請求與回應的Servlet。
HttpServlet 類別的 service() 會被容器呼叫,service() 中定義了HTTP處理的基本流程,會處理 request 並傳送給 doXXX()方法,例如 doGet() 或 doPost() 方法,所以通常很少會去改寫service()(也不建議),而是改寫 doGet() 或 doPost() 方法。
HelloServlet.java |
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello!Servlet!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1><b>Hello!Servlet!</b></h1>"); out.println("</body>"); out.println("</html>"); } } |
存檔完後,編譯 HelloServlet.java,在 DOS 視窗下輸入命令: javac HelloServlet.java
【注意】:編譯 serlvet 程式時必須讓 javac 編譯器找得到 HttpServlet 和相關的類別,有兩種方法:
(1) 把 %CATALINA_HOME%\common\lib 目錄下的 servlet-api.jar 和 jsp-api.jar 複製到 %JAVA_HOME%\jre\lib\ext 目錄下(註:Tomcat 4.0 和更早期的版本是把 JSP 和 servlet 相關類別都放在一個 servlet.jar 裡面)。
(2) 把 ".;%CATALINA_HOME%\common\lib\servlet-api.jar;%CATALINA_HOME%\common\lib\jsp-api.jar" 加入系統環境變數 CLASSPATH 中。注意前面的 ".;" 一定要加,它代表的是每次編譯時的現行目錄。
假設您的 Web 應用程式位於 webapps/TestApp/ 下,則編譯完成的 Servlet 類別必須放置在 WEB-INF /classes/之下,為了要讓容器能知道這個 Servlet 的存在並實例化,您必須在 WEB-INF/web.xml 中告知:
web.xml |
<?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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <description> My Servlet Examples. </description> <display-name>Servlet Examples</display-name> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/HelloServlet</url-pattern> </servlet-mapping> </web-app> |
開啟瀏覽器,在網址列輸入 http://localhost:8080/TestApp/HelloServlet
● Servlet 生命週期
Servlet的生命週期主要有四個階段:載入、初始化、執行、清除。
1. 載入:指的是容器將Servlet類別載入JVM並實例化
這個時候Servlet物件只能說是一個純綷的Java物件,載入Servlet的時機有三種可能:
* 伺服器啟動時 (在web.xml的<servlet>定義時,加入<load-on- startup>標籤,其設定的是載入時的順序值,數值越小就越先載入。)
web.xml |
... <servlet> <servlet-name>Servletname1</servlet-name> <servlet-class>demo.servlet.SomeServlet1</servlet-class> <load-on-startup>10</load-on-startup> </servlet> ... |
* 瀏覽器第一次接收請求時
* 管理者要求時
2. 初始化:主要是讀取配置資訊(JDBC連接)或其他須執行任務。
呼叫執行init()方法,傳入一個 ServletConfig型態的物件,表示與Servlet相關的環境物件,web.xml中的一些設定資訊也包括在這個物件當中,在初始化之後, Servlet物件才稱的上具備Servlet功能。
* 重新定義無參數的init()方法
... |
* 重新定義有參數的init()方法
... |
例如可以使用 ServletConfig 物件的 getInitParameter("user") 方法,來取得來取得設定於web.xml中的初始參數 abc 值。
web.xml |
... <servlet> <servlet-name>FirstServlet</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>user</param-name> <param-value>abc</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> ... |
3. 執行:處理請求。
每一個請求由 ServletRequest 物件來接收請求;而 ServletResponse 物件來回應請求(javax.servlet.*)。HTTP請求及回應的存取服務則由 HttpServletRequest 和 HttpServletResponse 來處理(javax.servlet.http.*)。
4. 清除:釋放所有使用中的資源。
呼叫destroy()方法,通常也建議呼叫super.destroy(),這會呼叫父類別 GenericServlet的destroy()
... |
瀏覽器發出請求至Servlet的執行順序是:
瀏覽器 -> Web 伺服器 -> Servlet 容器 -> service()
如果是HttpServlet則會依請求的方法,在service()之後呼叫對應的doXXX()方法。
留言列表