Conhecendo a tecnologia Servlet

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (6)  (0)

Veja neste artigo como trabalhar com um Servlet em um projeto web. Saiba o significado do servlet, como funciona a arquitetura e mapeamento. Conheça o Container, veja como funciona e o seu comportamento quando executa um servlet.

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.

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).

Vantagens dos 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.

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;

Pontos importantes

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:

http://www.devmedia.com.br/conhecendo-o-eclipse-uma-apresentacao-detalhada-da-ide/25589

http://www.devmedia.com.br/instalacao-e-configuracao-do-apache-tomcat-no-eclipse/27360

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

Listagem 1: Arquivo web.xml configuração de mapeando do 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>

Sendo um Servlet

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.

Listagem 2: Arquivo “login.jsp”

<%@ 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>

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).

Listagem 3: Arquivo servlet “PrimeiroServlet.java”

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");
		}
	}
}

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.

Espero que tenham gostado e até a próxima!

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?