Heim  >  Artikel  >  Java  >  So implementieren Sie Servlet in Java

So implementieren Sie Servlet in Java

PHPz
PHPznach vorne
2023-05-17 11:34:50875Durchsuche

Web-Grundlagen und HTTP-Protokoll

                       ┌─────────┐
┌─────────┐            │░░░░░░░░░│
│O ░░░░░░░│            ├─────────┤
├─────────┤            │░░░░░░░░░│
│         │            ├─────────┤
│         │            │░░░░░░░░░│
└─────────┘            └─────────┘
     │      request 1       │
     │─────────────────────>│
     │      request 2       │
     │─────────────────────>│
     │      response 1      │
     │<─────────────────────│
     │      request 3       │
     │─────────────────────>│
     │      response 3      │
     │<─────────────────────│
     │      response 2      │
     │<─────────────────────│
     ▼                      ▼

Uns ist aufgefallen, dass das HTTP-Protokoll ein Request-Response-Protokoll ist, es sendet immer eine Anfrage und empfängt dann eine Antwort. Kann ich mehrere Anfragen gleichzeitig senden und dann mehrere Antworten erhalten? HTTP 2.0 kann den Browser dabei unterstützen, mehrere Anfragen gleichzeitig zu senden, aber jede Anfrage benötigt eine eindeutige Kennung. Der Server kann mehrere Antworten zurückgeben, die nicht in der Reihenfolge der empfangenen Anfragen liegen Antworten mit den Anfragen korrespondieren. Es ist ersichtlich, dass HTTP 2.0 die Übertragungseffizienz weiter verbessert, da der Browser nach dem Senden einer Anfrage nicht auf eine Antwort warten muss, bevor er mit dem Senden der nächsten Anfrage fortfahren kann. 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协议,因为HttpServletRequestHttpServletResponse就已经封装好了请求和响应。以发送响应为例,我们只需要设置正确的响应类型,然后获取PrintWriter,写入响应即可。

而这样的一个项目最终会打包成一个*.war文件,运行这个文件,需要使用支持ServletAPI的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()方法,在父类的方法实现中,返回一个405状态码的错误页面。

405状态码:代表请求的方式服务器不提供支持。

 4.销毁:服务器关闭或重启时,会销毁所有的Servlet实例,会调用Servlet实例的destroy()

HTTP 3.0 Um die Geschwindigkeit weiter zu verbessern, wird das TCP-Protokoll aufgegeben und durch das UDP-Protokoll ersetzt, das das nicht erfordert Derzeit befindet sich HTTP 3.0 noch in der experimentellen Promotion-Phase.

So implementieren Sie Servlet in JavaWas ist Servlet? Auf der JavaEE-Plattform wird die zugrunde liegende Arbeit der Verarbeitung von TCP-Verbindungen und der Analyse des HTTP-Protokolls vollständig übernommen Ein vorgefertigter Web-Server erledigt dies, wir müssen unsere Anwendung nur auf dem Web-Server ausführen. Um diesen Zweck zu erreichen, stellt JavaEE die Servlet API bereit, und wir verwenden die Servlet API, um unsere eigene Servlet zur Verarbeitung von HTTP-Anfragen, Web-Server implementiert die ServletAPI-Schnittstelle,

Implementieren Sie zugrunde liegende Funktionen.So implementieren Sie Servlet in Java

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到了");
	}
}

Ein Servlet erbt immer von HttpServlet und überschreibt dann doGet() oder doPost()-Methode. Beachten Sie, dass die Methode doGet() zwei Objekte übergibt: HttpServletRequest und HttpServletResponse, die die HTTP-Anfrage darstellen Antwort bzw. Wenn wir die Servlet-API verwenden, interagieren wir nicht direkt mit dem zugrunde liegenden TCP und müssen auch nicht das HTTP-Protokoll analysieren, weil HttpServletRequest und HttpServletResponse haben die Anfrage und Antwort bereits gekapselt. Am Beispiel des Sendens einer Antwort müssen wir nur den richtigen Antworttyp festlegen, dann PrintWriter abrufen und die Antwort schreiben. 🎜🎜 Ein solches Projekt wird schließlich in eine *.war-Datei gepackt. Um diese Datei auszuführen, müssen Sie einen Webcontainer verwenden, der ServletAPI (Webserver). 🎜🎜Also müssen wir zunächst einen Webserver finden, der die Servlet-API unterstützt. 🎜🎜<strong>Häufig verwendete Server sind:</strong>🎜<ul class=" list-paddingleft-2"> <li>🎜<strong>Tomcat: ein kostenloser Open-Source-Server, der von Apache entwickelt wurde;</strong>🎜 </li> <li>🎜Jetty: ein von Eclipse entwickelter Open-Source-Server. 🎜</li> <li>🎜GlassFish: ein Open-Source-JavaEE-Server mit vollem Funktionsumfang. 🎜</li> </ul>🎜Der Lebenszyklus von Servlet🎜🎜Beim Initiieren einer <code>Servlet-Anfrage über einen URL-Pfad besteht das Wesentliche darin, die Ausführung aufzurufen Die doXXX()-Methode der Servlet-Instanz. Der Prozess der Erstellung und Verwendung der Servlet-Instanz wird als Servlet-Lebenszyklus bezeichnet. Der gesamte Lebenszyklus umfasst: Instanziierung, Initialisierung, Service und Zerstörung. 🎜
  • 🎜Instantiierung: Entsprechend dem von Servlet angeforderten Pfad (zum Beispiel: home.do code>), finden Sie die <strong>Instanz</strong> des <code>Servlets. Wenn die Instanz nicht vorhanden ist, wird die Erstellung der ServletInstanz durch Aufrufen der Konstruktormethode abgeschlossen. 🎜
  • 🎜Initialisierung: Rufen Sie die init()-Methode über die Instanz des Servlet auf und führen Sie sie aus Initialisierungslogik. 🎜
  • 🎜Service: Rufen Sie die service()-Methode über die Instanz des Servlet auf, wenn dies der Fall ist Die Unterklasse überschreibt diese Methode nicht, die Methode service() der übergeordneten Klasse HttpServlet wird aufgerufen und die Anforderungsmethode wird in der Methode der übergeordneten Klasse beurteilt. code > Anfrage, rufen Sie die doGet()-Methode auf; wenn es sich um eine POST-Anfrage handelt, rufen Sie die doPost()-Methode auf 🎜
  • ul>🎜Wenn die Unterklasse die Methode doXXX() überschreibt, wird die umgeschriebene Methode doXXX() der Unterklasse aufgerufen. 🎜🎜Wenn die Unterklasse die Methode >doXXX()
-Methode wird die doXXX()-Methode der übergeordneten Klasse aufgerufen. In der Methodenimplementierung der übergeordneten Klasse wird eine Fehlerseite mit einem 405 Statuscode wird zurückgegeben. 🎜🎜<strong>Statuscode 405:</strong> Zeigt an, dass die angeforderte Methode vom Server nicht unterstützt wird. 🎜🎜 4<strong>Zerstörung</strong>: Wenn der Server heruntergefahren oder neu gestartet wird, werden alle Servlet-Instanzen zerstört und die Methode <code>destroy() der Servlet-Instanz aufgerufen. 🎜🎜🎜🎜rrreee🎜🎜🎜

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Servlet in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen