Você está na página 1de 29

Mdulo 6

Programao WEB

Lio 2
Classes Servlets

Verso 1.0 - Nov/2007

JEDITM

Autor Daniel Villafuerte Equipe Rommel Feria John Paul Petines

Necessidades para os Exerccios

Sistemas Operacionais Suportados NetBeans IDE 5.5 para os seguintes sistemas operacionais: Microsoft Windows XP Profissional SP2 ou superior Mac OS X 10.4.5 ou superior Red Hat Fedora Core 3 Solaris 10 Operating System (SPARC e x86/x64 Platform Edition) NetBeans Enterprise Pack, poder ser executado nas seguintes plataformas: Microsoft Windows 2000 Profissional SP4 Solaris 8 OS (SPARC e x86/x64 Platform Edition) e Solaris 9 OS (SPARC e x86/x64 Platform Edition) Vrias outras distribuies Linux Configurao Mnima de Hardware Nota: IDE NetBeans com resoluo de tela em 1024x768 pixel Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 500 MHz Intel Pentium III workstation ou equivalente 500 MHz Intel Pentium III workstation ou equivalente UltraSPARC II 450 MHz AMD Opteron 100 Srie 1.8 GHz PowerPC G4 Memria 512 MB 512 MB 512 MB 512 MB 512 MB HD Livre 850 MB 450 MB 450 MB 450 MB 450 MB

Configurao Recomendada de Hardware Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 1.4 GHz Intel Pentium III workstation ou equivalente 1.4 GHz Intel Pentium III workstation ou equivalente UltraSPARC IIIi 1 GHz AMD Opteron 100 Series 1.8 GHz PowerPC G5 Memria 1 GB 1 GB 1 GB 1 GB 1 GB HD Livre 1 GB 850 MB 850 MB 850 MB 850 MB

Requerimentos de Software NetBeans Enterprise Pack 5.5 executando sobre Java 2 Platform Standard Edition Development Kit 5.0 ou superior (JDK 5.0, verso 1.5.0_01 ou superior), contemplando a Java Runtime Environment, ferramentas de desenvolvimento para compilar, depurar, e executar aplicaes escritas em linguagem Java. Sun Java System Application Server Platform Edition 9. Para Solaris, Windows, e Linux, os arquivos da JDK podem ser obtidos para sua plataforma em http://java.sun.com/j2se/1.5.0/download.html Para Mac OS X, Java 2 Plataform Standard Edition (J2SE) 5.0 Release 4, pode ser obtida diretamente da Apple's Developer Connection, no endereo: http:// developer.apple.com/java ( necessrio registrar o download da JDK). Para mais informaes: http://www.netbeans.org/community/releases/55/relnotes.html

Programao WEB

JEDITM

Colaboradores que auxiliaram no processo de traduo e reviso


Acio Jnior Alexandre Mori Alexis da Rocha Silva Allan Souza Nunes Allan Wojcik da Silva Angelo de Oliveira Aurlio Soares Neto Bruno da Silva Bonfim Carlos Fernando Gonalves Denis Mitsuo Nakasaki Emanoel Tadeu da Silva Freitas Felipe Gacho Jacqueline Susann Barbosa Joo Vianney Barrozo Costa Luciana Rocha de Oliveira Luiz Fernandes de Oliveira Junior Marco Aurlio Martins Bessa Maria Carolina Ferreira da Silva Massimiliano Giroldi Mauro Cardoso Mortoni Paulo Oliveira Sampaio Reis Pedro Henrique Pereira de Andrade Ronie Dotzlaw Sergio Terzella Thiago Magela Rodrigues Dias Vanessa dos Santos Almeida Wagner Eliezer Roncoletta

Auxiliadores especiais
Reviso Geral do texto para os seguintes Pases:
Brasil Tiago Flach Guin Bissau Alfredo C, Bunene Sisse e Buon Olossato Quebi ONG Asas de Socorro

Coordenao do DFJUG

Daniel deOliveira JUGLeader responsvel pelos acordos de parcerias Luci Campos - Idealizadora do DFJUG responsvel pelo apoio social Fernando Anselmo - Coordenador responsvel pelo processo de traduo e reviso, disponibilizao dos materiais e insero de novos mdulos Rodrigo Nunes - Coordenador responsvel pela parte multimdia Srgio Gomes Veloso - Coordenador responsvel pelo ambiente JEDITM (Moodle)

Agradecimento Especial
John Paul Petines Criador da Iniciativa JEDITM Rommel Feria Criador da Iniciativa JEDITM

Programao WEB

JEDITM

1. Objetivos
Uma Servlet uma classe Java usada para estender a capacidade dos servidores que hospedam aplicaes acessadas via modelo de programao Requisio/Resposta. uma classe Java que implementa a interface Servlet e aceita requisies que vm de outras classes Java, clientes Web ou outros Servlets, gerando, ento, respostas. As Servlets tambm so conhecidas como HTTP Servlet. Isto porque os Servlets so comumente usados com o HTTP atualmente, no h um protocolo cliente-servidor especfico. Para iniciar o uso das Servlets ser necessrio ter conhecimentos sobre programao Java, conceitos sobre cliente-servidor, HTML bsico e HTTP ( HyperText Transfer Protocol). Para criar uma Servlet ser necessrio importar para a nossa classe Java as classes de extenso padres que esto dentro dos pacotes javax.Servlet e javax.Servlet.http. O pacote javax.servlet contm a estrutura bsica de Servlet, enquanto que o pacote javax.Servlet.http utilizado como uma extenso da tecnologia para as Servlets que realizam requisies HTTP. Ao final desta lio, o estudante ser capaz de:

Obter uma viso geral da arquitetura Servlet Conhecer o ciclo de vida de uma Servlet Manipular requisies e respostas Configurar, empacotar e distribuir uma aplicao WEB Conhecer os parmetros de aplicaes WEB

Programao WEB

JEDITM

2. Conceitos Iniciais
2.1. Viso Geral da Arquitetura Servlet
Antes da tecnologia Servlet, o meio mais comum de adicionar funcionalidades a um servidor WEB era atravs do uso de CGI (Common Gateway Interface ou Interface de Entrada Comum). CGI fornece uma interface do servidor para uma classe externa permitindo que esta invoque o servidor a tratar as requisies do cliente. Porm, o CGI foi desenhado de forma que cada chamada para um recurso CGI fosse criado um novo processo no servidor; informao significante para a classe passada para este processo utilizando entradas padres e variveis de ambiente. Uma vez completada a requisio, o processo terminado, devolvendo o recurso ao sistema. O problema que incorre neste tipo de abordagem que isto impe pesadas requisies aos recursos do sistema limitando o nmero de usurios que a aplicao pode atender ao mesmo tempo. A Tecnologia Servlet foi projetada para contornar este problema inerente ao CGI e prover aos desenvolvedores uma soluo robusta em Java para criar aplicaes WEB. Ao invs de criar um processo peso-pesado no servidor a cada requisio do cliente, com Servlets h somente um processo para todas as requisies: o processo solicitado pelo continer da Servlet para executar. Quando uma nova requisio chega, o continer cria somente uma pequena thread para executar a Servlet. Servlets tambm so carregados em memria somente uma vez, ou seja, o continer carrega-os em memria na inicializao do servidor ou na primeira vez que o Servlet for requisitado para atender a um cliente, diferente do CGI, que para cada requisio do cliente carrega e descarrega os dados da classe em memria. Uma vez carregado em memria, est pronto para tratar as requisies dos clientes.

2.2. Primeira vista sobre Servlet


O cdigo a seguir mostra a estrutura de uma Servlet bsica que trata as requisies GET, assim como exibe o tradicional exemplo 'Hello World'. import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //"request" utilizado para ler os dados do formulrio HTML dos cabealhos // HTTP (um exemplo so os dados digitados e submetidos) // e outros dados que podem ser obtidos a partir da requisio do cliente. // "response" para especificar a linha e o cabealho de resposta do HTTP // (exemplo: especificar o tipo do contedo, definir cookies). // Tambm contm mtodos que permitem ao Servlet gerar respostas para // o cliente. PrintWriter out = response.getWriter(); out.println("<HTML> <TITLE>Hello Page</TITLE><BODY><br>"); out.println("<h1>Hello World!</h1>"); out.println("</BODY></HTML>"); } //"out" para enviar o contedo para o browser.

A primeira parte do cdigo trata da importao das classes em java.io (para PrintWriter, etc.), javax.Servlet e javax.Servlet.http. Os pacotes javax.servlet e javax.servlet.http fornecem
Programao WEB 5

JEDITM

interfaces e classes para escrever as Servlets (contm as classes HttpServlet, HttpServletRequest e HttpServletResponse). Por extenso da HttpServlet, herda os mtodos que so automaticamente chamados pelo servidor dependendo de certas condies que sero explicadas mais frente. Por polimorfismo por overriding destes mtodos podemos fazer com que nossa Servlet execute a funcionalidade que quisermos. Neste caso, o mtodo herdado do HttpServlet que sobrepomos o mtodo doGet. Simplificando, ele o mtodo que invocado pelo continer sempre que uma requisio GET feita de uma Servlet em particular. Relembrando do mdulo anterior, navegao de site, recuperao de documento, visualizao de pginas so exemplos de requisies GET. Logo, sempre que um usurio quiser ver a resposta da nossa Servlet deve invocar uma requisio GET. Ao visualizarmos o cdigo veremos que o mtodo doGet utiliza dois parmetros: um objeto HttpServletRequest e um objeto HttpServletResponse. No obstante, estes objetos vm de encontro com as necessidades do desenvolvedor. So criados e mantidos por um continer e so simplesmente passados no momento que este continer chama o mtodo doGet. A respeito disso, o mtodo doGet e outros mtodos, que sero discutidos depois, so similares ao mtodo public statis void main(Strings[] args) que utilizamos em classes Java baseadas em linhas de comando. No ser criado um array de String para passarmos com o mtodo; pois j foi realizado pelo ambiente de execuo. Os objetos HttpServletRequest e HttpServletResponse atendem aos desenvolvedores atravs das seguintes funcionalidades:

O objeto HttpServletRequest fornece acesso a todas as informaes a respeito das requisies do cliente incluindo todos os parmetros que so colocados nos cabealhos de requisies HTTP, mtodos de requisies HTTP, entre outros. O objeto HttpServletResponse contm todos mtodos necessrios utilizados pelos desenvolvedores para produzir respostas que sero enviadas de volta ao cliente. Isto inclui mtodos para definir o cabealho de resposta HTTP, declarar respostas do tipo MIME, bem como mtodos de recuperao de instncias de classes Java I/O as quais podemos utilizar diretamente para produzir a sada.

Voltando ao cdigo, vemos que, com a exceo dos comentrios, existem muitas linhas que usamos para executar a funcionalidade de exibir "Hello World!" ao usurio. Uma dessas linhas : PrintWriter out = response.getWriter(); e mltiplas chamadas para o mtodo out.println(). Por enquanto, pensemos no objeto out como quem leva nosso texto de sada para o browser do cliente. Com isto em mente, fcil ver como mltiplas chamadas ao mtodo out.println() produz o seguinte contedo:

Figura 1: Sada do HelloServlet

Programao WEB

JEDITM

2.3. Testando o exemplo Servlet


At agora vimos a exibio de uma sada em uma Servlet exemplo. Para iniciarmos a abstrao da implantao e configurao de Servlets faremos fazer uso de uma ferramenta automatizada disponibilizada por uma IDE. A IDE que utilizaremos utilizar em nosso exemplo o Sun Studio Enterprise 8, que livre para os membros do Sun Developer Network. Possui suporte completo para a tecnologia Servlets e especificaes JSP, bem como outras caractersticas adicionais. Daqui para frente assumiremos que o Enterprise 8 foi instalado com sucesso em seu computador. Antes de tudo, para o nosso Servlet exemplo, precisaremos criar um novo projeto de aplicao WEB. Para fazer isto, na barra de menu, selecione New -> Project. Na tela que aparece em seguida, selecione a categoria Web. Na direita, escolha New Web Application. A tela seguinte ir solicitar detalhes de nosso projeto. Para nosso primeiro teste com Servlets usaremos como nome "FirstServletProject" (Project Name), e utilizaremos os valores padres para os outros campos.

Figura 2: Criando um Novo Projeto de Aplicao Web

Aps criar um novo projeto WEB, a tela ser semelhante a figura a seguir:

Programao WEB

JEDITM

Figura 3: Novo Projeto de Aplicao Web

Para adicionar a nossa Servlet aplicao, pressione o boto direito do mouse na opo Source Packages, selecione New -> Servlet. Se a Servlet no aparecer no menu, ento selecione New -> File/Folder. Na tela seguinte, selecione a categoria Web e depois Servlet.

Figura 4: Adicionando Servlet para a aplicao

Programao WEB

JEDITM

A IDE ir mostrar uma srie de telas que questionaro sobre os detalhes da Servlet a ser criada. Na primeira tela, em Class Name digite FirstServlet. Em Package digite jedi.Servlet.

Figura 5: Modificando o nome da classe e o nome do pacote

Na tela que segue, mantenha os valores padres e ento pressione o boto Finish e isto ir resultar conforme a figura a seguir.

Figura 6: Servlet criada

Programao WEB

JEDITM

Podemos perceber que a IDE criou e parcialmente implementou o mtodo processRequest. Se clicarmos na caixa com um sinal de soma na parte esquerda inferior veremos que o processRequest simplesmente um mtodo que chamado pelos mtodos doGet e doPost. Isto significa que o contedo do mtodo processRequest forma a base da funcionalidade de nosso Servlet. Primeiro, removeremos todo o contedo do mtodo processRequest. Ento, copiaremos a nossa Servlet exemplo para dentro do mtodo doGet.

Figura 7: Novo mtodo processRequest

Para executar, pressione Shift + F6. A IDE ir ento empacotar, instalar e invocar a Servlet e automaticamente chamar o navegador WEB.

Programao WEB

10

JEDITM

3. Ciclo de Vida da Classe Servlet


Uma Servlet gerenciada atravs de um ciclo de vida bem definido descrito nas especificaes Servlet. O ciclo de vida do Servlet descreve como ele carregado, instanciado, inicializado, requisitado, destrudo e finalmente coletado (retirado de memria garbage collection). O ciclo de vida de um Servlet controlado pelo continer em que ele instalado. O ciclo de vida da Servlet permite ao continer resolver os problemas de endereamento e performance do CGI e as preocupaes com segurana da API de programao de um servidor baixo-nvel. Um continer deve poder executar todas as Servlets em uma nica JVM (Java Virtual Machine Mquina Virtual Java). Por esta razo, as Servlets podem eficientemente compartilhar dados entre si e evitar que uma acesse os dados particulares de outra. As Servlets podem tambm permitir persistncia entre requisies como objetos instanciados, utilizando assim menos memria do que processos completamente empacotados.

Figura 8: Ciclo de vida da Servlet

A figura mostra os principais eventos na vida de uma Servlet. importante notar que para cada um destes eventos h um mtodo que ser invocado pelo continer.

3.1. Instanciao
Neste estgio, a classe Servlet carregada para a memria e uma instncia criada pelo continer. Por padro, um continer pratica o que chamamos de lazy loading (carregamento tardio). Utilizando este mtodo, uma classe Servlet carregada para a memria, instanciada e inicializada somente depois que uma requisio for feita. Isto diminui o tempo de inicializao da aplicao, entretanto significa tambm que haver um pouco de atraso associado primeira requisio de cada Servlet. Se este comportamento for indesejvel, cada Servlet deve ser configurada para ser carregada juntamente com a aplicao. Isto ser discutido posteriormente quando abordarmos o descritor de carregamento. Como podemos ver na figura, uma Servlet passa pela fase de instanciao somente uma vez durante seu ciclo de vida. Isto significa que o atraso associado ao seu carregamento em memria acontece somente uma vez. Isto mostra a vantagem desta sobre outras tecnologias. O mtodo relevante que o continer ir chamar neste estgio ser o construtor. No recomendado que se coloque qualquer cdigo no construtor. A maioria das funcionalidades que os desenvolvedores querem adicionar aos construtores envolvem definio de objetos ou inicializao

Programao WEB

11

JEDITM

de variveis. Servlets possui uma fase separada para este tipo de atividade.

3.2. Inicializao
Nesta fase, Servlet primordial para o uso na aplicao. Assim como a fase de instanciao, uma Servlet passa por este estgio somente uma vez. Isto s ocorre aps a fase em que nosso objeto inicializado ao ser chamado pela Servlet. O mtodo que chamado pelo continer neste ponto o mtodo init(). A assinatura completa do mtodo apresentada abaixo. public void init(ServletConfig config) Como podemos ver, este mtodo tem um parmetro: uma instncia do objeto ServletConfig. Este objeto contm informaes sobre a configurao da Servlet bem como fornece meios para que a Servlet acesse informaes da aplicao e seus recursos. Como mencionado anteriormente, qualquer cdigo de configurao ou inicializao no deve ser colocado na rea do construtor, em vez disso, deve ser colocado dentro do mtodo init. Se um desenvolvedor implementar este mtodo, importante que realize uma chamada ao super.init(config). Isto garante que a ao de inicializao padro da Servlet seja executada e que sua configurao seja apropriadamente definida. Aps a inicializao, a Servlet estar apta a receber as requisies dos clientes. Este mtodo somente ser chamado novamente quando o servidor recarregar a Servlet. O servidor no pode recarregar uma Servlet at que esta seja destruda atravs do mtodo destroy.

3.3. Pronta
Esta a fase quando uma Servlet est no auge do seu ciclo de vida. Nesta, a Servlet pode ser chamada repetidamente pelo continer para prover sua funcionalidade. O mtodo chamado pelo continer nesta fase service() e possui a seguinte assinatura: public void service(ServletRequest req, ServletResponse res) Os objetos ServletRequest e ServletResponse passados para este mtodo provem mtodos para extrair informao das requisies dos usurios e mtodos para gerar as respostas. Um detalhe importante a ser observado, o continer realiza repetidas chamadas ao mtodo service usando threads separadas. Geralmente, h somente uma instncia ativa da Servlet consumindo espao em memria e atendendo s diversas requisies. Esta outra vantagem que o Servlet Java possui tambm uma das principaisrazes porque uma Servlet (e o seu mtodo service) projetado para conter um thread-safe. Para Servlets especficos HTTP (Servlets estendendo HttpServlet), os desenvolvedores no devem implementar o mtodo service diretamente. Ao invs disto, devem implementar qualquer um dos seguintes mtodos: public public public public void void void void doGet(HttpServletRequest req, HttpServletResponse res) doPost(HttpServletRequest req, HttpServletResponse res) doPut(HttpServletRequest req, HttpServletResponse res) doTrace(HttpServletRequest req, HttpServletResponse res)

Cada um destes mtodos corresponde a um mtodo HTTP especfico (GET, POST, ...). O mtodo apropriado ento chamado quando o Servlet recebe a requisio HTTP. J que a maioria das chamadas HTTP, que os desenvolvedores devem se preocupar, so dos mtodos GET ou POST, Servlets podem implementar doGet, doPost ou ambos.

3.4. Destruio
Em algumas ocasies, quando o continer ficar sem memria ou detectar que a quantidade de

Programao WEB

12

JEDITM

memria livre possui pode gerar algum problema, o continer tentar liberar memria destruindo uma ou mais instncias da Servlet. Qual ser removida determinado pelo continer e o desenvolvedor no tem controle direto. Um continer poder liberar uma instncia da Servlet como parte de seu processo de desligamento. Quando a Servlet est para ser removida de um gerenciamento do continer, ela est na fase de destruio. O mtodo chamado pelo continer, antes de realizar isto, o destroy(). Aqui, na nossa Servlet deveria ser codificado para explicitamente liberar os recursos utilizados (ex. Conexes com o Banco de Dados).

3.5. Garbage Collection


Esta fase do ciclo de vida de uma Servlet equivalente a de qualquer outro objeto Java. Relembrando que esta fase ocorre antes que um objeto seja retirado da memria. Os desenvolvedores no tm controle direto quando isso ir ocorrer. O mtodo do objeto chamado nesta fase o finalize().

Programao WEB

13

JEDITM

4. Manipulando Requisies e Respostas


O principal objetivo de uma Servlet prover contedo dinmico para o usurio. Por definio, o contedo dinmico muda em resposta a diversas condies. Exemplos dos quais so as requisies especficas de usurio, a hora, temperatura. Para dar a Servlet acesso aos dados de uma requisio, esta provida em uma instncia do objeto ServletRequest que esconde estes detalhes. Servlets baseados em HTTP possuem uma subclasse, HTTPServletRequest, que prov mtodos adicionais para obter informao especfica do HTTP, como informao sobre cookies, detalhes de cabealhos, entre outros.

4.1. Dados e Parmetros de Formulrio


4.1.1. Mtodo request.getParameter Um dos cenrios que freqentemente requer mais frequentemente contedo dinmico quando queremos que nossa aplicao responda aos dados do usurios apresentados em um formulrio. Veja o exemplo seguinte:

Figura 9: Entrada do Nome do Usurio

Dado o seguinte formulrio, mostrado na figura anterior, que obtm o nome do usurio, queremos produzir uma resposta customizada para qualquer nome submetido. Para este e outros cenrios similares, Java prov o mtodo HttpServletRequest. Este mtodo possui a seguinte assinatura: public String getParameter(String parameterName) Este mtodo obtm o nome do parmetro que desejamos obter e retorna o valor da String que representa este parmetro. Abaixo segue um cdigo exemplo que obtm o nome do usurio e d sada em um simples cumprimento, seguido pelo HTML usado para mostrar o formulrio. public class GetParameterServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // retorna o valor solicitado pelo usurio String userName = request.getParameter("userName"); // retorna um objeto PrintWriter e utiliza-o para a mensagem de sada PrintWriter out = response.getWriter(); out.println("<HTML><BODY><H1>"); out.println("HELLO AND WELCOME, " + userName + "!"); out.println("</H1></BODY></HTML>"); out.close(); } } Temos a seguir, o cdigo para HTML exemplo utilizado para mostrar o formulrio: <HTML>
Programao WEB 14

getParameter no objeto

JEDITM

<TITLE>Halloa!</TITLE> <BODY> <form action="GetParameterServlet" method="post"> Enter user name: <input type="text" name="userName"/> <br/> <input type="submit" value="Greet me!"/> </form> </BODY> </HTML> Ao entrar com o valor "JEDI" no formulrio, obtemos o seguinte resultado:

Figure 10: Sada do GetParameterServlet

4.1.2. Mtodo request.getParameterValues Existem momento que necessitamos recuperar dados de um formulrio com mltiplos elementos com o mesmo nome. Neste caso, usando apenas o mtodo getParameter descrito anteriormente, ser retornado apenas o valor do primeiro elemento com aquele nome. Para recuperar todos os valores, usamos o mtodo getParameterValues: public String[] getParameterValues(String parameterName) Este mtodo similar ao que acabamos de discutir. Tambm recebe o nome do parmetro que queremos recuperar o valor. Desta vez, ao invs de uma nica String, retorna um array de Strings. Este um exemplo: public class GetParameterValuesServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExceptionm IOException{ String paramValues[] = request.getParameterValues("sports"); StringBuffer myResponse = new StringBuffer(); PrintWriter out = response.getWriter(); out.println("<HTML><TITLE>Your choices</TITLE>"); out.println("<BODY><H1>Your choices were : </H1>"); for (int i = 0; i < paramValues.length; i++) { out.println("<br/><li>"); out.println(paramValues[i]); } out.println("</BODY></HTML>");

A seguir, temos o cdigo para o HTML usado para mostrar o formulrio: <html> <title>Choice selection</title> <body> <H1>What sports activities do you perform?</h1> <form action="GetParameterValuesServlet" method="get"> <input type="checkbox" name="sports" value="Biking"> Biking
Programao WEB 15

JEDITM

<br/> <input <br/> <input <br/> <input <br/> <input <br/> <input </form> </body> </html>

type="checkbox" name="sports" value="Table Tennis"> Table Tennis type="checkbox" name="sports" value="Swimming"> Swimming type="checkbox" name="sports" value="Basketball"> Basketball type="checkbox" name="sports" value="Others"> Others type="submit">

Figure 11: Recuperando dados de um formulrio com mltiplos elementos

Se as opes Biking", "Table Tennis", e "Swimming" fossem escolhidas, a sada seria:

Figure 12: Sada do GetParameterValuesServlet

4.1.3. request.getParameterNames Algumas vezes necessitamos que a Servlet conhea o nome de um ou mais parmetros do formulrio sem ter que codific-los dentro do Servlet. Neste caso, podemos usar o mtodo

Programao WEB

16

JEDITM

getParameterNames. public Enumeration getParameterNames() O objeto Enumeration que este mtodo retorna contm todos os nomes de parmetros contidos nesta requisio do usurio.

4.2. Recuperando a informao da URL de Requisio


Relembrando, uma requisio HTTP composta pela seguintes partes: http://[host]:[porta]/[caminhoDaRequisio]?[queryString] Podemos recuperar os valores atuais de cada uma destas partes da requisio do usurio chamando alguns mtodos do objeto HttpServletRequest.

Host request.getServerName() Porta request.getServerPort() Caminho da Requisio em Java, o caminho da requisio dividida em 2 componentes lgicos : Contexto o contexto de uma aplicao WEB. Pode ser recuperado chamando request.getContextPath() Informao do caminho o resto de uma requisio depois do nome do contexto. Pode ser recuperado chamando request.getPathInfo() Query String request.getQueryString()

Ento, por exemplo, com uma URL de requisio: http://www.myjedi.net:8080/HelloApp/greetUser?name=Jedi Se chamarmos os mtodos mencionados, os seguintes resultados sero exibidos: request.getServerName() request.getServerPort() request.getContextPath() request.getPathInfo() request.getQueryString() www.myjedi.net 8080 HelloApp greetUser name=Jedi

4.3. Informao de Cabealho


Informao do cabealho pode ser recuperada pela Servlet chamando os seguintes mtodos em HttpServletRequest:

getHeader(String nome) retorna o valor do cabealho especificado como um String. Se o cabealho especificado no existir, este mtodo retorna null. getHeaders(String nome) similar ao getHeader(). Entretanto, ele recupera todos os valores do cabealho especificado como um objeto Enumeration. getHeaderNames() - este mtodo retorna os nomes de todos os cabealhos includos na requisio HTTP como um objeto Enumeration. getIntHeader(String nome) retorna o valor de um cabealho especificado como um int. Se o cabealho especificado no existir na requisio, o mtodo retorna -1. getDateHeader(String nome) retorna o valor de um cabealho especificado como um valor long que representa um objeto Date. Se o cabealho especificado no existir, este mtodo retorna -1. Se o cabealho no puder ser convertido em um objeto do tipo Date, este mtodo lana uma IllegalArgumentException.

Programao WEB

17

JEDITM

4.4. Gerao da Sada


Em todos os exemplos anteriores, conseguimos gerar sadas dinmicas para o usurio. Fizemos isto usando mtodos do objeto HttpServletResponse. At agora, usamos o mtodo getWriter. Este mtodo retorna um objeto PrintWriter associado com nossa resposta para o usurio. Para ajudar a colocar as coisas na perspectiva correta, devemos lembrar que o objeto System.out que usamos regularmente para dar sada no contedo para o console tambm uma instncia do objeto PrintWriter. Ou seja, eles se comportam quase da mesma maneira: se voc tiver uma instncia do objeto PrintWriter, simplesmente chame os mtodos print ou println para gerar a sada. O cdigo da nossa primeira classe Servlet ser visto a seguir com o cdigo de sada em negrito. import java.io.*; import javax.Servlet.*; import javax.Servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // objeto "out" utilizado para enviar o contedo para o browser PrintWriter out = response.getWriter(); out.println("<HTML> <TITLE>Hello Page</TITLE><BODY><br>"); out.println("<h1>Hello World!</h1>"); out.println("</BODY></HTML>");

Outros mtodos importantes no objeto HttpServletResponse so:

setContentType informa ao navegador do cliente o tipo MIME da sada que ele ir receber. Todo o contedo que geramos at agora foi HMTL. Poderamos facilmente enviar outros tipo de contedo como JPEG, PDF, DOC, XLS, etc. Para contedo que no texto, os mtodos print do objeto PrintWriter que estamos usando at agora so insuficientes. Para gerar sada no textual, fazemos uso de outro mtodo. getOutputStream este mtodo recupera uma instncia do objeto OutputStream associado com nossa resposta para o usurio. Com o OutputStream, podemos usar os objetos e mtodos padro de E/S Java para produzir todos os tipos de sada.

Abaixo segue um cdigo exemplo que ir gerar um arquivo JPG contido em uma aplicao web para o usurio. public class JPEGOutputServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) { // definir um array de byte para armazenamento dos dados byte bufferArray[] = new byte[1024]; // retornar o ServletContext que ser utilizado para o retorno ServletContext ctxt = getServletContext(); // informar ao browser que est enviando uma imagem response.setContentType("image/gif"); // criar o objeto de sada em stream que ser produzida ServletOutputStream os = response.getOutputStream(); // criar o objeto de recurso para o input stream InputStream is = ctxt.getResource("/WEB-INF/images/logo.gif").openStream(); // ler o contedo do recurso de escrita e gerar a sada int read = is.read(bufferArray); while (read != -1) { os.write(bufferArray);
Programao WEB 18

JEDITM

read = is.read(bufferArray); } // fechar os objetos utilizados is.close(); os.close();

Programao WEB

19

JEDITM

5. Configurao, Empacotamento e Distribuio


Em todos os exemplos realizados, usamos as ferramentas da IDE Sun Enterprise Studio 8 para facilitar os detalhes da configurao, do empacotamento e da instalao da aplicao WEB. Iremos agora, aprofundar estes detalhes.

5.1. Configurao da Aplicao WEB


A especificao Servlet, define um arquivo XML chamado web.xml que atua como um arquivo de configurao para as aplicaes WEB. Este arquivo chamado de descritor de distribuio. <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>FirstServlet</servlet-name> <servlet-class>jedi.Servlet.FirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>FirstServlet</servlet-name> <url-pattern>/FirstServlet</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file> index.jsp </welcome-file> </welcome-file-list> </web-app> Temos acima um exemplo do arquivo web.xml utilizado no projeto FirstServlet. Usaremos como ponto de partida na explorao deste arquivo. NOTA: O arquivo web.xml da aplicao WEB construda pela IDE, pode ser encontrado expandindo a aba de Arquivos de Configurao na View -> Project. <web-app> Esta linha utilizada como elemento raiz do arquivo de configurao e como uma declarao das informaes necessrias (at seus atributos), para o continer poder reconhecer o arquivo como um arquivo descritor vlido. <servlet> Cada instncia deste elemento define uma Servlet para ser usada pela aplicao. Possui os seguintes nodes filhos:

<servlet-name> - Um nome lgico fornecido pelo desenvolvedor que ser usado para todas as referncias futuras para a Servlet. <servlet-class> - O nome da classe Servlet completamente qualificado. <load-on-startup> Opcional. Tendo uma entrada e valor para este elemento, informa ao continer que a Servlet deve ser construda e inicializada durante o incio do continer ou aplicao, ultrapassando o lento carregamento do cdigo. O valor para este elemento um nmero que dita o ordem de carregamento comparando ao <load-on-startup> de outras Servlets.

<servlet-mapping>

Programao WEB

20

JEDITM

Cada instncia deste elemento define um mapeamento para uma Servlet. Possui os seguintes nodes filhos:

<servlet-name> - O nome lgico da Servlet para ser mapeado. Deve ser definido previamente no arquivo descritor. <url-pattern> - A URL utilizada para que esta Servlet seja mapeada. O valor /*, far com que todas as solicitaes da aplicao seja redirecionada para seu Servlet. No exemplo dado, a URL /FirstServlet. Isto significa que todas as solicitaes de URL para http://[host]:[port]/FirstServletProject/FirstServlet ser manipulado por FirstServlet.

Lembre-se que todas as definies de Servlet devem ser fornecidas antes de adicionar quaisquer Servlet-mappings. <session-config> Este elemento define os detalhes do gerenciamento da configurao da seo. <welcome-file-list> Este elemento define um componente WEB que ser automaticamente carregado se o usurio entrar com uma solicitao para o servidor sem especificar um recurso em particular. Por exemplo, uma solicitao para http://[host]:[port]/FirstServletProject originar o arquivo aqui definido para ser carregado. Mais de um arquivo pode ser especificado nesta lista. Somente o primeiro arquivo visvel para o continer WEB ser carregado.

5.2. Empacotando a Aplicao da WEB


Observaremos novamente a estrutura de uma aplicao WEB como indicada pela especificao Servlet:
Contm HTML, imagens, outros contedos estticos, e JSP Contm informaes sobre a aplicao (opcional) Contm pastas que no sero vistas no navegador Contm classes Servlets criadas para a aplicao Contm arquivos de bibliotecas (JAR) que podem ser utilizadas pela aplicao Arquivo XML que armazena as configuraes da aplicao
Figura 13: Estrutura do Diretrio de uma aplicao Java WEB

A aplicao pode ser instalada em um servidor fazendo uso de um arquivo de WAR (WEB ARchive). Arquivos WAR so o mesmo que JAR (Java ARchive); contm o cdigo de aplicao comprimido utilizando o formato ZIP. 5.2.1. Gerando arquivos WAR a partir de projetos existentes no Sun Studio Enterprise muito simples produzir o arquivo WAR contendo nossa aplicao web a partir de um projeto existente no Sun Studio Enterprise 8. Basta pressionar o boto direito do mouse no nome do projeto em Project view, e selecionar Build Project. A IDE ento proceder o empacotamento da aplicao.

Programao WEB

21

JEDITM

Figura 14: Empacotando o projeto

A IDE informar se a operao de construo foi bem sucedida, e o local onde o arquivo WAR foi criado.

Figura 15: Construo com sucesso

Programao WEB

22

JEDITM

5.2.2. Usando um arquivo de construo Ant para empacotar a aplicao Alm de usar uma IDE para empacotar a aplicao da WEB, podemos tambm fazer uso de uma ferramenta de construo para automatizar a compilao e o processo de empacotamento. Uma ferramenta de construo que possui uma ampla utilizao chamada Apache Ant. um projeto de cdigo aberto da Apache Software Foundation, e seu download pode ser realizado no endereo http://ant.apache.org. Basicamente, Ant l em um arquivo de construo (chamado build.xml). Este arquivo de construo composto de targets (alvos), as quais essencialmente definem atividades lgicas que podem ser executadas pelo arquivo de construo. Estes targets so por sua vez, compostos de uma ou mais tarefas que definem os detalhes de como os targets realizam suas atividades. Requisitos do arquivo de construo:

Deve ser locado na Raiz do Projeto de acordo com a estrutura do diretrio recomendado pela Apache Software Foundation para desenvolvimento de aplicao WEB. Adicionalmente, deve existir tambm um diretrio lib na Raiz do Projeto que conter todas dependncias JAR da aplicao. Deve existir um arquivo chamado build.properties no mesmo diretrio que o roteiro de construo e deve conter valores para as seguintes propriedades:

app.name nome da aplicao / projeto appserver.home o diretrio de instalao da instncia Sun Application Server 8.1

Segue a estrutura de diretrio recomendado para desenvolvimento de aplicao web:


Contm a aplicao em uma estrutura de diretrio conhecida pelo continer. Localizao do arquivo WAR Documentao que usada pelo time de desenvolvedores Arquivos fonte Java Contedo da aplicao (HTML, JSP), base da raiz do documento do projeto Contm arquivos de configurao como o descritor de desenvolvimento (web.xml), descritores de biblioteca de tags, etc. Figura 16: Estrutura de diretrio recomendada para o desenvolvimento de aplicao WEB

Esta estrutura de diretrio foi projetada para ser distinta da estrutura de diretrio exigido pela especificao Servlet. A Apache recomenda por possuir as seguintes vantagens:

O contedo de diretrio de fonte so mais facilmente administrados, deslocado, ou aprovado se a verso de desenvolvimento no misturada. O controle de cdigo de fonte mais fcil de administrar em diretrios que contenham s arquivos de fonte (nenhuma classe compilada, etc.). Os arquivos que compem a distribuio da aplicao mais fcil selecionar quando a hierarquia de desenvolvimento for separada.

Pode ser difcil compreender primeira vista. Para ajudar a compreenso, todo os requisitos para compilar e empacotar nosso exemplo FirstServlet fornecido na pasta samples/FirstServlet. Para realizar o empacotamento de uma aplicao usando esta estrutura, execute a seguinte instruo (no mesmo diretrio contendo o arquivo de construo). ant dist Esta instruo chamar o target dist no arquivo de construo, o qual gerar o arquivo WAR e o colocar no diretrio dist. Este arquivo WAR pode, ento, ser carregado no continer usando as ferramentas administrativas oferecidas pelo continer.
Programao WEB 23

JEDITM

5.3. Desenvolvimento em Servidor


Os continers Servlet geralmente contm ferramentas administrativas que podem ser usadas para desenvolver aplicaes WEB. Neste momento, veremos os passos exigidos para desenvolver o arquivo WAR gerado no aplicativo Sun Application Server 8.1.

Primeiro passo, execute o log-in no console administrativo. Isto pode ser acessado atravs da seguinte URL em seu navegador: http://localhost:[ADMIN_PORT] onde ADMIN_PORT a porta configurada durante a instalao para manipular os assuntos administrativos.

Figure 17: Instalando um arquivo WAR

Segundo, selecione a aba Web Aplications, no painel esquerda Pressione o boto Deploy encontrado no painel direita Na tela seguinte, pressione o boto Browse para selecionar o arquivo WAR para instalar Pressione o boto Next encontrado na parte superior direita Pressione o boto de Finish na prxima tela Parabns, sua aplicao foi instalada

Programao WEB

24

JEDITM

6. Servlet e Parmetros de Aplicao


6.1. ServletConfig e Parmetros de Inicializao da Servlet
O objeto da classe ServletConfig passado para uma Servlet especfica durante sua fase de inicializao. Usando isto, uma Servlet pode recuperar informaes especficas para si mesmo (parmetros de inicializao). A Servlet tambm pode ganhar acesso a uma instncia do objeto de ServletContext usando o objeto da classe ServletConfig. Os parmetros de inicializao so de grande uso, especialmente quando lidamos com informaes que podem variar com cada desenvolvimento da aplicao. Alm disso, fornecendo dados para a Servlet como parmetros, evitamos a codificao desses parmetros diretamente na Servlet, permite aos desenvolvedores a habilidade de mudar o comportamento da Servlet sem ter que recompilar o cdigo. Podemos adicionar parmetros de inicializao para a Servlet especificando-os na definio do deployment descriptor do Servlet. A seguir, temos uma amostra: ... <Servlet> <Servlet-name>FirstServlet</Servlet-name> <Servlet-class>jedi.Servlet.FirstServlet</Servlet-class> <init-param> <param-name>debugEnabled</param-name> <param-value>true</param-value> </init-param> </Servlet> ... As tags <init-param> e </init-param> informam ao continer que estamos comeando e terminando a definio de parmetro, respectivamente. <param-nome> define o nome do parmetro, e <param-value> define seu valor. Para ter acesso aos parmetros da Servlet, devemos primeiro obter o acesso ao seu objeto ServletConfig, que pode ser feito recuperado solicitando ao mtodo getServletConfig(). Aps isso, o valor de parmetro poder ser recuperado atravs de uma String chamando o mtodo getInitParameter() e fornecendo o valor de <param-nome> como o parmetro. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletConfig config = getServletConfig(); String isDebugEnabled = config.getInitParameter("debugEnabled"); if (isDebugEnabled.equals("true") { ... } A amostra de cdigo acima ilustra o procedimento.

6.2. ServletContext e Parmetros de Aplicao


O objeto de ServletContext informa a Servlet o acesso ao contexto de aplicao. Pense sobre o contexto de aplicao como a rea na qual as aplicaes se movem. Esta rea fornecida pelo continer para cada aplicao WEB. Com cada contexto da aplicao sendo diferente uma do outra, uma aplicao no pode acessar o contexto de outra aplicao. Ter acesso a este contexto importante, porque atravs deste, a Servlet pode recuperar parmetros da aplicao. possvel tambm armazenar dados que podem ser recuperados por quaisquer componentes na aplicao. Do mesmo modo que parmetros de inicializao podem ser fornecidos para Servlets individuais, eles tambm podem ser fornecidos para uso pela aplicao inteira. <context-param>
Programao WEB 25

JEDITM

<param-name>databaseURL</param-name> <param-value>jdbc:postgresql://localhost:5432/jedidb</param-value> </context-param> O cdigo acima exemplifica como adicionar diferentes parmetros de aplicao. O elemento XML usado aqui <context-param>. Cada instncia de tal elemento define um parmetro para uso pela aplicao inteira. <param-name> e <param-value> trabalham da mesma maneira que a tag <init-param>. NOTA: Novamente, lembre-se que a especificao restrita quanto a ordenao de seus elementos dentro do descritor de desenvolvimento. Para manter o arquivo web.xml vlido, todas as entradas <context-param> devem ser localizadas ANTES de quaisquer entradas <Servlet>. O procedimento para recuperar os valores dos parmetros bem parecido com o utilizado para recuperar os parmetros de Servlets especficas. uma instncia de ServletContext que a Servlet deve manipular. Isto pode ser recuperado chamando o mtodo getServletContext() de uma instncia do objeto ServletConfig da Servlet. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext ctxt = getServletConfig().getServletContext(); String jdbcURL = ctxt.getInitParameter("databaseURL"); // cdigo customizado setURL(jdbcURL); ... }

6.3. Resumo

A tecnologia Servlets so a soluo Java para a produo de contedo dinmico para a WEB em resposta a tecnologia CGI. Servlets possui vrias vantagens sobre CGI, incluindo uma reduzida na rea de ocupao de memria e menos despesa para cada solicitao. Uma Servlet est completamente administrada pelo seu continer. O nico cdigo necessrio para os desenvolvedores a funcionalidade da implementao. Para criar Servlets, os desenvolvedores devem criar subdivises de classe de HttpServlet e seus lugares de implementaes funcionais em quaisquer dos mtodos, doGet ou doPost. Detalhes de pedido podem ser recuperados por HttpServletRequest, e mtodos geradores de resposta podem ser acessados por HttpServletResponse. Estes so passados como parmetros para doGet e doPost. Para instalar Servlets no continer WEB, necessrio criar arquivos WAR. Este processo de empacotamento pode ser automatizado por qualquer IDE ou pelo uso de uma ferramenta de construo. Descritores do desenvolvimento so partes essenciais da aplicao. Eles devem ser localizados no diretrio de aplicao WEB-INF e seguir determinadas regras. Parmetros podem ser fornecidos pela aplicao usando o descritor de desenvolvimento e recuperado usando os mtodos em instncias ServletConfig ou ServletContext.

Programao WEB

26

JEDITM

7. Exerccios
7.1. Perguntas sobre o Ciclo de Vida da Servlet
Responda s seguintes perguntas sobre as fases da Servlet: 1. Quais so as 5 fases do ciclo de vida de uma Servlet? 2. Quais so os mtodos associados a cada fase do ciclo de vida de uma Servlet? 3. Por que o cdigo colocado no mtodo service de uma Servlet precisa ser thread-safe? 4. Quando uma Servlet destruda? 5. Quantas vezes o cdigo colocado dentro do mtodo init() do Servlet pode ser chamado? E o cdigo dentro do mtodo service()? 6. Caso a Servlet estenda a classe HttpServlet, quais implementar para produzir a funcionalidade necessria? mtodos adicionais poderemos

7.2. Exerccios de Manipulao de Requisio/Gerao de Resposta


1. Dado o seguinte formulrio: <HTML> <BODY> <form action="AddServlet" method="post"> Enter number 1 : <input type="text" name="operand1"/> </br> Enter number 2 : <input type="text" name="operand2"/> </br> <input type="submit" value="Perform addition"/> </form> </BODY> </HTML> Crie uma Servlet chamado AddServlet que ir recuperar 2 nmeros dados pelo usurio, adicioneos, e gere o resultado. 2. Dado o seguinte formulrio: <html> <title>Menu</title> <body> <H1>Which food items do you want to order?</h1> <form action="MenuSelectionServlet" method="post"> <table> <tr> <td><input type="checkbox" name="order" value="20"> <td> P 20 </td> </tr><tr> <td><input type="checkbox" name="order" value="25"> <td> P 25 </td> </tr><tr> <td><input type="checkbox" name="order" value="15"> <td> P 15 </td> </tr><tr> <td><input type="checkbox" name="order" value="70"> <td> P 70 </td> </tr><tr> <td><input type="submit"></td> </tr> </table> </form> </body> </html>
Programao WEB

Sundae </td> Reg. Burger </td> Dessert Pie </td> Rice Meal </td>

27

JEDITM

Crie uma Servlet chamado MenuSelectionServlet que ir recuperar as selees feitas pelo usurio, adicionar os seus valores, e retornar o resultado computado para o usurio.

7.3. Perguntas sobre implementao


1. Identifique o elemento no arquivo web.xml que ser responsvel por: a) Conter o nome lgico usado para se referir a uma Servlet. b) Ser o elemento root do arquivo de configurao. c) Definir um mapeamento entre uma Servlet e uma solicitao do usurrio. 2. Reorganize as seguintes informaes no ordem correta de seu aparecimento dentro de um arquivo XML: session-config servlet servlet-mapping welcome-file-list 3. Suponha termos uma Servlet cujo nome TrialServlet, crie um mapeamento de modo que TrialServlet ser chamada para cada pedido: http://[host]/[context]/myExerciseServlet. 4. O que so arquivos WAR? 5. Dado um projeto WEB existente em nossa IDE, como um arquivo WAR pode ser gerado?

Programao WEB

28

JEDITM

Parceiros que tornaram JEDITM possvel

Instituto CTS Patrocinador do DFJUG. Sun Microsystems Fornecimento de servidor de dados para o armazenamento dos vdeo-aulas. Java Research and Development Center da Universidade das Filipinas Criador da Iniciativa JEDITM. DFJUG Detentor dos direitos do JEDITM nos pases de lngua portuguesa. Banco do Brasil Disponibilizao de seus telecentros para abrigar e difundir a Iniciativa JEDITM. Politec Suporte e apoio financeiro e logstico a todo o processo. Borland Apoio internacional para que possamos alcanar os outros pases de lngua portuguesa. Instituto Gaudium/CNBB Fornecimento da sua infra-estrutura de hardware de seus servidores para que os milhares de alunos possam acessar o material do curso simultaneamente.

Programao WEB

29

Você também pode gostar