JavaRush /Blogue Java /Random-PT /Parte 5. Servlets, API de servlet Java. Escrevendo um apl...

Parte 5. Servlets, API de servlet Java. Escrevendo um aplicativo web simples

Publicado no grupo Random-PT
Este material faz parte da série “Introdução ao Desenvolvimento Empresarial”. Artigos anteriores: Parte 5. Servlets, API de servlet Java.  Escrevendo uma aplicação web simples - 1Você já sabe como escrever aplicativos Java que enviam texto para o console, mas ainda não sabe realmente como criar seu primeiro aplicativo web? Ótimo, fique à vontade. Neste artigo, conheceremos servlets e escreveremos um aplicativo que você pode exibir para seus amigos sem enviar um jarnik ou forçá-los a baixar Java. Vamos escrever uma aplicação web . Se você ainda não está familiarizado com as abordagens utilizadas na programação web, aconselho que comece a ler a partir do primeiro artigo da série “ Introdução ao Desenvolvimento Empresarial ”.

O que é um servlet

Primeiro, vamos descobrir o que é um servlet e por que você ouve falar dele com tanta frequência. Java Servlet API é uma API padronizada projetada para implementação no servidor e trabalho com o cliente usando um esquema de solicitação-resposta. Um servlet é uma classe que pode receber solicitações de um cliente e retornar respostas a ele. Sim, os servlets em Java são precisamente os elementos com os quais a arquitetura cliente-servidor é construída. Se você lembra, já falamos sobre isso em uma das matérias da série. Não vamos fazer rodeios: vamos escrever algum código imediatamente.

O que você precisa para criar um aplicativo web

Para trabalhar confortavelmente com servlets em Java, você precisará do Intellij IDEA Ultimate Edition. É pago, mas você pode ativar um período de teste de 30 dias ou usar a versão de acesso antecipado – é sempre gratuito. Instale também nosso servidor de aplicativos - Apache Tomcat. Tomcat é um contêiner de servlet: é aquele que processa solicitações externas e as repassa para nossa aplicação. Você pode baixar o Tomcat neste link .

Criando a primeira aplicação web

Se tudo estiver pronto, vamos criar um projeto Maven. Se você não conhece o Maven, preste atenção ao artigo anterior . Vamos começar!
  1. Em pom.xml, adicione a dependência javax.servlet-api e defina o war de empacotamento:

    
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>

    Classe de servlet simples:

    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
  2. Para executar a aplicação você precisa criar uma configuração do Tomcat:

    Parte 5. Servlets, API de servlet Java.  Escrevendo uma aplicação web simples - 2 Parte 5. Servlets, API de servlet Java.  Escrevendo uma aplicação web simples – 3

  3. A seguir indicamos qual versão do Tomcat utilizaremos, a URL pela qual podemos acessar o servidor e a porta. Você deve obter algo assim:

    Parte 5. Servlets, API de servlet Java.  Escrevendo uma aplicação web simples – 4
  4. Resta apenas especificar o artefato (o projeto montado em um arquivo jar), que será implantado no contêiner. Você pode clicar no botão Corrigir e selecionar guerra explodida : isso significa que após a reconstrução do projeto, o artefato será automaticamente colocado no contêiner do servlet. Parte 5. Servlets, API de servlet Java.  Escrevendo uma aplicação web simples – 5

  5. O contexto do Aplicativo é definido como servlets_war_exploded por padrão , o que significa que o aplicativo deve ser acessado em: http://localhost:8080/servlets_war_exploded .

    Por que precisamos de texto extra? Vamos remover coisas desnecessárias. Agora o endereço do nosso aplicativo é: http://localhost:8080 .

    Parte 5. Servlets, API de servlet Java.  Escrevendo uma aplicação web simples – 6

  6. Clique OK. Vemos que agora temos a oportunidade de lançar o aplicativo:

    Parte 5. Servlets, API de servlet Java.  Escrevendo uma aplicação web simples – 7

    Agora, ao iniciar o aplicativo, o navegador deverá abrir e exibir um erro 404. Isso é lógico, pois no endereço http://localhost:8080/ deve haver um servlet com o mapeamento “/”, e nosso único servlet possui o mapeamento “/hello” .

  7. Entramos em contato com ele em http://localhost:8080/hello e obtemos a resposta esperada - a string “Hello”!

Se tudo funcionar, vamos dar uma olhada no código. Para criar um servlet http de uma classe regular , você precisa herdá-lo da classe HttpServlet. Acima da classe especificamos a anotação @WebServlet(), na qual vinculamos (mapeamos) o servlet a um caminho específico (“/hello”). Esta anotação apareceu apenas no Java Servlet API 3.0, portanto existem muitos exemplos na Internet onde o mapeamento de servlet ocorre através de um arquivo XML. Agora isso não é necessário. Para processar solicitações GET , substituímos o método doGet(). Preste atenção aos argumentos do método - HttpServletRequest e HttpServletResponse. Do objeto HttpServletRequest podemos obter todas as informações necessárias sobre a solicitação, em HttpServletResponse podemos registrar nossa resposta e definir os cabeçalhos necessários.

Trabalhando com parâmetros e sessão

Vamos melhorar nosso servlet para que ele possa processar parâmetros de solicitação e trabalhar com a sessão:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
O servlet está atualmente executando a sessão, incrementando o visitCounter cada vez que a página é visitada. Se o atributo visitCounter ainda não tiver sido criado (na primeira vez que você visitar a página), o método getAttribute() retornará nulo, então você precisa verificar se há nulo. O mesmo se aplica aos parâmetros de solicitação. Se o usuário não passou o parâmetro nome de usuário, seu valor será nulo. Neste caso, cumprimentaremos o usuário como anônimo. Para passar um parâmetro em uma requisição GET são utilizadas path-variables, ou seja, é necessário acessar o link http://localhost:8080/hello?username=Pavel . Você pode ler mais sobre solicitações http no artigo anterior da série. Agora nosso aplicativo tem lógica mínima, mas o erro 404 no caminho raiz é um pouco chato. Para consertar, vamos criar outro servlet e mapeá-lo para a página inicial @WebServlet("/"). A função deste servlet é redirecionar as solicitações para o caminho “/hello”. Existem duas maneiras de fazer isso: usando encaminhamento ou redirecionamento. Talvez valha a pena entender qual é a diferença entre eles. forward - delega o processamento da solicitação para outro servlet no servidor, o cliente não está envolvido. Para fazer isso, você precisa adicionar o seguinte código ao método doGet() do novo servlet:

getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Neste código, acessamos o contexto do servlet, obtemos dele o gerenciador de solicitações do servlet desejado e solicitamos que ele processe uma solicitação específica com os parâmetros especificados (req, resp). redirecionamento - retorna ao cliente o endereço para o qual ele precisa entrar em contato para processar sua solicitação. A maioria dos navegadores acessa o link transmitido automaticamente. Para implementar o redirecionamento você precisa adicionar este código:

resp.sendRedirect(req.getContextPath() + "/hello");
Em HttpServletResponse chamamos o método redireccionamento() e passamos-lhe o endereço que o cliente necessita contactar. Um detalhe importante: os parâmetros http também devem ser adicionados no final do caminho completo de redirecionamento, o que não é muito conveniente. Na nossa situação é preferível usar forward, mas acontece que é melhor usar redirecionamento. Se você entender a diferença no trabalho deles, não errará em sua escolha. O código do novo servlet é assim:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

Resultado final

Seu primeiro aplicativo web está pronto. No próximo artigo você aprenderá como implantá-lo sem usar o Intellij IDEA. Escrevemos um aplicativo que processa apenas solicitações GET. Os métodos http restantes são processados ​​da mesma maneira - substituindo os métodos correspondentes da classe pai. Usando esses servlets simples, você pode criar aplicativos da Web complexos e ricos. Claro, usando grandes frameworks como Spring, isso é muito mais fácil de fazer. Mas se você realmente deseja se aprofundar em todos os recursos dos servlets com mais detalhes, pode ler a especificação oficial . Parte 6. Contêineres de servlet Parte 7. Introdução ao padrão MVC (Model-View-Controller) Parte 8. Escrevendo um pequeno aplicativo em spring-boot
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION