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>H
elloServlet</servlet-name>
        <url-pattern>/HelloServlet</url-pattern>
    </servlet-mapping>

 
</web-app>

 

開啟瀏覽器,在網址列輸入 http://localhost:8080/TestApp/HelloServlet

100331--8.jpg

 

 


 

● 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()方法

...
public void init() throws ServletException
...

* 重新定義有參數的init()方法

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

例如可以使用 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()

...
public void destroy() {
    super.destroy();
    //....
}
...

 

瀏覽器發出請求至Servlet的執行順序是: 

    瀏覽器 -> Web 伺服器 -> Servlet 容器 -> service()

如果是HttpServlet則會依請求的方法,在service()之後呼叫對應的doXXX()方法。

 

參考:良葛格學習筆記 JSP/Servlet

參考:Java Servlet 程式設計初步

arrow
arrow
    全站熱搜

    tsuozoe 發表在 痞客邦 留言(2) 人氣()