┌─────────┐ ┌─────────┐ │░░░░░░░░░│ │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
仍然处于实验推广阶段。
在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()
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.0
est encore en phase de promotion expérimentale. Qu'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
,
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'Servlet
API<.> (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. 🎜Servlet
(par exemple : home.do code>), recherchez l'<strong>instance</strong> du <code>Servlet
. Si l'instance n'existe pas, la création du Servlet
instance se termine par l'appel de la méthode constructeur. 🎜
init()
via l'instance du Servlet
, exécutez le logique d'initialisation. 🎜
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
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!