Maison  >  Article  >  Java  >  Comment implémenter un servlet en Java

Comment implémenter un servlet en Java

PHPz
PHPzavant
2023-05-17 11:34:50873parcourir

Bases du Web et protocole HTTP

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

Nous avons remarqué que le protocole HTTP est un protocole requête-réponse, il envoie toujours une requête puis reçoit une réponse. Puis-je envoyer plusieurs demandes à la fois et recevoir ensuite plusieurs réponses ? HTTP 2.0 peut permettre au navigateur d'émettre plusieurs requêtes en même temps, mais chaque requête nécessite un identifiant unique. Le serveur peut renvoyer plusieurs réponses dans l'ordre des requêtes. Le navigateur lui-même combine les requêtes reçues. réponses avec les demandes. On peut voir que HTTP 2.0 améliore encore l'efficacité de la transmission, car une fois que le navigateur a envoyé une requête, il n'a pas besoin d'attendre une réponse avant de pouvoir continuer à envoyer la requête suivante. 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 Afin d'améliorer encore la vitesse, le protocole TCP sera abandonné et remplacé par le protocole UDP qui ne nécessite pas le création d'une connexion Actuellement, HTTP 3.0est encore en phase de promotion expérimentale.

Comment implémenter un servlet en JavaQu'est-ce que Servlet

Sur la plateforme JavaEE, le travail sous-jacent de traitement des connexions TCP et d'analyse du protocole HTTP est entièrement laissé au le serveur Web prêt à l'emploi le fait, il nous suffit d'exécuter notre application sur le serveur Web. Afin d'atteindre cet objectif, JavaEE fournit un Servlet API, et nous utilisons l'Servlet API pour écrire notre propre Servlet pour gérer les requêtes HTTP, le serveur Web implémente l'interface Servlet API, Comment implémenter un servlet en Java

Implémentez les fonctions sous-jacentes.🎜
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到了");
	}
}
🎜Un Servlet hérite toujours de HttpServlet, puis remplace doGet() ou méthode doPost(). Notez que la méthode doGet() transmet deux objets, HttpServletRequest et HttpServletResponse, qui représentent la requête HTTP et réponse respectivement. Lorsque nous utilisons l'API Servlet, nous n'interagissons pas directement avec le TCP sous-jacent, et nous n'avons pas non plus besoin d'analyser le protocole HTTP car HttpServletRequest et HttpServletResponse ont déjà encapsulé la requête et la réponse. En prenant l'exemple de l'envoi d'une réponse, il nous suffit de définir le type de réponse correct, puis d'obtenir PrintWriter et d'écrire la réponse. 🎜🎜 Un tel projet sera éventuellement intégré dans un fichier *.war Pour exécuter ce fichier, vous devez utiliser un conteneur Web prenant en charge l'ServletAPI<.> (serveur Web). 🎜🎜Donc, nous devons d'abord trouver un serveur Web prenant en charge l'API Servlet. 🎜🎜<strong>Les serveurs couramment utilisés sont :</strong>🎜<ul class=" list-paddingleft-2"> <li>🎜<strong>Tomcat : un serveur open source gratuit développé par Apache ;</strong>🎜 </li> <li>🎜Jetty : un serveur open source gratuit développé par Eclipse ; 🎜</li> <li>🎜GlassFish : un serveur JavaEE open source complet. 🎜</li> </ul>🎜Le cycle de vie du Servlet🎜🎜Dans le processus d'initiation d'une requête <code>Servlet via un chemin URL, son essence est d'appeler l'exécution La méthode doXXX() de l'instance Servlet. Le processus de création et d'utilisation de l'instance Servlet est appelé cycle de vie du servlet. L'ensemble du cycle de vie comprend : l'instanciation, l'initialisation, le service et la destruction. 🎜
  • 🎜Instanciation : Selon le chemin demandé par Servlet (par exemple : home.do code>), recherchez l'<strong>instance</strong> du <code>Servlet. Si l'instance n'existe pas, la création du Servletinstance se termine par l'appel de la méthode constructeur. 🎜
  • 🎜Initialisation : Appelez la méthode init() via l'instance du Servlet , exécutez le logique d'initialisation. 🎜
  • 🎜Service : Appelez la méthode service() via l'instance du Servlet , si le La sous-classe ne remplace pas cette méthode, la méthode service() de la classe parent HttpServlet est appelée et la méthode de requête est jugée dans la méthode de la classe parent si c'est GET
code > request, appelez la méthode doGet() ; s'il s'agit d'une requête POST, appelez la méthode doPost() 🎜 ; > ul>🎜Si la sous-classe remplace la méthode doXXX(), la méthode doXXX() réécrite de la sous-classe sera appelée ; 🎜🎜Si la sous-classe ne remplace pas la méthode ; Méthode >doXXX(), la méthode doXXX() de la classe parent est appelée Dans l'implémentation de la méthode de la classe parent, une page d'erreur avec un 405. Le code d'état est renvoyé. 🎜🎜Code d'état 405 : Indique que la méthode demandée n'est pas supportée par le serveur. 🎜🎜 4. Destruction : Lorsque le serveur est arrêté ou redémarré, toutes les instances de Servlet seront détruites et la méthode destroy() de l'instance de Servlet sera appelée. 🎜🎜🎜🎜rrreee🎜🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer