這篇文章主要為大家詳細介紹了servlet基礎的相關資料,具有一定的參考價值,有興趣的朋友們可以參考一下
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(ServletTequest req , ServletResponse res)方法來看,不僅service()方法是由伺服器呼叫執行,連ServletTequest請求物件和ServletResponse回應物件也是由伺服器提供,如果我們要寫一個簡單的資料給客戶端,就可以在service()方法中操作ServletResponse回應物件:
作為入門,那麼我們先不用開發工具IDE來寫Servlet,而是先手動寫,這樣有助於理解Servlet的底層原理。在Tomcat的【webapps】目錄下建立我的web應用,web應用程式所在目錄為【myservlet】,我們先在【myservlet】目錄下建立【WEB-INF】,並且再在【WEB-INF】中建立【classes 】目錄,【lib目錄】和web.xml文件,在【classes】目錄中,建立我的Java程式:FirstServlet.java
因為自己寫的Servlet是由伺服器調用,因此我們所創建的Servlet實作類別一定要是公共的,開始說了,我們沒必要實作Servlet的全部方法,因此我們向客戶端傳資料只需要複寫service()方法即可,那麼我們只需要繼承Servlet的實作類,接著取得對應物件ServletResponse的輸出流ServletOutputStream就可以輸出資料到客戶端了,同時因為輸出是位元組流,所以需要將字元轉換成位元組數組,然後手動寫入自訂包名和要導入的Java包:
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()); } }
使用cmd對這個Java程序進行編譯,但要注意,「javac」這個只是預設導入了J2SE的包,而沒有J2EE的包。那我們要去哪裡找J2EE的Servlet包呢?其實,因為Tomcat支援Servlet所以Tomcat的【lib】目錄包含了Servlet的JAR套件:
所以我們在cmd中應該先進行這一步驟設定環境變數:set classpath = %classpath% ; 路徑/servlet-api.jar
#接著就可以對剛才的Java程式進行編譯了:javac –d .程式名稱.java
(「-d」代表後面一個指令為.class檔案存放目錄,「.」代表目前目錄)
#編譯成功後可以再看web應用程式所在目錄中已經有了字節碼檔案和套件名稱了:
當然,現在已經有了Servlet的程序,但是瀏覽器還不能來訪問,因為這個Servlet程式還沒設定對外訪問路徑。那麼從哪裡將我們剛剛建立好的Servlet字節碼檔案配置成瀏覽器能存取到的路徑呢?
答案就是在這個web應用程式中的web.xml檔案中,現在我們只取最簡潔的格式,如《Tomcat詳細學習方法(三)》所說,將Tomcat的web.xml這個「模板」中的頭和尾複製進自己的web.xml文件中,還要複製一些,見下圖:
這裡就有比較重要的知識點了,46309ed845064fdb06e746051efff9e0和870ae7edaa11700bcea972d006efb06e中的700b5f17c4d842e4bd410f680f40946b必須保持一致,46309ed845064fdb06e746051efff9e0中的b472d9135dbff3dd7fcc77f5995c97d0必須有完整包名和類名,而98ef0e83228757772f14659c35994c1c中的66e1775cbd9d5002635ae3285442ba88就是我們可以設定的對外存取路徑了,可以自訂路徑。這個路徑的設定可以不寫,則為預設值,那麼瀏覽器中的輸入位址只要有web應用名稱即可,但是即使設為預設值,在66e1775cbd9d5002635ae3285442ba88中,內容也一定要有斜線:“/”。
這時候,將Tomcat伺服器開啟,就能在瀏覽器中存取剛才寫好的Servlet程式了,輸入的格式為:主機名稱:連接埠(80不需要)/web應用名稱/對外訪問路徑
如果是對於Servlet的訪問,那麼只需要寫到對外訪問路徑即可,如果寫了Servlet的名稱也是無法訪問的,如下圖:
還有一個問題,如果對於多個Servlet在xml文件中的對外訪問路徑都配置一樣的話,同樣不能訪問,如下圖:
因此,不同的Servlet請在自訂web.xml中設定不同的對外存取路徑。
以上是Java中servlet基礎知識的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!