Nessa aula, vamos aprender sobre como responder à requisições HTTP usando a linguagem Java.
Ao final da aula, poderemos responder à requisições usando as classes da API Servlet.
Para responder à requisições HTTP, precisamos que o computador a receber as requisições haja como um servidor, ou seja, fique aguardando conexões em uma porta de rede especificada (a porta padrão para o protocolo HTTP é 80).
Para isso, é necessária a instalação de um programa para escutar tais conexões, chamado de servidor HTTP.
Ao receber uma conexão na porta especificada, o servidor HTTP chama um programa registrado para lidar com a requisição, dependendo da URI solicitada e de sua configuração.
Para os programadores Java, uma opção simples de servidor HTTP que podemos usar para responder requisições é o Apache Tomcat.
O Tomcat oferece a capacidade de chamar classes Java que fazem uso da API Servlet para atender a qualquer tarefa e solicitação feita ao servidor (não só HTTP), sendo também conhecido como um Servlet Container.
Mas o que é a API Servlet?
A API Servlet contém classes e interfaces que facilitam a programação de diversos serviços de rede, entre eles os serviços HTTP para a Web.
Os principais módulos dessa API são a interface Servlet, que define as capacidades básicas de um serviço,
as interfaces ServletRequest e ServletResponse, que definem as capacidades de captura de dados da conexão e de envio de dados para o cliente, respectivamente,
e a classe GenericServlet, que serve de base para todas as classes servlet que serão implementadas pelo programador para construir os serviços.
A implementação da API Servlet não faz parte da biblioteca padrão do Java, então deve ser implementada por uma biblioteca externa.
O Tomcat vem com uma implementação própria da API, que fica contida no arquivo lib/servlet-api.jar, no seu diretório de instalação.
No exemplo abaixo, construiremos passo a passo o nosso primeiro servlet, que vai responder uma requisição HTTP com um documento HTML simples.
Em primeiro lugar, importamos os pacotes e classes que usaremos para criar o serviço.
Em seguida, criamos uma classe para abrigar o código do servlet. Como queremos responder a uma requisição HTTP, nossa classe deve herdar de HttpServlet.
Além disso, precisamos colocar uma anotação de classe @WebServlet para informar que essa classe poderá ser chamada pelo servlet container, e o caminho (URL) no servidor que precisa ser recebido para que o servidor HTTP chame essa classe.
Nesse caso, a classe será chamada quando a URI http://<nome do servidor>/<nome do projeto>/PrimeiroServlet for requisitada.
Como essa é uma classe serializável, incluimos um serialVersionUID.
Também incluímos um construtor padrão, inicializando o servlet com o construtor da superclasse
Por fim, criamos um método para cada um dos verbos HTTP que queremos tratar. Nesse exemplo trataremos apenas do GET, portanto precisamos implementar o método doGet().
O método doGet possui dois argumentos: um HttpServletRequest e um HttpServletResponse, representando respectivamente a requisição que chegou ao servidor e a resposta que será devolvida ao cliente.
Do HttpServletRequest, lemos as informações constantes na requisição, e construímos nossa resposta usando o objeto HttpServletResponse.
Aqui, criamos uma string incrementalmente (o documento HTML) usando o StringBuilder, e enviamos ela como conteúdo da resposta do servidor usando o método getWriter() para obter um objeto PrintWriter para escrever, e o método println(), para fazer o envio.
Antes do envio propriamente dito, definimos um cabeçalho informando o tipo do recurso que está sendo enviado para o cliente. Nesse caso "text/html".
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/PrimeiroServlet")
public class PrimeiroServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
}
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/PrimeiroServlet")
public class PrimeiroServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public PrimeiroServlet() {
super();
}
}
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/PrimeiroServlet")
public class PrimeiroServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public PrimeiroServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
StringBuilder respostaHtml = new StringBuilder();
respostaHtml.append("<!DOCTYPE html>\n");
respostaHtml.append("<html>\n");
respostaHtml.append("<body>\n");
respostaHtml.append("Olá Web\n");
respostaHtml.append("</body>\n");
respostaHtml.append("</html>");
response.addHeader("Content-Type", "text/html");
response.getWriter().println(respostaHtml.toString());
}
}
E assim criamos o nosso primeiro servlet e podemos agora responder requisições HTTP usando Java.
Pratique o resposta à requisições e o envio de recursos em diferentes formatos.
Na próxima aula aprenderemos a facilitar a construção das nossas respostas usando Java Server Pages (JSP).
Perguntas:
Exercício:
Até a próxima aula!