1,介紹
Servlet是一門專門用于開發動态web資源的技術,Sun公司在其API中提供了一個Servlet接口(當然,我們不會去直接實作這個接口,而是去繼承其實作類會更好),是以,狹義的Servlet是指這個接口,廣義的Servlet是指任何實作了這個Servlet接口的類。 使用Servlet開發一個動态web資源,其實就是開發一個Java程式向浏覽器輸出資料。
Servlet其實就是一個運作在伺服器上得Java程式,Servlet是J2EE十三門技術中的一種,是以我們不能去看J2SE的API文檔,如果是初學者,最好能看專門Servlet的API文檔。我們來看Servlet的文檔介紹:
從這個對Servlet接口的介紹就可以看出,如果要實作Servlet接口,就要實作其所有的方法,Servlet程式是運作在web伺服器上得,用來接收和響應從用戶端發來的請求。當然就像我之前說的,如果自己寫一個類來實作Servlet接口,那麼就要複寫Servlet所有的方法,但是我們可以繼承其實作類,例如GenericServlet類或者HttpServlet類,這樣隻需要複寫我們想複寫的方法即可。
Servlet中的方法包括了其生命周期方法和非生命周期的方法。在Servlet中,生命周期方法包括:init(ServletConfig config)、destroy()、service(ServletRequest req , ServletResponse res),也就是Servlet初始化、對請求進行響應服務,和Servlet的銷毀。
除了Servlet的生命周期方法,還有非生命周期方法,如getServletConfig()和getServletInfo()方法,這兩個方法可以獲得有關該Servlet的一些資訊。
Servlet生命周期是指Servlet執行個體從建立到響應用戶端請求,最後銷毀的過程。具體過程如下:
1, Server建立一個Servlet的執行個體,也就是調用了init()方法;
2, 一個用戶端的請求(對象)到達Server;
3, Server将請求發送給Servlet;
4, Servlet生成對請求的響應(對象);
5, Server激活Servlet的service()方法,傳遞請求對象和響應對象作為參數;
6, Service()方法獲得請求對象的資訊,處理請求,通路資源,獲得所需的資訊;
7, Service()方法使用響應對象的方法,将響應傳回Server,最終到達用戶端。Service方法還可能激活其他方法處理請求,如doGet()或者doPost()方法;
8, 對于更多的用戶端請求,Server建立新的請求和響應對象,仍然激活此Servlet的service方法,将這兩個對象作為參數傳遞給它,無需再調用init()方法。一般Servlet隻初始化一次。當Server不在需要Servlet時(一般是Server關閉),Server調用Servlet的destroy()方法銷毀Servlet。
從以上可以看出,Servlet生命周期上得三個方法是由伺服器調用,可以說是在Servlet存在開始到銷毀這個過程中的某個時刻(如果有事件觸發)則必定會被執行的方法稱為生命周期方法。
是以,在Servlet中最重要的就是service()方法,要想從伺服器端将資源傳回用戶端或者向用戶端發送資料,都将在service()方法中進行。
從service(ServletRequest req , ServletResponse res)方法來看,不僅service()方法是由伺服器調用執行,連ServletRequest請求對象和ServletResponse響應對象也是由伺服器提供,如果我們要寫一個簡單的資料給用戶端,就可以在service()方法中操作ServletResponse響應對象:
第一個Servlet程式
package fjdingsd.web;
import java.io.*;
import javax.servlet.*;
public class FirstServlet extends GenericServlet{
public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
{
OutputStream out = res.getOutputStream();
out.write("Hello Servlet".getBytes());
}
}
配置web.xml
這裡就有比較重要的知識點了,<servlet>和<servlet-mapping>中的<servlet-name>必須保持一緻,<servlet>中的<servlet-class>必須有完整包名和類名,而<servlet-mapping>中的<url-pattern>就是我們可以設定的對外通路路徑了,可以自定義路徑。這個路徑的設定可以不寫,則為預設值,那麼浏覽器中的輸入位址隻要有web應用名即可,但是即使設為預設值,在<url-pattern>中,内容也一定要有斜線:“/”。
還有一個問題,如果對于多個Servlet在xml檔案中的對外通路路徑都配置一樣的話,同樣不能通路,如下圖: