A API Servlet

Computação II - Ciência da Computação


Prof.: Danilo S. Carvalho

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:

  1. Que tipo de informação podemos coletar da requisição do cliente para guiar a construção da resposta?
  2. De que forma podemos serializar objetos e enviá-los para o cliente?

Exercício:

  1. Crie um servlet que responda ao cliente com uma imagem que seja exibida no navegador quando uma certa URL for requisitada.

Até a próxima aula!