sábado, 12 de março de 2011

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("...");

Nenhum comentário:

Postar um comentário

Admin: Bruno

Olá Galera! muito grato por estarem acessando nosso blog. Espero que seja possível transmitir de forma compreensível um pouco de meus conhecimentos em programação, para esta comunidade de desenvolvedores que cresce cada vez mais! Espero que Gostem! Abraço! E meu enorme obrigado à Renato Simões, Átila Soares,Wanderson Quinto, Emerson e a toda galera que sempre ajudou meu sincero obrigado....
Especialmente a Natalia Failache e Rita de Cassia que sempre apoiaram este sonho....

De seu amigo Bruno Rafael.