Introdução a Containers Web: A Primeira Aplicação Web com Servlets

 

Fala galera!!! Depois de um tempo sumido (Carnaval Sá comé né! :D) venho aqui lhes passar um post sobre servlets. Explicando como os benditos funcionam na teoria, e um exemplo de como utiliza-los na prática... Então deixa de enrrolação e vamos lá!

Tipos  de Clientes

  • Há dois tipos básicos de clientes:
    • Clientes tipo "Aplicação"
      • Arquitetura em 2 camadas
      • "Fat client"
      • São instalados em cada desktop
    • Clientes Web
      • Browser como cliente universal fornecendo a interface com o usuário (UI)
      • Uso de HTML (talvez com Javascript ou DHTML), ou XHTML ou XML/XSL para definir as telas
      • Uso de HTTP ou HTTPS como protocolo
      • A lógica de negócio (Business Logic) roda no servidor
  • J2EE permite criar aplicações Web dinâmicas (com conteúdo dinâmico)
    • J2EE provê Web Containers e duas API para escrever aplicações
      • API servlets
      • API Java Server Pages (JSP)
  • Nesta seção, veremos:
    • A anatomia de um Web Container
    • Uma aplicação Web simples
    • Detalhes sobre o funcionamento dessa aplicação

O Protocolo HTTP

  • Supõe-se que o aluno esteja familiarizado com o protocolo HTTP, em especial:
    • O cliente inicia a conversa pedindo uma página
      • Não há callback do servidor para o cliente
    • GET request Method
      • Para pedir páginas estáticas ou dinâmicas
        • http://www.dominio.com.br?nome=jacques
    • POST Request Method
      • Para pedir páginas dinâmicas
    • Formulários em páginas HTML podem usar o método GET ou POST
    • Response HTTP com a página pedida
    • Tipos MIME (Multi-Purpose Internet Mail Extensions)
      • text/html
      • image/gif
    • Originalmente, a forma de obter informação dinâmica com HTTP é de usar CGI (Common Gateway Interface), uma forma de ativar um programa externo que gera uma página de resposta

Containers Web e Aplicações Web

  • Aplicações Web rodam no servidor
  • Para fazer aplicações no servidor, previsamos de:
    • Um modelo de programação e uma API
    • Suporte de runtime no servidor
      • Para executar aplicações
    • Suporte de deployment
      • Para instalar aplicações no servidor e customizá-las
  • J2EE oferece:
    • Web Components
      • Java Servlets e Java Server Pages
    • Web Applications
      • Uma coleção de servlets, páginas JSP, outras classes, bibliotecas e recursos estáticos tais como páginas HTML, XML, etc.
    • Um Web Container
      • Para hospedar aplicações Web
      • Essencialmente uma JVM com API especial de servlets e suporte para JSP
      • O container é responsável pelo ciclo de vida dos componentes Web (inicialização, chamada, destruição, ..)
    • Uma estrutura de packaging e um Deployment Descriptor
      • Arquivos com formato especial para armazenar um Web Component (arquivo WAR) ou Web Application (arquivo EAR)
      • O Deployment Descriptor é um arquivo XML que permite customizar a aplicação em tempo de deployment (instalação)
  • Veja a figura abaixo:
webcontainer.gif (12544 bytes)

Servlets

  • Servlets permitem que a lógica de aplicação seja embutida no processo request-response
    • Um servlet é um programa Java que roda do lado servidor e que estende a funcionalidade do servidor Web
    • A API de servlets provê um framework simples para construir aplicações em servidores Web que dão suporte a servlets
  • Um exemplo de um servlet está aqui
  • Exemplos de servidor Web que dão suporte a servlets
    • Tomcat do projeto Apache
    • WebLogic da BEA
    • Inprise Application Server da Borland
    • iPlanet Application Server da Sun
    • WebSphere Application Server da IBM
    • Servidores completos J2EE grátis tais como JBoss
  • Internet Information Server (IIS) da Microsoft não tem suporte a Web Containers
    • Use Tomcat, JRun ou ServletExec como plug-in no IIS
  • Quando o Web server entende que uma URL deve ser atendida por um Web Container, ele passa o controle para o container
    • Este container decide qual Web Application deve executar
    • Quando é um servlet, o container controla a execução do servlet
    • Através da API de servlets, o servlet pode acessar a informação do Request, fornecer uma Response, etc.
servlet1.gif (8422 bytes)

Java Server Pages

  • A geração de informação dinâmica pode ser feita de duas formas:
    • Programaticamente (servlets)
    • Através de templates (Java Server Pages ou JSP)
  • O uso de templates é melhor pois deixa o Web Designer com possibilidade de criar as páginas
  • JSP é uma extensão da tecnologia de servlets
    • Uma página JSP contém código HTML (ou XML)
    • Tags especiais ou "scriplets" especiais são embutidos no HTML para execução para produzir o conteúdo final
    • Um exemplo de página JSP  está aqui
    • A página JSP é traduzida para um servlet automaticamente pelo servidor J2EE
    • O servlet é compilado (apenas uma vez)
    • A partir daí, o servlet é executado para gerar o conteúdo dinâmico
    • Observe que, depois que a página JSP foi transformada em servlet, a situação é idêntica à execução de um servlet
jsp1.gif (10870 bytes)
  • Active Server Pages (ASP) da Microsoft é semelhante mas:
    • É interpretado, não compilado
    • A linguagem é VBScript

Servlets ou Java Server Pages?

  • Temos várias alternativas para a geração de páginas dinâmicas
    • Servlets contêm a lógica de aplicação e geram o conteúdo das páginas
    • JSP contêm a lógica de aplicação e geram o conteúdo das páginas
    • Servlets contêm a lógica de aplicação e JSP geram o conteúdo das páginas

Deployment Descriptors

  • Deployment Descriptors ajudam a configurar a aplicação Web durante a instalação (deployment)
  • O Deployment Descriptor é um arquivo chamado web.xml que tem os seguintes propósitos:
    • Prover valores iniciais para parâmetros de Web Applications
      • Exemplo: servidor de Banco de Dados, etc.
      • Usado para inicializar qualquer valor que poderá mudar entre duas instalações
      • Exemplo: não é um bom lugar para colocar a taxa de câmbio do dólar
      • Permite configurar as aplicações sem alterar código e recompilar os servlets
    • Definir servlets e JSPs
      • Cada servlet e JSP usado pela aplicação deve ser descrito para permitir que seu deployment seja feito
    • Especificar mapeamentos de servlets e JSPs
      • Define como URLs que chegam do cliente serão mapeadas para servlets e JSPs
    • Especificar MIME types usados por cada aplicação
    • Especificar dados de segurança
      • Pode especificar quais páginas precisam de um login, qual é a página de login, que papel o usuário deve ter para acessar a página, etc.
    • Customizar páginas de boas vindas, páginas de erro, configuração de sessão, etc.

Nossa Primeira Aplicação Web

  • Vamos programar?
  • O problema:
    • Escreva uma aplicação que peça ao usuário seu nome e email
    • Imprima uma página de boas vindas dependente do horário do dia
  • A solução: usaremos
    • Uma página HTML fixa com um formulário para pedir a informação
    • Um servlet para processar o request e gerar a página de boas vindas
    • Um Deployment Descriptor

O arquivo EAR

  • No final das contas, nossa aplicação Web será contida no arquivo "CadastromailApp.ear"
    • Um arquivo "ear" é um arquivo com formato JAR contendo uma aplicação J2EE (Enterprise Application Archive)
    • Dado este arquivo, podemos rodar em qualquer servidor J2EE
    • Basta, para tanto, passar por um processo de deployment
  • Podemos criar este arquivo "na mão", mas é mais simples usar uma ferramenta de deployment
    • A ferramenta de deployment vai ser usada para 2 coisas:
      • Criar o arquivo ear
      • Fazer o deployment da aplicação junto ao servidor
  • Tudo isso depende do servidor J2EE que estaremos usando
    • Cada um tem um deployment tool diferente
  • Usaremos o servidor grátis fornecido no "J2EE SDK"
    • Em particular, usaremos o "j2sdkee1.3", o último disponível em outubro 2001
  • Siga os passos dados abaixo, depois que tiver instalado:
  • Para ver como instalar tudo isso, veja o tutorial J2EE em http://java.sun.com/j2ee/download.html#tutorial

Criação do arquivo HTML

  • Escolha um diretório para colocar todo o código fonte da aplicação
    • Chamaremos este diretório de "src/cadastromail"
  • Crie o seguinte arquivo src/cadastromail/index.html
<html>

<head>
<title>Cadastro de Mail</title>
</head>

<body>
<h1>Bem-vindo!</h1>
<form method="POST" action="/cadastromail/cadastra">
  <p>Seu nome <input type="text" name="nome" size="40"></p>
  <p>Seu email <input type="text" name="email" size="40"></p>
  <p><input type="submit" value="Submit"> <input type="reset" value="Reset"></p>
</form>
</body>

</html>

Criação do servlet

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class CadastroServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request,
                        HttpServletResponse response)
                        throws ServletException, IOException {

    // pega parâmetros do request
    String nome = request.getParameter("nome");
    String email = request.getParameter("email");
    
    GregorianCalendar calendário = new GregorianCalendar();
    String mensagem = calendário.get(Calendar.AM_PM) == Calendar.AM ?
                      "Bom dia" : "Boa Tarde";

    // acerta tipo MIME para a resposta
    response.setContentType("text/html");

    PrintWriter out = response.getWriter();
    out.println("<HTML>");
    out.println("<BODY>");
    out.println("<P>" + mensagem + ", " + nome + "</P>");
    out.println("<P>Obrigado por cadastrar seu email (" + email + ") conosco.</P>");
    out.println("<P>- A Galera Java</P>");
    out.println("</BODY>");
    out.println("</HTML>");
    out.close();
  }
}
  • Não se preocupe com a forma de funcionamento do servlet ainda
  • Usaremos "ant" para compilar nossas aplicações
  • Por enquanto, o arquivo src/build.xml deve conter:
<project name="disciplina-j2ee-exemplos" default="all" basedir=".">
  <target name="init">
    <tstamp/>
    <property name="build" value="../build" />
    <property name="cadastromail" value="cadastromail" />
    <property environment="myenv" />
    <property name="j2eepath"  value="${myenv.J2EE_HOME}/lib/j2ee.jar" />
  </target>

  <target name="prepare" depends="init">
    <mkdir dir="${build}" />
  </target>

  <target name="clean" depends="init">
    <delete dir="${build}" />
  </target>
      
  <target name="all" depends="init,cadastromail">
  </target>

  <target name="cadastromail" depends="init">
    <mkdir dir="${build}/${cadastromail}" />
    <copy todir="${build}/${cadastromail}" >
      <fileset dir="${cadastromail}"  >
        <include name="**/*.html" />
      </fileset>
    </copy>
    <javac srcdir="${cadastromail}"
      destdir="${build}/${cadastromail}"
      classpath="${j2eepath}" >
      <include name="**/*.java" />
    </javac>
  </target>
</project>
  • Compile a aplicação:
C:\...\src>ant cadastromail
Buildfile: build.xml

init:

cadastromail:
    [mkdir] Created dir: C:\...\build\cadastromail
     [copy] Copying 1 file to C:\...\build\cadastromail
    [javac] Compiling 1 source file to C:\...\build\cadastromail

BUILD SUCCESSFUL

Total time: 4 seconds
  • Isso automaticamente criará o diretório "build", no mesmo nível de "src"

Construção da aplicação

  • Inicie o servidor J2EE (na máquina local ou outra)
j2ee -verbose
  • O servidor poderá ser terminado depois com "j2ee -stop"
  • Inicie a ferramenta de deployment
deploytool
  • Você deve ver a seguinte tela
wpeA6.jpg (26221 bytes)
  • Passos a executar:
    • Escolha File/New/Application
    • Clique em Browse e vá até src/cadastromail
    • No campo "File name", digite CadastromailApp e clique em "New Application"
    • Clique em OK
      • Agora, queremos criar um "Web Component" para adicionar à aplicação
        • Um Web Component é armazenado num arquivo .WAR
    • Clique em File/New/Web Component
    • Leia a tela inicial de explicações e clique em Next
    • Escolha o radio button "Create New WAR File in Application" e selecione CadastromailApp no combo box
    • Digite CadastromailWAR no campo "WAR Display Name"
    • Clique em Edit para adicionar arquivos ao WAR
    • Navegue até build/cadastromail e adicione os arquivos CadastroServlet.class e index.html
    • Clique em OK e Next
    • Escolha o radio button Servlet e clique em Next
    • No combo box "Servlet Class", escolha CadastroServlet
    • Clique em Next e novamente em Next
    • Clique em Add, digite "/cadastra" no campo Aliases
    • Clique em Finish
    • Clique em CadastromailApp e clique na orelha "Web Context"
    • Informe "/cadastromail" no "Context Root"
    • Clique em File/Save
    • A aplicação está pronta em CadastromailApp.ear
  • O arquivo CadastromailApp.ear foi criado com a seguinte estrutura:
  • application.xml é o Deployment Descriptor da aplicação como um todo
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN' 'http://java.sun.com/dtd/application_1_3.dtd'>

<application>
  <display-name>CadastromailApp</display-name>
  <description>Application description</description>
  <module>
    <web>
      <web-uri>war-ic.war</web-uri>
      <context-root>/cadastromail</context-root>
    </web>
  </module>
</application>
  • sun-j2ee-ri.xml descreve informação não transportável aplicável apenas ao servidor sendo usado (J2EE SDK)
    • É uma extensão do Deployment Descriptor da aplicação
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE j2ee-ri-specific-information PUBLIC '-//Sun Microsystems Inc.//DTD J2EE Reference Implementation 1.3//EN' 'http://localhost:8000/sun-j2ee-ri_1_3.dtd'>

<j2ee-ri-specific-information>
  <server-name></server-name>
  <rolemapping />
  <web>
    <module-name>war-ic.war</module-name>
    <context-root>/cadastromail</context-root>
  </web>
</j2ee-ri-specific-information>
  • web.xml é o Deployment Descriptor do Web component (o servlet)
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>

<web-app>
  <display-name>CadastromailWAR</display-name>
  <servlet>
    <servlet-name>CadastroServlet</servlet-name>
    <display-name>CadastroServlet</display-name>
    <servlet-class>CadastroServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CadastroServlet</servlet-name>
    <url-pattern>/cadastra</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
</web-app>
  • Podemos agora fazer o deployment da aplicação
    • Clique em Tools/Deploy
    • Escolha CadastromailApp e o servidor adequado
    • Clique em Finish
wpeA7.jpg (23542 bytes)
  • Podemos agora rodar a aplicação:
    • http://<host>:8000/cadastromail/index.html
wpeA9.jpg (27320 bytes)
  • O resultado deve ser o seguinte (pelo menos, à tarde):
wpeAA.jpg (25198 bytes)

Como a Aplicação Funciona

  • Explicação rápida da sequência de eventos (ver figura)
servlet2.gif (6269 bytes)
  • Explicação rápida do código do servlet
    • doPost
      • Ponto de entrada no servlet, chamado pelo Web Container
    • HttpServletRequest
      • De onde se pode acessar o request
      • String nome = request.getParameter("nome");
    • HttpServletResponse
      • Para onde se encaminha a resposta
      • response.setContentType("text/html");
        • Default é "text/html", portanto essa linha é opcional
      • PrintWriter out = response.getWriter();
      • out.println("...");

Comentários

Postagens mais visitadas deste blog

E Esse Tal de Nano Service?

Executar Audio em Java Swing

Validando Email em Java Com e Sem expressão Regular