首頁  >  文章  >  Java  >  Java中的Servlet怎麼實現

Java中的Servlet怎麼實現

PHPz
PHPz轉載
2023-05-17 11:34:50823瀏覽

Web基礎和HTTP協定

                       ┌─────────┐
┌─────────┐            │░░░░░░░░░│
│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仍處於實驗推廣階段。

什麼是Servlet

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()方法傳入了HttpServletRequestHttpServletResponse兩個對象,分別代表HTTP請求和回應。我們使用Servlet API時,不會直接與底層TCP交互,也不需要解析HTTP協議,因為HttpServletRequest

HttpServletResponse

就已經封裝好了請求和回應。以傳送回應為例,我們只需要設定正確的回應類型,然後取得PrintWriter,寫入回應即可。

    而這樣的一個專案最終會打包成一個
  • *.war

    文件,運行這個文件,需要使用支援Servlet

    API
  • 的Web容器(Web伺服器)。
  • 因此,我們首先要找到一個支援Servlet API的Web伺服器。

  • 常用的伺服器有:

#Tomcat:由Apache開發的開源免費伺服器;

Jetty:由Eclipse開發的開源免費伺服器;#GlassFish:一個開源的全功能JavaEE伺服器。

    Servlet的生命週期
  • 在透過一個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()

方法,在父類別的方法實作中,傳回一個

405Java中的Servlet怎麼實現狀態碼的錯誤頁面。

Java中的Servlet怎麼實現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怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除