┌─────────┐ ┌─────────┐ │░░░░░░░░░│ │O ░░░░░░░│ ├─────────┤ ├─────────┤ │░░░░░░░░░│ │ │ ├─────────┤ │ │ │░░░░░░░░░│ └─────────┘ └─────────┘ │ request 1 │ │─────────────────────>│ │ request 2 │ │─────────────────────>│ │ response 1 │ │<─────────────────────│ │ request 3 │ │─────────────────────>│ │ response 3 │ │<─────────────────────│ │ response 2 │ │<─────────────────────│ ▼ ▼
HTTP 프로토콜은 요청-응답 프로토콜이며 항상 요청을 보낸 다음 응답을 받습니다. 한 번에 여러 요청을 보낸 후 여러 응답을 받을 수 있나요? HTTP 2.0
은 브라우저가 동시에 여러 요청을 발행하도록 지원할 수 있지만 각 요청에는 고유 식별자가 필요합니다. 서버는 요청 순서가 아닌 여러 응답을 반환할 수 있습니다. 요청에 응답합니다. HTTP 2.0
은 브라우저가 요청을 보낸 후 다음 요청을 계속 보내기 전에 응답을 기다릴 필요가 없기 때문에 전송 효율성을 더욱 향상시키는 것을 볼 수 있습니다. 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
속도를 더욱 향상시키기 위해 TCP
프로토콜은 폐기되고 HTTP 3.0을 필요로 하지 않는 UDP
프로토콜로 대체됩니다. 현재 HTTP 3.0
은 아직 실험적인 승격 단계에 있습니다. Servlet이란 무엇입니까
JavaEE
플랫폼에서 TCP
연결을 처리하고 HTTP
프로토콜을 구문 분석하는 기본 작업은 모두 기성 웹
서버가 이를 수행하므로 웹
서버에서만 애플리케이션을 실행하면 됩니다. 이러한 목적을 달성하기 위해 JavaEE
는 Servlet
API
를 제공하고, 우리는 Servlet API
를 사용하여 자체 를 작성합니다. code> 서블릿
은 HTTP
요청을 처리하고, 웹
서버는 서블릿
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到了"); } }
Servlet
는 항상 HttpServlet
에서 상속한 다음 doGet()
또는 를 재정의합니다. > doPost()
메소드. doGet()
메서드는 HTTP
요청과 HTTP
요청을 나타내는 HttpServletRequest
및 HttpServletResponse
라는 두 개체를 전달합니다. 각각 . Servlet API
를 사용할 때 기본 TCP
와 직접 상호작용하지 않으며 HTTP
프로토콜을 구문 분석할 필요도 없습니다. HttpServletRequest 및 HttpServletResponse
는 이미 요청과 응답을 캡슐화했습니다. 응답 전송을 예로 들면 올바른 응답 유형을 설정한 다음 PrintWriter
를 가져와 응답을 작성하기만 하면 됩니다. 🎜🎜 이러한 프로젝트는 결국 *.war
파일로 패키징됩니다. 이 파일을 실행하려면 Servlet
API (웹 서버). 🎜🎜그래서 먼저 Servlet API를 지원하는 웹 서버를 찾아야 합니다. 🎜🎜<strong>일반적으로 사용되는 서버는 다음과 같습니다:</strong>🎜<ul class=" list-paddingleft-2">
<li>🎜<strong>Tomcat: Apache에서 개발한 오픈 소스 무료 서버;</strong>🎜 </li>
<li>🎜Jetty: Eclipse에서 개발한 무료 오픈 소스 서버 🎜</li>
<li>🎜GlassFish: 모든 기능을 갖춘 오픈 소스 JavaEE 서버. 🎜</li>
</ul>🎜서블릿의 수명 주기🎜🎜 <code>URL
경로를 통해 Servlet
요청을 시작하는 과정에서 그 본질은 실행을 호출하는 것입니다. Servlet
인스턴스의 doXXX()
메서드. Servlet
인스턴스를 생성하고 사용하는 프로세스를 서블릿 수명 주기라고 합니다. 전체 수명 주기에는 인스턴스화, 초기화, 서비스 및 파기가 포함됩니다. 🎜Servlet
에서 요청한 경로에 따름(예: home.do) code>), <code>Servlet
의 인스턴스를 찾습니다. 인스턴스가 존재하지 않는 경우 생성자 메소드를 호출하여 Servlet
인스턴스 생성이 완료됩니다. 🎜
Servlet
인스턴스를 통해 init()
메서드를 호출하고 초기화 논리. 🎜
Servlet
인스턴스를 통해 service()
메서드를 호출합니다. 하위 클래스가 이 메서드를 재정의하지 않으면 HttpServlet 부모 클래스의 service()
메서드가 호출되고, 요청 메서드가 GET이면 부모 클래스의 메서드에서 판단됩니다. code > 요청인 경우 <code>doGet()
메서드를 호출하고, POST
요청인 경우 doPost()
메서드를 호출합니다. 🎜
doXXX()
메서드를 재정의하는 경우 하위 클래스의 다시 작성된 doXXX()
메서드가 호출됩니다. >doXXX()
메서드, 상위 클래스의 doXXX()
메서드가 호출됩니다. 상위 클래스의 메서드 구현에서 405가 포함된 오류 페이지가 나타납니다.
상태 코드가 반환됩니다. 🎜🎜405 상태 코드: 요청한 방법이 서버에서 지원되지 않음을 나타냅니다. 🎜🎜 4. 파기: 서버가 종료되거나 다시 시작되면 모든 서블릿 인스턴스가 파기되고 서블릿 인스턴스의 destroy()
메서드가 호출됩니다. 🎜🎜🎜🎜rrreee🎜🎜🎜위 내용은 Java에서 서블릿을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!