>  기사  >  Java  >  Java에서 서블릿을 구현하는 방법

Java에서 서블릿을 구현하는 방법

PHPz
PHPz앞으로
2023-05-17 11:34:50823검색

웹 기본 사항 및 HTTP 프로토콜

                       ┌─────────┐
┌─────────┐            │░░░░░░░░░│
│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仍然处于实验推广阶段。

什么是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 속도를 더욱 향상시키기 위해 TCP 프로토콜은 폐기되고 HTTP 3.0을 필요로 하지 않는 UDP 프로토콜로 대체됩니다. 현재 HTTP 3.0은 아직 실험적인 승격 단계에 있습니다.

Java에서 서블릿을 구현하는 방법Servlet이란 무엇입니까

JavaEE 플랫폼에서 TCP 연결을 처리하고 HTTP 프로토콜을 구문 분석하는 기본 작업은 모두 기성 서버가 이를 수행하므로 서버에서만 애플리케이션을 실행하면 됩니다. 이러한 목적을 달성하기 위해 JavaEEServletAPI를 제공하고, 우리는 Servlet API를 사용하여 자체 를 작성합니다. code> 서블릿HTTP 요청을 처리하고, 서버는 서블릿 API 인터페이스를 구현합니다. 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到了");
	}
}
🎜A Servlet는 항상 HttpServlet에서 상속한 다음 doGet() 또는 를 재정의합니다. > doPost() 메소드. doGet() 메서드는 HTTP 요청과 HTTP 요청을 나타내는 HttpServletRequestHttpServletResponse라는 두 개체를 전달합니다. 각각 . Servlet API를 사용할 때 기본 TCP와 직접 상호작용하지 않으며 HTTP 프로토콜을 구문 분석할 필요도 없습니다. HttpServletRequest 및 HttpServletResponse는 이미 요청과 응답을 캡슐화했습니다. 응답 전송을 예로 들면 올바른 응답 유형을 설정한 다음 PrintWriter를 가져와 응답을 작성하기만 하면 됩니다. 🎜🎜 이러한 프로젝트는 결국 *.war 파일로 패키징됩니다. 이 파일을 실행하려면 ServletAPI (웹 서버). 🎜🎜그래서 먼저 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() 메서드를 호출합니다. 🎜
  • ul>🎜하위 클래스가 doXXX() 메서드를 재정의하는 경우 하위 클래스의 다시 작성된 doXXX() 메서드가 호출됩니다. >doXXX() 메서드, 상위 클래스의 doXXX() 메서드가 호출됩니다. 상위 클래스의 메서드 구현에서 405가 포함된 오류 페이지가 나타납니다. 상태 코드가 반환됩니다. 🎜🎜405 상태 코드: 요청한 방법이 서버에서 지원되지 않음을 나타냅니다. 🎜🎜 4. 파기: 서버가 종료되거나 다시 시작되면 모든 서블릿 인스턴스가 파기되고 서블릿 인스턴스의 destroy() 메서드가 호출됩니다. 🎜🎜🎜🎜rrreee🎜🎜🎜

위 내용은 Java에서 서블릿을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제