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

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

- 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
- Podemos agora rodar a aplicação:
- http://<host>:8000/cadastromail/index.html
- O resultado deve ser o seguinte (pelo menos, à tarde):
Como a Aplicação Funciona
- Explicação rápida da sequência de eventos (ver figura)
- 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
Postar um comentário