您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Java中的Servlet怎么實現”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java中的Servlet怎么實現”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
┌─────────┐ ┌─────────┐ │?????????│ │O ???????│ ├─────────┤ ├─────────┤ │?????????│ │ │ ├─────────┤ │ │ │?????????│ └─────────┘ └─────────┘ │ request 1 │ │─────────────────────>│ │ request 2 │ │─────────────────────>│ │ response 1 │ │<─────────────────────│ │ request 3 │ │─────────────────────>│ │ response 3 │ │<─────────────────────│ │ response 2 │ │<─────────────────────│ ▼ ▼
我們注意到HTTP協議是一個請求-響應協議,它總是發送一個請求,然后接收一個響應。能不能一次性發送多個請求,然后再接收多個響應呢?HTTP 2.0
可以支持瀏覽器同時發出多個請求,但每個請求需要唯一標識,服務器可以不按請求的順序返回多個響應,由瀏覽器自己把收到的響應和請求對應起來。可見,HTTP 2.0
進一步提高了傳輸效率,因為瀏覽器發出一個請求后,不必等待響應,就可以繼續發下一個請求。
HTTP 3.0
為了進一步提高速度,將拋棄TCP
協議,改為使用無需創建連接的UDP
協議,目前HTTP 3.0
仍然處于實驗推廣階段。
在JavaEE
平臺上,處理TCP
連接,解析HTTP
協議這些底層工作統統扔給現成的Web
服務器去做,我們只需要把自己的應用程序跑在Web
服務器上。為了實現這一目的,JavaEE
提供了Servlet
API
,我們使用Servlet API
編寫自己的Servlet
來處理HTTP
請求,Web
服務器實現Servlet
API
接口,
實現底層功能.
// WebServlet注解表示這是一個Servlet,并映射到地址 hello.do @WebServlet(urlPatterns = "/hello.do") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 設置響應類型: resp.setContentType("text/html"); // 獲取輸出流: PrintWriter pw = resp.getWriter(); // 寫入響應: pw.write("<h2>Hello, world!</h2>"); // 最后不要忘記flush強制輸出: pw.flush(); } }
一個Servlet
總是繼承自HttpServlet
,然后覆寫doGet()
或doPost()
方法。注意到doGet()
方法傳入了HttpServletRequest
和HttpServletResponse
兩個對象,分別代表HTTP
請求和響應。我們使用Servlet API
時,并不直接與底層TCP
交互,也不需要解析HTTP
協議,因為HttpServletRequest
和HttpServletResponse
就已經封裝好了請求和響應。以發送響應為例,我們只需要設置正確的響應類型,然后獲取PrintWriter
,寫入響應即可。
而這樣的一個項目最終會打包成一個*.war
文件,運行這個文件,需要使用支持Servlet
API
的Web容器(Web服務器)。
因此,我們首先要找一個支持Servlet API的Web服務器。
常用的服務器有:
Tomcat:由Apache開發的開源免費服務器;
Jetty:由Eclipse開發的開源免費服務器;
GlassFish:一個開源的全功能JavaEE服務器。
在通過一個URL
路徑發起對一個Servlet
請求的過程中,其本質是在調用執行Servlet
實例的doXXX()
方法。該Servlet
實例創建和使用的過程,被稱為Servlet的生命周期。整個生命周期包括:實例化、初始化、服務、銷毀。
實例化:根據Servlet
請求的路徑(例如:home.do
),查找該Servlet
的實例。如果實例不存在,則通過調用構造方法,完成Servlet
實例的創建。
初始化:通過該Servlet
的實例,調用init()
方法,執行初始化的邏輯。
服務:通過該Servlet
的實例,調用service()
方法,如果子類沒有重寫該方法,則調用HttpServlet父類的service()
方法,在父類的該方法中進行請求方式的判斷,如果是GET
請求,則調用doGet()
方法;如果是POST
請求,則調用doPost()
方法;
如果子類重寫doXXX()
方法,則調用子類重寫后的doXXX()
方法;
如果子類沒有重寫doXXX()
方法,則調用父類的doXXX()
方法,在父類的方法實現中,返回一個405
狀態碼的錯誤頁面。
405狀態碼:代表請求的方式服務器不提供支持。
4.銷毀:服務器關閉或重啟時,會銷毀所有的Servlet實例,會調用Servlet實例的destroy()
方法。
package com.my.hyz.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //@WebServlet("/home.do") public class HomeServlet extends HttpServlet { public HomeServlet() { System.out.println("實例化"); } @Override public void init() throws ServletException { System.out.println("初始化"); //super.init(); } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("調用Service實例"); } @Override public void destroy() { System.out.println("銷毀咯!!!!"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("哎呦get到了"+this.hashCode()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("哎呦post到了"); } }
讀到這里,這篇“Java中的Servlet怎么實現”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。