Servlet é a tecnologia da Java provida pela Oracle que é usada para comunicar servidores web e aplicações de clientes (como browser's). Servlet que provê ao Java uma API para facilitar o desenvolvimento das aplicações web.

Isto é parcialmente implementado pelo servidor web e pelo programador da aplicação.

Do ponto de vista da aplicação, é uma classe em Java que é criada usando o API do Servlet e instanciado pelo servidor web para processar o pedido dinamicamente.

O objetivo deste artigo é aprender o que é um Servlet, como receber informações submetidas pelos clientes web como navegadores web, e como responder ao cliente de acordo com as informações submetidas.

Servlet em detalhes:

Servlet é o API do Java que é usado para criar dinamicamente aplicações web. Para escrever em aplicação usando Servlets, o pacote chamado javax.servlet e seus sub pacotes são usados. No núcleo do API do Servlet, uma interface do javax.servlet.Servlet provê o ciclo de vida dos métodos do Servlet. Estes métodos são usados para inicializar, gerenciar e destruir um Servlet, que são os seguintes:

  • init()
  • service()
  • destroy()

Sempre quando um usuário visita uma url de uma página web, cada visita a url é considerada como uma requisição. Em cada requisição gerada pela página web que chega ao servidor, este manda uma resposta que depende das estratégias de desenvolvimento.

Gera uma resposta que faz a requisição submetida pelo cliente
Figura 1. Gera uma resposta que faz a requisição submetida pelo cliente
  1. Pedido de um Servlet é mandado para o servidor web.
  2. O objeto ServletRequest é criado a partir do pedido.
  3. A informação requerida é guardada no ServletRequest Object.
  4. O objeto ServlerResponse é criado para a requisição.
  5. O método service() do servlet é invocado e é referência do ServlerRequest e o ServletRequest é provido.
  6. O Servlet lê a informação requerida a partir do objeto ServletRequest.
  7. O Servlet gera conteúdos e os guarda para o objeto ServletResponse.
  8. Depois da compilação do método service(), o servidor web manda os conteúdos do ServletResponse.
  9. Conteúdos do ServletResponse são mandados ao cliente.

<%@ 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>LoginInfo</title>
</head>
<body>
    <form method = "post"  action = "LoginInfo">
        Login Id: <input type = "text" name = "name"/>
        <br>
        Password: <input type = "password" name = "password"/>
        <br>
        <input type = "submit" value = "Login"/>
    </form>
</body>
</html>
Listagem 1. Criando um form de uma página HTML

Este código cria um form que aceita login id e o password como as duas entradas e as processa para o servidor web, quando o usuário clica no botão de login ou aperta enter. O form tag define que a informação será mandada usando um método de postagem. Deste modo, não será mostrado na url e será transferido para o nome do Servlet LoginInfo. Este Servlet receberá informação usando o objeto requerido criado da classe HttpServletRequest.

Formulário
Figura 2. Formulário

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class test
 */
       
@WebServlet(urlPatterns = "/LoginInfo")
public class LoginInfo extends HttpServlet {
        private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */

    public LoginInfo() {
        super();
        // TODO Auto-generated constructor stub
    }

        /**
         * @see HttpServlet#doGet(HttpServletRequest request, 
         HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, 
        HttpServletResponse response)
throws ServletException, IOException {
                doPost(request, response);
        // TODO Auto-generated constructor stub
        }

        /**
         * @see HttpServlet#doPost(HttpServletRequest request, 
         HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, 
        HttpServletResponse response)
 throws ServletException, IOException {
        // TODO Auto-generated constructor stub
            String id = request.getParameter("name");
            String pass = request.getParameter("password");
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            RequestDispatcher rd = null;
            request.setAttribute(id, "name");
            if(id.equals("name") && pass.equals("pass")){
                    rd = request.getRequestDispatcher("/WelcomeServlet");
                    rd.forward(request, response);
            }
            else{
                    out.println("<b>Invalid 
                    Login Info.</b><br>");
                    rd = request.getRequestDispatcher("/LoginInfo.jsp");
                    rd.include(request, response);
            }
            out.close();

        }
}
Listagem 2. Criar LoginInfo Servlet para receber as informações submetidas do form HTML

O código acima define a classe LoginInfo que estende HttpServlet e define os métodos doPost() e doGet(). O doPost() recebe a informação transferida do form HTML usando o método getParameter da classe HttpServletRequest. Esses dois métodos, doGet() e doPost() tem as exceções Servlet Exception e IOException, e aceitam dois parâmetros dos tipos HttpServletRequest e HttpServletResponse. A primeira linha do método doPost() define o tipo de resposta para o cliente. O tipo de resposta neste servlet será HTML ou do tipo de conteúdo de texto.

A próxima linha cria uma variável de referência do tipo PrintWriter e designa a referência do método response.getWrite(). A próxima linha deste método define a variável de referência ao tipo do RequestDispatcher e configura um atributo usando o método setAttribute() da classe HttpServletResquest. Agora a validação da dada entrada do cliente usando o método de string equals(). Se o nome de usuário é igual ao "name" e password é igual a "pass" o controle será transferido para o novo servlet "WelcomeServlet" usando os métodos getRequestDispatcher() e foward() como é mostrado a seguir:


rd = request.getRequestDispatcher("/WelcomeServlet");
rd.forward(request, response);

Se o login e o password não coincidirem, uma mensagem de erro será gerada "invalid login info" usando o método println() e o login da página será incluído usando o método include(), como segue:


out.println("<b>Invalid Login Info</b><br>");
rd.include(request,response);

Na última linha deste método, a stream do Writer será fechada usando o método close(). Neste servlet, o padrão da configuração da url foi definida usando anotações, como é mostrado a seguir:


@WebServlet (urlpattern = "/LoginInfo")

A configuração pode ser feita usando um arquivo xml que é o descritor de desenvolvimento. É chamado de arquivo web.xml.


<?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_2_5.xsd

id="WebApp_ID" version="2.5"> 
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
        <servlet>
                <servlet-name>
                        LoginInfoName
                </servlet-name>
                <servlet-class>
                        LoginInfo
                </servlet-class>
        </servlet>
        <servlet-mapping>
                <servlet-name>
                        LoginInfoName
                </servlet-name>
                <url-pattern>
                        /LoginInfo
                </url-pattern>
        <servlet-mapping>
</web-app>
Listagem 3. Criando um arquivo web.xml

Os conteúdos da listagem acima definem o arquivo web.xml (descritor de desenvolvimento). A primeira tag <xml> define a versão xml para o debugador. A próxima tag é a raiz que define a classe de servlet e seu mapeador de url form de ação html, descrição de contexto de parâmetro, e o parâmetro de inicialização usando esta tag.

A sub-tag <welcome-file-list> carrega o arquivo de início padrão, enquanto a aplicação web inicializa usando sua sub-tag <welcome-file>. A próxima tag <servlet> é usada para definir a classe de servlet que é para ser mapeada no url form de ação html usando a sub-tag (<servlet-mapping>).

A tag <servlet> usa duas sub-tags <servlet-name> e <serlet-class> para definir que nome será usado para mapear a url e a classe de Servlet que será mapeada nesta url.


<servlet>
	<servlet-name>LoginInfoName</servlet-name>
	<servlet-class>LoginInfo</servlet-class>
</servlet>
Listagem 4. Declarando Servlet
Nota: O nome especificado usando a tag <servlet-name> na tag <servlet> deve ser o mesmo que o definido em <servlet-mapping> para que se mapeie a classe do servlet com a url.

A url é definida usando a sub-tag <url-pattern> da tag <servlet-mapping>.


<servlet-mapping>
	<servlet-name>LoginInfoName</servlet-name>
	<url-pattern>/LoginInfo</url-pattern>
<servlet-mapping>
Listagem 5. Definindo Servlet
Gera uma mensagem de erro, se o usuário entrar com uma informação errada
Figura 3. Gera uma mensagem de erro, se o usuário entrar com uma informação errada

A figura acima mostra uma mensagem de erro e carrega a página de login novamente, se o usuário fornece informações de login inválidas.

Carregamento do WelcomeServlet, se o usuário é validado
Figura 4. Carregamento do WelcomeServlet, se o usuário é validado

A figura acima mostra a mensagem de boas-vindas depois do carregamento do WelcomeServlet, se o usuário entrar com informações válidas. A informação do usuário é validada com as informações já gravadas de userid "name" e password "pass".

Conclusão:

Neste artigo, aprendemos o que é um Servlet, qual é sua precisão, como receber informações submetidas por um cliente web como um navegador web e como responder ao cliente de acordo com as informações submetidas.