O núcleo HttpServletRequest e HttpServletResponse da web Java

Prefácio

Passaram-se apenas mais de 20 anos desde que o Java nasceu, e eu tive a sorte de solidificar essa linguagem no estágio inicial de seu desenvolvimento. Porque acredito que conforme o ecossistema Java se torna mais e mais ativo, e as ideias de design do Java são cada vez mais reconhecidas pelo tempo, e há cada vez mais desenvolvedores Java, ele continuará a crescer como uma empresa e a arrancar sangue novo .E inovação e desenvolvimento contínuos até 30, 50 ou até 100 anos.
O Java nasceu para fazer aplicativos em diferentes dispositivos de hardware, como TVs, geladeiras, máquinas de lavar, etc. Portanto, o JVM foi projetado para proteger diferentes sistemas subjacentes. No entanto, ele não se desenvolveu como esperado, mas foi usado por engano. A pessoa que acidentalmente forjou uma conexão profunda com a Internet e, portanto, o título de web Java, porque Java não foi escrito para a web nos primeiros dias, Java é uma escola, e a web é apenas uma discípula de seu desenvolvimento, mas isso é o discípulo da web., Empurrando a arte marcial java para a era próspera.
O crescimento do Java apareceu entre 2000 e 2010. Com o desenvolvimento contínuo da tecnologia da Internet no mundo, o nascimento do Servlet é o produto do Java atendendo ao desenvolvimento da Internet, e também é uma mudança que marcou época e impulsionou o Java para a tecnologia de desenvolvimento da Internet.
Então, o que é um servlet?

A Internet

Antes de entender o Servlet, você precisa entender a rede. Como mencionado acima, o Servlet é um produto que atende ao nascimento da Internet, portanto, há primeiro a Internet e depois o Servlet.
O conceito de rede nasceu no século passado. Com o crescimento contínuo da indústria mundial, os vários componentes do computador foram continuamente atualizados, como CPU, memória, etc., resultando em funções de computador mais poderosas e computação superior eficiência e velocidade. As pessoas apresentaram a ideia de conectar computadores, então como você se conecta?
A comunicação de um computador para outro, as pessoas os dividem de cima para baixo no modelo ISO de sete camadas, o que levou ao desenvolvimento posterior do modelo de rede TCP / IP. Mas este modelo é apenas um esqueleto de comunicação em rede, apenas o esqueleto não tem carne e sangue e não pode ser chamado de corpo completo.
Como resultado, muitos acordos nasceram entre cada camada, ou seja, acordos. Qual formato é usado para transmitir o arquivo, qual formato é usado para transmitir a correspondência, etc. Entre eles está o agora famoso protocolo HTTP, que é usado para interação de páginas da web.

HTTP

Http é um protocolo de transferência de hipertexto, porque pode não apenas transferir texto, mas também transferir fotos, vídeos e outras mídias. Existem conceitos específicos no Baidu, então não vou repeti-los aqui.
O que quero discutir aqui é a conexão entre HTTP e Servlet.
Vejamos primeiro como os computadores se comunicam com computadores baseados em HTTP.
Insira a descrição da imagem aqui
O inglês denso na imagem acima é muito familiar. A mensagem aparece quando você abre a página da Web e pressiona F12, que é a mensagem HTTP, que contém o cabeçalho da solicitação, o corpo da solicitação, o corpo da resposta e assim por diante.
E o Serlet?
Java é uma linguagem de programação, Servlet é naturalmente uma ferramenta para escrever informações e HttpServlet é naturalmente uma ferramenta para escrever informações Http.
Isso é o que mencionei acima, porque Servlet é um produto que atende à Internet.

O núcleo deste artigo é HttpServletRequest e HttpServletResponse.
Como um programador Java, se quiser jogar Java Web, você deve entender o Servlet central da web. E HttpServlet é o núcleo do Servlet, portanto,

HttpServlet é o núcleo do desenvolvimento e crescimento do Java na era atual da Internet.

Conforme mencionado acima, HttpServlet é uma ferramenta para escrever informações Http. Contanto que você conheça os componentes do Http, compreenderá naturalmente os princípios de design do HttpServlet.

Composição Http

Http é um protocolo de solicitação-resposta sem estado e sem conexão, portanto, pode ser dividido em duas partes: solicitação e solicitação de resposta
. A
solicitação contém o cabeçalho da solicitação e o corpo da solicitação. O
cabeçalho da solicitação contém a linha da solicitação, o atributo da solicitação e o linha final. A
linha de solicitação também contém o método de solicitação, URL e
resposta da versão do protocolo . A
resposta contém o cabeçalho da resposta e o corpo da resposta. O
cabeçalho da resposta contém a linha de resposta, os atributos de resposta e a linha final. A
linha de resposta contém o status da resposta código, versão do protocolo, etc.

O diagrama de estrutura de relacionamento específico é o seguinte:
Insira a descrição da imagem aqui

Veja a primeira parte:

(1) solicitação HTTP

(1) Método de
solicitação O cabeçalho da solicitação contém a linha de solicitação e a linha de solicitação contém o método de solicitação.
Os métodos de solicitação comuns são GET / POST / PUT / DELETE e assim por diante. Os métodos mais comumente usados ​​são GET e POST.
Para o método GET, não há corpo da solicitação, porque os parâmetros da solicitação são emendados na URL, portanto, o comprimento será limitado e a exposição será mais óbvia.
Para o método POST, deve haver um corpo de solicitação, pois seus parâmetros são armazenados no corpo de solicitação, de modo que o comprimento não é limitado e a exposição é relativamente segura.
(2) Atributos de
solicitação Os atributos de solicitação comuns são:

Connection: keep-alive                                  # 维护客户端和服务端的连接关系 
Content-Length: 68                                      # 描述HTTP消息实体的传输长度
Accept: application/json, text/javascript, */*; q=0.01          #发送端(客户端)希望接受的数据类型、q 是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容
Origin: http://apptest.zhidianlife.com:8007            # 浏览器在referrer字段中只显示源网站的源地址(即协议、域名、端口),而不包括完整的路径  
Authorization: c81e7286507f4aa4b6179f4c381b4c64          # 请求所需的认证信息
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64)      AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36          # 客户端版本号的名字
Content-Type: application/json                     # 请求实体,文档类型
Referer: http://apptest.zhidianlife.com:8007/procurement/order?_t=756512&_winid=w9290         #  从来于哪里
Accept-Encoding: gzip, deflate                        # 客户端接收编码类型,一些网络压缩格式: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9                      # 客户端接收的语言类型 、中文

(3) Marcador final Na
figura acima, o mais facilmente esquecido é o CRLF no final - a marca final. Geralmente, ao simular o protocolo Http com Java, o identificador \ r \ n deve ser adicionado ao final, o que significa o final desta informação da unidade.

(Dois), resposta HTTP

(1) Código de status de
resposta O cabeçalho de resposta contém a versão do protocolo HTTP, código de status de resposta e assim por diante.
Existem cinco categorias de códigos de status de resposta, com códigos de status começando com 1, começando com 2, começando com 3, começando com 4 e começando com 5.
1XX ...
2XX ...
3XX ...
4XX ...
5XX ...
(2) Corpo da
resposta O corpo da resposta é o código-fonte da página da web, e o navegador do cliente analisará e renderizará o código-fonte da página em uma página de operação dinâmica.
(3) Marcador
final O marcador final está em conformidade com o identificador final acima.

HttpServlet

HttpServlet é desenvolvido para Http. Depois de entender a composição do Http, você pode entender aproximadamente seu mecanismo. A situação específica é discutida em profundidade no código-fonte para ver o que o HttpServlet faz.

public abstract class HttpServlet extends GenericServlet {
# 这一部分定义了各种请求方法的标识符
private static final long serialVersionUID = 1L;
private static final String METHOD_DELETE = "DELETE";
private static final String METHOD_HEAD = "HEAD";
private static final String METHOD_GET = "GET";
...

# 这一部分定义了各种请求方法的具体实现 	
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	....省略
}
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	....省略
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	....省略
}
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	....省略
}
...

#最重要的service方法
 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String method = req.getMethod();
    long lastModified;
    
    # 如果是get请求,则转到get方法中..下同
    if (method.equals("GET")) {
        lastModified = this.getLastModified(req);
        if (lastModified == -1L) {
            this.doGet(req, resp);
        } else {
            long ifModifiedSince;
            try {
                ifModifiedSince = req.getDateHeader("If-Modified-Since");
            } catch (IllegalArgumentException var9) {
                ifModifiedSince = -1L;
            }

            if (ifModifiedSince < lastModified / 1000L * 1000L) {
                this.maybeSetLastModified(resp, lastModified);
                this.doGet(req, resp);
            } else {
                resp.setStatus(304);
            }
        }
    } else if (method.equals("HEAD")) {
        lastModified = this.getLastModified(req);
        this.maybeSetLastModified(resp, lastModified);
        this.doHead(req, resp);
    } else if (method.equals("POST")) {
        this.doPost(req, resp);
    } 
    ....
}
}

O início da web java é implementar o método de serviço personalizando Servlet e herdando HttpServlet. O método de serviço do Servlet personalizado passado será chamado quando for chamado da camada superior.
Há duas questões aqui:
(1) Se um servlet customizado deve herdar HttpServlet antes que seu método de serviço possa ser chamado com sucesso.
(2) Se o Servlet personalizado pode implementar diretamente a interface do Servlet para atingir o propósito de solicitar acesso.
Adivinha: A
camada superior chama o método de serviço de HttpServlet.Contanto que você passe HttpServlet ou suas subclasses, você pode chamar com sucesso o método de serviço do objeto passado.

上层调用方法猜想:
?   ?   ?method(HttpServlet  httpServlet){
	httpServlet.service(httpServletRequest , httpServletResponse);
}

Por meio de experimentos e verificação, descobriu-se que
, desde que o MyServlet personalizado implemente o Servlet, o método de serviço do MyServlet personalizado pode ser invocado com êxito.
Isso mostra que a camada superior chama o método de serviço da interface Servlet em vez do método de serviço do HttpServlet.
Qual é a diferença entre Servlet e HttpServlet?
Insira a descrição da imagem aqui
HttpServlet é uma subclasse de Servlet. Além de Servlet, ele também implementa mais funções e personaliza vários métodos de solicitação e métodos de processamento do protocolo HTTP. Ele herda funções de Servlet e estende métodos de processamento relacionados a HTTP. Classe. É uma classe abstrata, mas não possui métodos abstratos, o que mostra que não é obrigatório que as subclasses implementem qualquer um de seus métodos.
Como você pode ver no código-fonte do serviço do HttpServlet acima, o serviço faz um roteamento e encaminhamento, que é encaminhado para diferentes métodos de implementação específicos de acordo com diferentes métodos de solicitação. A camada superior injeta dois objetos no método de serviço quando é chamado:
HttpServletRequest e HttpServletResponse.
(1) O que são e de onde vêm?
(2) Quais são seus métodos internos e o que eles podem fazer.

Onde fica o nível superior?

O servlet é controlado pela camada superior e o método de serviço também é chamado pela camada superior. Então, onde está o nível superior e o que é?
Aqui, para apresentar um contêiner da web, o que é um contêiner da web? Literalmente, é um contêiner que contém um programa da web, e um programa da web pode ser claramente entendido como um Servlet. Portanto, o contêiner da web também pode ser entendido como um contêiner para a Serlvet.
Insira a descrição da imagem aqui
Contêiner da Web é um termo geral para aplicativos, que inclui especificamente middleware como Tomcat e JBoss.

HttpServletRequest

Qual é a relação entre o contêiner da web e este objeto?
HttpServletRequest é um objeto de solicitação. O contêiner da Web é responsável por analisar as informações HTTP recebidas para gerar um objeto HttpServletRequest, portanto, esse objeto é na verdade um encapsulamento de informações de solicitação de protocolo HTTP.
Contém vários parâmetros do cabeçalho da solicitação, parâmetros do corpo da solicitação, versão do protocolo, endereço da solicitação, carimbo de data / hora, cookie, sessão, etc.
Especificamente, a cadeia de chamada pode ser rastreada. As informações do objeto HttpServletRequest vêm da interface de nível superior ServletRequest, e as informações que podem ser chamadas por esta interface são as informações encapsuladas:

public interface ServletRequest {

Object getAttribute(String var1);  // 某个属性

Enumeration<String> getAttributeNames(); // 属性集合

String getCharacterEncoding(); // 编码方式

void setCharacterEncoding(String var1) throws UnsupportedEncodingException;

int getContentLength();  // 请求体长度

long getContentLengthLong();

String getContentType(); // 请求体内容形式

ServletInputStream getInputStream() throws IOException;

String getParameter(String var1);  // 请求体参数

Enumeration<String> getParameterNames(); // 请求体参数集合

String[] getParameterValues(String var1); // 请求体中的value值

Map<String, String[]> getParameterMap();  // 请求体中的value值集合

String getProtocol(); // 协议

String getScheme();

String getServerName(); 

int getServerPort(); // 端口

BufferedReader getReader() throws IOException;

String getRemoteAddr(); 

String getRemoteHost(); // 请求主机

void setAttribute(String var1, Object var2);

void removeAttribute(String var1);

Locale getLocale();

Enumeration<Locale> getLocales();

boolean isSecure();

RequestDispatcher getRequestDispatcher(String var1);

/** @deprecated */
@Deprecated
String getRealPath(String var1);

int getRemotePort();

String getLocalName();

String getLocalAddr();

int getLocalPort();

ServletContext getServletContext();

AsyncContext startAsync() throws IllegalStateException;

AsyncContext startAsync(ServletRequest var1, ServletResponse var2) throws IllegalStateException;

boolean isAsyncStarted();

boolean isAsyncSupported();

AsyncContext getAsyncContext();

DispatcherType getDispatcherType();
}

HttpServletResponse

Este objeto é o mesmo, é um encapsulamento de informações de resposta HTTP.
Especificamente, ele pode ser rastreado até o objeto ServletResponse:

public interface ServletResponse {
String getCharacterEncoding();

String getContentType();

ServletOutputStream getOutputStream() throws IOException;

PrintWriter getWriter() throws IOException;

void setCharacterEncoding(String var1);  // 设置编码方式

void setContentLength(int var1);

void setContentLengthLong(long var1);

void setContentType(String var1);

void setBufferSize(int var1);

int getBufferSize();

void flushBuffer() throws IOException;

void resetBuffer();

boolean isCommitted();

void reset();

void setLocale(Locale var1);

Locale getLocale();
}

Todo o processo interativo

Como pode ser visto acima, uma solicitação de página da web para processo de resposta.
Insira a descrição da imagem aqui

O cliente geralmente usa um navegador para acessar. Quando o usuário usa o navegador para enviar uma mensagem ao servidor,

  1. O navegador enviará a solicitação do cliente ao servidor na forma de protocolo HTTP
  2. O contêiner da web encapsula o protocolo HTTP nos objetos HttpServletRequest e HttpServletResponse, a web encontra o serviço Servlet correspondente e passa os dois objetos HttpServletRequest e HttpServletResponse para ele.
  3. Depois que o programa de serviço executa cálculos de processamento e interação com o banco de dados nesses dois objetos, ele retorna esses dois objetos para o contêiner da web.
  4. O contêiner da web analisa os dados dos dois objetos e os envia ao navegador do cliente na forma de protocolo Http.

Finalmente, após o navegador receber as informações, todo o processo de análise de acordo com o protocolo HTTP é concluído.

O que os programadores podem fazer

Para este conjunto de processos, os programadores geralmente escrevem serviços Servlet, como escrever Java Web para processar objetos HttpServletRequest e HttpServletResponse. A web Java evoluiu do antigo servlet + JSP e do SSM de hoje, da arquitetura monolítica aos microsserviços, como Springboot + Spring cloud. Um sistema complexo também pode incluir middleware de mensagens (como RabbitMQ), middleware de cache (como Redis), middleware de balanceamento de carga (como Nginx) e assim por diante.
Todo esse sistema pertence ao serviço Servlet, e os objetos que o sistema precisa processar são HttpServletRequest e HttpServletResponse. Esses dois objetos são objetos de mensagem. O que o programa precisa resolver é o processamento correto de mensagens, alta simultaneidade ao processar solicitações e alta disponibilidade sob exceções do sistema.

O que foi dito acima é apenas um entendimento pessoal. Se houver algo impróprio, por favor, ajude os deuses que passam.

Acho que você gosta

Origin blog.csdn.net/weixin_43901067/article/details/106295855
Recomendado
Clasificación