O que são Servlets?

A tecnologia Servlet é uma classe Java, que consegue gerar páginas dinâmicas para a camada de apresentação de aplicações web. O principal objetivo é receber chamadas HTTP, sendo processada e devolvida uma resposta para o cliente. Os servlets trabalham juntamente com a tecnologia Java Server Pages (JSP).

No surgimento da Internet, existiam apenas páginas com conteúdos estáticos desenvolvidos em HTML. Com o tempo, foram aparecendo no mercado páginas web com conteúdos dinâmicos através da tecnologia Commom Gateway Interface (CGI). A maioria dos programas CGI é escrita escrita como script em Perl, C, Python e PHP.

O CGI tem o processo que permite ao servidor web chamar o programa externo e passar informações de solicitações HTTP para conseguir processar uma solicitação. A resposta do programa externo é passada de volta ao servidor web, que a encaminha ao browser do cliente. Mas essa tecnologia tem a seguinte falha: Consome muitos ciclos de CPU e memória, com isso, quando acontece o processo de cada solicitação do cliente, o servidor web acaba reproduzindo um novo processo do programa CGI solicitado.

Por que usar Servlets

  • Portabilidade - Os servlets permitem serem movidos para outros aplicações Java e sistemas operacionais.
  • Desempenho - Ao contrário da tecnologia CGI, cada solicitação é gerenciada pelo processo do container.
  • Agilidade - Possui acesso às bibliotecas Java, que ajudam no ciclo do desenvolvimento.
  • Robustez - Pelos servlets serem gerenciados pela JVM, não tem muitos problemas de memória.

O que é Servlet Container?

O servlet pode ser carregado ou executado através por um servidor web especial, conhecido como “Container”. Isso acontece, porque os Servlets não possuem um método main().

Existem muitos aplicativos desse tipo, sendo que o oficial é o Tomcat. Originalmente projetado pela Sun, seu código fonte foi entregue à Apache Software Foundation. Hoje o Tomcat, é referência quando se trata de implementações em servlet.

O Tomcat é um servidor web, sendo usado para solicitar serviços HTTP processados. O Container trata dos seguintes casos em uma aplicação web, quando envolve servlets que são:

  • Criação do servlet ou da nova thread para tratar uma solicitação de resposta.
  • Invocação do método doPost() ou doGet() do servlet.
  • Tratamento do envio das solicitações de requisição e resposta HTTP.
  • Gerenciamento da vida e morte dos recursos do servlet.

Vantagens do Container

O Container proporciona uma série de benefícios que são:

  • Suporte para comunicações;
  • Suporte a multithread;
  • Segurança;
  • Suporte ao JSP;
  • Gerenciamento do ciclo de vida;

Como configurar Servlets?

Para começar a construir um servlet é necessário o JDK, Eclipse, o Tomcat instalado e configurado.

Mais informações sobre essa preparação pode ser encontrada nos links abaixo:

Arquitetura do servlet

Na Figura 1 é mostrado como o Container trata uma solicitação de servlet. A simulação desse diagrama acontece quando o Cliente (usuário) clica em um link que é chamado um servlet. Após isso, quando o container visualiza que a requisição (request) aponta para um servlet, ele cria dois objetos: HttpServletResponse e HttpServletRequest. Sendo assim, o Container encontra o servlet correto baseado na URL da requisição, podendo criar ou alocar uma thread para essa requisição, passando os objetos de requisição (request) e resposta (response) para a thread do servlet.

Dependendo de como foi o tipo de solicitação, o Container chama o método doPost() ou doGet() ou service() do servlet. Esse método gera uma página dinâmica e a insere no objeto response. Esse processo termina com a thread, e o Container converte o objeto response em uma resposta HTTP, aonde envia de volta ao cliente e apaga os objetos request e response.

Arquitetura de um servlet
Figura 1. Arquitetura de um servlet

Em uma aplicação Servlet, podem ser incluídos conteúdos estáticos (páginas HTML, arquivos de imagem, entre outros). Como boas práticas é comum deixar que um servidor web fique na frente, para gerenciar todas as solicitações do cliente. O servidor web, serve o conteúdo estático que passa para a aplicação do Container Web.

Mapeando um Servlet

Após a criação de um servlet, realize-se um processo de mapeamento que auxilia na flexibilidade e segurança da aplicação. Esse processo tem um fator positivo, pois ajuda a esconder do cliente o caminho e o nome do arquivo nos JSPs e as páginas HTML que usam algum servlet.

Geralmente quando o cliente chama o servlet, é visto na barra de endereço o pseudonome que foi dado ao servlet. Por trás desse nome, existe toda uma configuração sofrida na classe do servlet feita pelo programador, contendo o nome da classe e pacote, nome de arquivo e o caminho real.

O arquivo web.xml (WebContent\WEB-INF) conhecido como Deployment Descriptor (DD), serve para informar ao Container como executar os servlets e páginas web. Esse arquivo é detalhado na Listagem 1, onde são usados dois elementos XML para mapear as URLs aos servlets, que são:

  • <servlet> - informa ao Container quais arquivos de classes pertencem na aplicação.
  • <servlet-mapping> - informa qual servlet chamar para a url solicitada.

A Figura 2 mostra uma decomposição do processo que funciona o mapeamento.

Decomposição do mapeamento
Figura 2. Decomposição do mapeamento

Criando um projeto e servlet

Abaixo são demonstrados os passos para a criação de um projeto e um servlet.

Criação do projeto servlet
Figura 3. Criação do projeto servlet
Etapa de configuração marcar a opção para gerar o Deployment Descriptor
Figura 4. Etapa de configuração marcar a opção para gerar o Deployment Descriptor

Após finalizar a criação do projeto, podemos criar um servlet seguindo os passos nas imagens abaixo:

Criação do Servlet
Figura 5. Criação do Servlet
Descrevendo o nome do servlet
Figura 6. Descrevendo o nome do servlet
Especificando os métodos para gerar no servlet
Figura 7. Especificando os métodos para gerar no servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>ProjetoServlet</display-name>
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>Primeiro Servlet</servlet-name>
    <servlet-class>br.com.exemplos.PrimeiroServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>Primeiro Servlet</servlet-name>
    <url-pattern>/ServletNomeAlterado.do</url-pattern>
  </servlet-mapping>
  
</web-app>
Listagem 1. Arquivo web.xml configuração de mapeando do servlet

Quando usar servlets?

A Listagem 2 apresenta o arquivo JSP, que aponta para o servlet (ServletNomeAlterado.do) que é chamado quando o usuário efetua uma solicitação ao servidor. Quando houver uma solicitação, o Container verifica no arquivo web.xml o mapeamento desse servlet, podendo visualizar a qual classe Java pertence. O fluxo desse processo foi mostrado na Figura 2.


<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Login do sistema</title>
</head>
<body>

<form action="ServletNomeAlterado.do" method="POST">
    <h2>Faça o login</h2>
    <table border="0" cellpadding="1">
        <tr>
            <td><label>Usuário</label></td>
            <td><input type="text" name="usuario" size="20" /> </td>
        </tr>
        <tr>
            <td><label>Senha</label></td>
            <td><input type="password" name="senha" size="20" /> </td>
        </tr>
        
        <tr>
            <td colspan="2">
                <input type="submit" value="Entrar"/>
                <input type="reset" value="Limpar"/>
            </td>
        </tr>
    </table>
</form>

</body>
</html>
Listagem 2. Arquivo login.jsp

Na Listagem 3, efetua-se uma validação nos campos de entrada (input) do arquivo login.jsp. Quando acontece uma requisição por parte do usuário, o servlet recupera as informações através da solicitação (request). Para conseguir resgatar as informações que são passadas nos campos de entrada, é necessário que a propriedade name seja definida e usada com o mesmo nome no parâmetro do método getParameter(name).


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;


public class PrimeiroServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public PrimeiroServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
        String nome = request.getParameter("usuario");
        String senha = request.getParameter("senha");
        
        if(nome.equals("servlet") && senha.equals("12345")){
            response.sendRedirect("index.jsp");
        }else{
            response.sendRedirect("login.jsp");
        }
    }
}
Listagem 3. Arquivo servlet PrimeiroServlet.java

Conclusão

Ao finalizar a criação desses três arquivos, já é possível rodar o projeto e fazer o teste.No servlet da Listagem 3 está sendo apresentado o usuário e senha estáticos apenas para fins educativos.

Vale citar mais uma questão, nesse artigo foi demonstrado o mapeamento do servlet de maneira manual. Hoje, nas versões superiores ao 7 do Tomcat, o mapeamento é feito automático, pois já inclui a anotação @WebServlet (javax.servlet.annotation.WebServlet), onde que é definido o nome do servlet.


Saiu na DevMedia!

  • Controle de acesso no Laravel com AC:

    Neste curso vamos aprender como implementar um sistema de autorização utilizando o Laravel, framework PHP mais utilizado no mundo. Para isso, partiremos de uma aplicação que possui toda a parte de registro e autenticação de usuários.

  • Como entramos no mercado de trabalho:

    Então você deseja ocupar a cadeira de programador? Saiba que não existe um único caminho para alcançar esse objetivo, embora alguns sejam mais seguros que outros. Assista aqui um bate papo a respeito de como entramos no mercado de trabalho.

  • ASP.NET MVC e Identity: Autorização de usuários com claims:

    A autorização é um recurso de extrema importância para os diferentes tipos de aplicações. É por meio dela que conseguimos controlar o acesso dos usuários às páginas da aplicação de acordo com regras preestabelecidas, tais como sua função/perfil dentro do contexto do sistema.


Saiba mais sobre PHP ;)

  • Guias de Java:

    Encontre aqui os Guias de estudo que vão ajudar você a aprofundar seu conhecimento na linguagem Java. Desde o básico ao mais avançado. Escolha o seu!

  • Como ser um Programador Java?:

    Aprender Java não é uma tarefa simples, mas seguindo a ordem proposta nesse Guia, você evitará muitas confusões e perdas de tempo no seu aprendizado. Vem aprender java de verdade, vem!

  • O que é Java?:

    Neste curso você aprenderá o que é o Java, tecnologia para desenvolvimento de software mais utilizada pelos programadores em todo o mundo. O Java pode ser empregado para criar soluções para desktop, web, mobile, dispositivos embarcados, enfim, para qualquer plataforma sobre a qual possa ser executada uma máquina virtual Java.