( Informatica) - Apostila Servlet Jsp

Embed Size (px)

Citation preview

  • UNIVERSIDADE FEDERAL DE VIOSA

    DEPARTAMENTO DE INFORMTICA

    Apostila Servlet/JSP

    Alcione de Paiva Oliveira

    2001

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    1

    SumrioI Servlets e JSP...............................................................................................................2

    SERVLETS ................................................................................................................................ 2Applets X Servlets ............................................................................................................... 3CGI X Servlets .................................................................................................................... 4

    A API SERVLET....................................................................................................................... 4Exemplo de Servlet ............................................................................................................. 6

    COMPILANDO O SERVLET......................................................................................................... 8Instalando o Tomcat........................................................................................................... 8

    PREPARANDO PARA EXECUTAR O SERVLET............................................................................ 12Compilando o Servlet ....................................................................................................... 12Criando uma aplicao no Tomcat .................................................................................. 12

    EXECUTANDO O SERVLET ...................................................................................................... 13Invocando diretamente pelo Navegador........................................................................... 13Invocando em uma pgina HTML.................................................................................... 14Diferenas entre as requisies GET e POST.................................................................. 14

    CONCORRNCIA..................................................................................................................... 15OBTENDO INFORMAES SOBRE A REQUISIO .................................................................... 17LIDANDO COM FORMULRIOS................................................................................................ 19LIDANDO COM COOKIES......................................................................................................... 21LIDANDO COM SESSES ......................................................................................................... 24JSP......................................................................................................................................... 28

    PHP X JSP ....................................................................................................................... 29ASP X JSP ........................................................................................................................ 30Primeiro exemplo em JSP ................................................................................................ 30Executando o arquivo JSP................................................................................................ 31Objetos implcitos............................................................................................................. 32Tags JSP........................................................................................................................... 33Comentrios ..................................................................................................................... 37Diretivas ........................................................................................................................... 37Extraindo Valores de Formulrios................................................................................... 40Criando e Modificando Cookies....................................................................................... 41Lidando com sesses ........................................................................................................ 43O Uso de JavaBeans......................................................................................................... 45

    REENCAMINHANDO OU REDIRECIONANDO REQUISIES ....................................................... 53UMA ARQUITETURA PARA COMRCIO ELETRNICO ............................................................... 55

    Tipos de aplicaes na WEB ............................................................................................ 55Arquitetura MVC para a Web .......................................................................................... 55Agenda Web: Um Exemplo de uma aplicao Web usando a arquitetura MVC.............. 58

    Bibliografia.....................................................................................................................79Links ..............................................................................................................................80

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    2

    I Servlets e JSPServlets e JSP so duas tecnologias desenvolvidas pela Sun para

    desenvolvimento de aplicaes na Web a partir de componentes Java queexecutem no lado servidor. Essas duas tecnologias fazem parte da plataformaJ2EE (Java 2 Platform Enterprise Edition) que fornece um conjunto detecnologias para o desenvolvimento de solues escalveis e robustas para aWeb. Neste livro abordaremos apenas as tecnologias Servlets e JSP, sendo osuficiente para o desenvolvimento de sites dinmicos de razovelcomplexidade. Se a aplicao exigir uma grande robustez e escalabilidade oleitor deve considerar o uso em conjunto de outras tecnologias da plataformaJ2EE.

    Servlets

    Servlets so classes Java que so instanciadas e executadas emassociao com servidores Web, atendendo requisies realizadas por meio doprotocolo HTTP. Ao serem acionados, os objetos Servlets podem enviar aresposta na forma de uma pgina HTML ou qualquer outro contedo MIME.Na verdade os Servlets podem trabalhar com vrios tipos de servidores e no sservidores Web, uma vez que a API dos Servlets no assume nada a respeito doambiente do servidor, sendo independentes de protocolos e plataformas. Emoutras palavras Servlets uma API para construo de componentes do ladoservidor com o objetivo de fornecer um padro para comunicao entre clientese servidores. Os Servlets so tipicamente usados no desenvolvimento de sitesdinmicos. Sites dinmicos so sites onde algumas de suas pginas soconstrudas no momento do atendimento de uma requisio HTTP. Assim possvel criar pginas com contedo varivel, de acordo com o usurio, tempo,ou informaes armazenadas em um banco de dados.

    Servlets no possuem interface grfica e suas instncias so executadasdentro de um ambiente Java denominado de Container. O container gerencia asinstncias dos Servlets e prov os servios de rede necessrios para asrequisies e respostas. O container atua em associao com servidores Webrecebendo as requisies reencaminhada por eles. Tipicamente existe apenasuma instncia de cada Servlet, no entanto, o container pode criar vrios threads

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    3

    de modo a permitir que uma nica instncia Servlet atenda mais de umarequisio simultaneamente A figura XX fornece uma viso do relacionamentodestes componentes.

    Figura I-1. Relacionamento entre Servlets, container e servidor Web

    Servlets provem uma soluo interessante para o relacionamentocliente/servidor na Internet, tornando-se uma alternativa para a implantao desistemas para a Web. Antes de entrarmos em detalhes na construo deServlets, compararemos esta soluo com outras duas solues possveis paraimplantao de aplicaes na Internet.

    Applets X Servlets

    Apesar de ser uma soluo robusta existem problemas no uso de Applets paravalidao de dados e envio para o servidor. O programador precisa contar como fato do usurio possuir um navegador com suporte a Java e na versoapropriada. Voc no pode contar com isso na Internet, principalmente se vocdeseja estender a um grande nmero de usurio o acesso s suas pginas. Em setratando de Servlets, no lado do cliente pode existir apenas pginas HTML,evitando restries de acesso s pginas. Em resumo, o uso de Applets no recomendado para ambientes com mltiplos navegadores ou quando asemntica da aplicao possa ser expressa por componentes HTML.

    ServidorWeb

    Requisies

    Mquina Virtual Java

    Container

    Instncias de ServletsRespostas

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    4

    CGI X Servlets

    Como visto no Erro! A origem da referncia no foi encontrada.,scripts CGI (Common Gateway Interface), acionam programas no servidor. Ouso de CGI sobrecarrega o servidor uma vez cada requisio de servio acarretaa execuo de um programa executvel (que pode ser escrito em com qualquerlinguagem que suporte o padro CGI) no servidor, alm disso, todo oprocessamento realizado pelo CGI no servidor. Se houver algum erro naentrada de dados o CGI tem que produzir uma pgina HTML explicando oproblema. J os Servlets so carregados apenas uma vez e como so executadosde forma multi-thread podem atender mais de uma mesma solicitao porsimultaneamente. Verses posteriores de CGI contornam este tipo de problema,mas permanecem outros como a falta de portabilidade e a insegurana naexecuo de cdigo escrito em uma linguagem como C/C++.

    A API Servlet

    A API Servlet composta por um conjunto de interfaces e Classes. Ocomponente mais bsico da API interface Servlet. Ela define ocomportamento bsico de um Servlet. A figura 1 mostra a interface Servlet.

    public

    interface Servlet {

    public void init(ServletConfig config)

    throws ServletException;

    public ServletConfig getServletConfig();

    public void service(ServletRequest req,

    ServletResponse res)

    throws ServletException, IOException;

    public String getServletInfo();

    public void destroy();

    }

    Figura 1. Interface Servlet.

    O mtodo service() responsvel pelo tratamento de todas dasrequisies dos clientes. J os mtodos init() e destroy() so chamados

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    5

    quando o Servlet carregado e descarregado do container, respectivamente. Omtodo getServletConfig() retorna um objeto ServletConfig quecontm os parmetros de inicializao do Servlet. O mtodogetServletInfo() retorna um String contendo informaes sobre oServlet, como verso e autor.

    Tendo como base a interface Servlet o restante da API Servlet seorganiza hierarquicamente como mostra a figura 2.

    Figura 2. Hierarquia de classes da API Servlet.

    A classe GenericServlet

    implementa um servidor genrico egeralmente no usada. A classe HttpServlet a mais utilizada e foiespecialmente projetada para lidar com o protocolo HTTP. A figura 3 mostra adefinio da classe interface HttpServlet.

    HttpServlet

    public

    abstract

    class HttpServlet

    extends GenericServlet

    implements java.io.Serializable

    Figura 3. Definio da classe HttpServlet.

    Servlet

    GenericServlet

    HttpServlet

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    6

    Note que a classe HttpServlet uma classe abstrata. Para criar umServlet que atenda requisies HTTP o programador deve criar uma classederivada da HttpServlet e sobrescrever pelo menos um dos mtodosabaixo:

    doGet Trata as requisies HTTP GET.doPost Trata as requisies HTTP POST.doPut Trata as requisies HTTP PUT.doDelete Trata as requisies HTTP DELETE.

    Tabela XV.XX. Mtodos da classe HttpServlet que devem sersobrescritos para tratar requisies

    HTTP.

    Todos esses mtodos so invocados pelo servidor por meio do mtodoservice(). O mtodo doGet() trata as requisies GET. Este tipo derequisio pode ser enviada vrias vezes, permitindo que seja colocada em umbookmark. O mtodo doPost() trata as requisies POST que permitem queo cliente envie dados de tamanho ilimitado para o servidor Web uma nica vez,sendo til para enviar informaes tais como o nmero do carto de crdito. Omtodo doPut() trata as requisies PUT. Este tipo de requisio permiteque o cliente envie um arquivo para o servidor semelhana de como feitovia FTP. O mtodo doPut() trata as requisies DELETE, permitindo que ocliente remova um documento ou uma pgina do servidor. O mtodoservice(), que recebe todas as requisies, em geral no sobrescrito,sendo sua tarefa direcionar a requisio para o mtodo adequado.

    Exemplo de Servlet

    Para entendermos o que um Servlet nada melhor que um exemplosimples. O exemplo XV.XX gera uma pgina HTML em resposta a umarequisio GET. A pgina HTML gerada contm simplesmente a frase Olamundo!!!. Este um Servlet bem simples que ilustra as funcionalidades bsicasda classe.

    import javax.servlet.*;import javax.servlet.http.*;

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    7

    public class Ola extends HttpServlet{ public String getServletInfo() { return "Ola verso 0.1";}

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); java.io.PrintWriter out = res.getWriter(); out.println(""); out.println(""); out.println("Servlet"); out.println(""); out.println("Ola mundo!!!"); out.println(""); out.println(""); out.close(); }}

    Exemplo XV.XX. Servlet Ola.

    O mtodo doGet() recebe dois objetos: um da classeHttpServletRequest

    e outro da classe HttpServletResponse. OHttpServletRequest

    responsvel pela comunicao do cliente para oservidor e o HttpServletResponse responsvel pela comunicao doservidor para o cliente. Sendo o exemplo XV.XX apenas um exemplo simplesele ignora o que foi enviado pelo cliente, tratando apenas de enviar uma pginaHTML como resposta. Para isso utilizado o objeto da classeHttpServletResponse. Primeiramente usado o mtodosetContentType() para definir o tipo do contedo a ser enviado ao cliente.Esse mtodo deve ser usado apenas uma vez e antes de se obter um objeto dotipo PrintWriter ou ServletOutputStream para a resposta. Aps isso usado o mtodo getWriter() para se obter um objeto do tipoPrintWriter que usado para escrever a resposta. Neste caso os dados daresposta so baseados em caracteres. Se o programador desejar enviar aresposta em bytes deve usar o mtodo getOutputStream() para obter umobjeto OutputStream. A partir de ento o programa passa usar o objetoPrintWriter para enviar a pgina HTML.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    8

    Compilando o Servlet

    A API Servlet ainda no foi incorporado ao SDK, portanto, paracompilar um Servlet preciso adicionar a API Servlet ao pacote SDK. Existemvrias formas de se fazer isso. A Sun fornece a especificao da API e diversosprodutores de software executam a implementao. Atualmente, aespecificao da API Servlet est na verso 2.XX. Uma das implementaes daAPI que pode ser baixada gratuitamente pela Internet a fornecida pelo projetoJakarta (http://jakarta.apache.org) denominada de Tomcat. Aimplementao da API Servlet feita pelo projeto Jakarta a implementao dereferncia indicada pela Sun. Ou seja, a implementao que os outrosfabricantes devem seguir para garantir a conformidade com a especificao daAPI. No entanto, uma vez que o Tomcat a implementao mais atualizada daAPI, tambm a menos testada e, por consequncia, pode no ser a maisestvel e com melhor desempenho.

    Instalando o Tomcat

    Assim como para se executar um Applet era preciso de um navegadorWeb com Java habilitado no caso de Servlets preciso de servidor Web queexecute Java ou que passe as requisies feitas a Servlets para programas queexecutem os Servlets. O Tomcat tanto a implementao da API Servlet comoa implementao de um container, que pode trabalhar em associao com umservidor Web como o Apache ou o IIS, ou pode tambm trabalharisoladamente, desempenhando tambm o papel de um servidor Web. Nosexemplos aqui mostrados usaremos o Tomcat isoladamente. Em um ambientede produo esta configurao no a mais adequada, uma vez que osservidores Web possuem um melhor desempenho no despacho de pginasestticas. As instrues para configurar o Tomcat para trabalhar em conjuntocom um servidor Web podem ser encontradas junto s instrues gerais doprograma. As figuras 4 e 5 ilustram essas duas situaes.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    9

    Figura 4. Servidor Web habilitado para Servlet.

    Figura 5. Servidor Web reencaminhando as requisies para o Servletcontainer.

    A verso estvel do Tomcat a 3.2.3.XX aps baix-la do site doprojeto Jakarta o usurio deve descomprimir o arquivo. Por exemplo, noambiente Windows o usurio pode descomprimir o arquivo na raiz do disco C:,o que gerar a seguinte rvore de diretrios:

    C:\ jakarta-tomcat-3.2.3 | |______bin |______conf |______doc |______lib |______logs |______src |______webapps

    No diretrio bin encontram-se os programas execuo e interrupo docontainer Tomcat. No diretrio conf encontram-se os arquivos deconfigurao. No diretrio doc encontram-se os arquivos de documentao. No

    Servidor Web

    Servlet habilitadoInternet

    Internet Servidor Web

    Servlet Container

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    10

    diretrio lib encontram-se os bytecodes do container e da implementao daAPI. No diretrio logs so registradas as mensagens da geradas durante aexecuo do sistema. No diretrio src encontram-se os arquivos fontes docontainer e da implementao da API de configurao. Finalmente, Nodiretrio webapps encontram-se as pginas e cdigos das aplicaes dosusurios.

    No ambiente MS-Windows aconselhamos usar um nome dentro doformato 8.3 (oito caracteres para o nome e trs para o tipo). Assim o diretriojakarta-tomcat-3.2.3 poderia ser mudado para simplesmente tomcat.

    Antes de executar o Tomcat necessrio definir duas variveis deambiente. Por exemplo, supondo que no MS-Windows o Tomcat foi instaladono diretrio c:\tomcat e que o SDK est instalado no diretrio c:\jdk1.3ento as seguintes variveis de ambiente devem ser definidas:

    set JAVA_HOME=C:\jdk1.3set TOMCAT_HOME=C:\tomcat

    Agora possvel executar o Tomcat por meio do seguinte comando:

    C:\tomcat\bin\startup.bat

    Para interromper a execuo servidor basta executar o arquivo

    c:\tomcat\bin\shutdown.bat

    Falta de espao para variveis de ambienteCaso ao iniciar o servidor aparea a mensagem sem espao de ambiente

    clique com o boto direito do mouse no arquivo .bat e edite as propriedades definindo oambiente inicial com 4096. Feche o arquivo execute novamente.

    Ao entrar em execuo o servidor l as configuraes constantes noarquivo server.xml e, por default, se anexa porta 8080. Para verificar se oprograma est funcionando corretamente execute um navegador como oNetscape ou o Internet Explorer e digite a seguinte URL:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    11

    http://127.0.0.1:8080/index.html

    A figura 6 mostra a tela principal do Tomcat.

    Figura 6. Tela inicial do Tomcat.

    A nmero porta default para recebimento das requisies HTTP podeser alterada por meio da edio do arquivo server.xml do diretrio confcomo mostrado abaixo:

    No entanto, caso o Tomcat esteja operando em conjunto com umservidor, o ideal que o Tomcat no responda requisies diretamente.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    12

    Preparando para executar o Servlet

    Compilando o Servlet

    Antes de executar o Servlet e preciso compil-lo. Para compil-lo preciso que as classes que implementam a API Servlet estejam no classpath.Para isso preciso definir a varivel de ambiente. No ambiente MS-Windowsseria

    set CLASSPATH=%CLASSPATH%;%TOMCAT_HOME%\lib\servlet.jar

    e no ambiente Unix seria

    CLASSPATH=${CLASSPATH}:${TOMCAT_HOME}/lib/servlet.jar

    Alternativamente, possvel indicar o classpath na prpria linha deexecuo do compilador Java. Por exemplo, No ambiente MS-Windows ficariana seguinte forma:

    javac -classpath "%CLASSPATH%;c:\tomcat\lib\servlet.jar Ola.java

    Criando uma aplicao no Tomcat

    Agora preciso definir onde deve ser colocado o arquivo compilado.Para isso preciso criar uma aplicao no Tomcat ou usar uma das aplicaesj existentes. Vamos aprender como criar uma aplicao no Tomcat. Para isso preciso cria a seguinte estrutura de diretrios abaixo do diretrio webapps doTomcat:

    webapps |_____ Nome aplicao |_____ Web-inf |_____classes

    Diretrio de AplicaesNa verdade possvel definir outro diretrio para colocar as aplicaes do Tomcat.

    Para indicar outro diretrio preciso editar o arquivo server.xml e indicar o diretrio pormeio da diretiva home do tag ContextManager.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    13

    O diretrio de uma aplicao denominado de contexto da aplicao. preciso tambm editar o arquivo server.xml do diretrio conf, incluindoas linhas:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    14

    A URL para a chamada do Servlet pode ser alterada de modo a ocultarqualquer referncia diretrios ou a tecnologias de implementao. No caso doTomcat essa configurao no arquivo web.xml do diretrio Web-inf daaplicao. Por exemplo, para eliminar a palavra servlet da URL poderamosinserir as seguintes linhas no arquivo web.xml entre os tags e:

    Ola Ola

    Ola /Ola

    Invocando em uma pgina HTML

    No caso de uma pgina HTML basta colocar a URL na forma de link.Por exemplo,

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    15

    Apesar de aparentemente cumprirem a mesma funo, existem diferenasimportantes entre estes dois mtodos. O mtodo GET tem por objetivo enviaruma requisio por um recurso. As informaes necessrias para a obteno dorecurso (como informaes digitadas em formulrios HTML) so adicionadas URL e, por consequncia, no so permitidos caracteres invlidos na formaode URLs, como por espaos em branco e caracteres especiais. J na requisioPOST os dados so enviados no corpo da mensagem.

    O mtodo GET possui a vantagem de ser idempotente, ou seja, osservidores Web podem assumir que a requisio pode ser repetida, sendopossvel adicionar URL ao bookmark. Isto muito til quando o usuriodeseja manter a URL resultante de uma pesquisa. Como desvantagem asinformaes passadas via GET no podem ser muito longas, um vez o nmerode caracteres permitidos por volta de 2K.

    J as requisies POST a princpio podem ter tamanho ilimitado. Noentanto, elas no so idempotente, o que as tornam ideais para formulrios ondeos usurios precisam digitar informaes confidenciais, como nmero de cartode crdito. Desta forma o usurio obrigado a digitar a informao toda vezque for enviar a requisio, no sendo possvel registrar a requisio em umbookmark.

    Concorrncia

    Uma vez carregado o Servlet no mais descarregado, a no ser que oservidor Web tenha sua execuo interrompida. De modo geral, cada requisioque deve ser direcionada a determinada instncia de Servlet tratada por umthread sobre a instncia de Servlet. Isto significa que se existirem duasrequisies simultneas que devem ser direcionadas para um mesmo objeto ocontainer criar dois threads sobre o mesmo objeto Servlet para tratar asrequisies. A figura 7 ilustra esta situao.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    16

    Figura 7. Relacionamento entre as instncias dos Servlets e os threads.

    Em conseqncia disto temos o benefcios de uma sobrecarga paraservidor, uma vez que a criao de threads menos onerosa do que a criao deprocessos, e uma aparente melhora no tempo de resposta.

    Por outro lado, o fato dos Servlets operarem em modo multi-threadaumenta a complexidade das aplicaes e cuidados especiais, como visto nocaptulo sobre concorrncia, devem tomados para evitar comportamentoserrticos. Por exemplo, suponha um Servlet que receba um conjunto denmeros inteiros e retorne uma pgina contendo a soma dos nmeros. Aexemplo XX.XX mostra o cdigo do Servlet. O leitor pode imaginar um cdigomuito mais eficiente para computar a soma de nmeros, mas o objetivo docdigo do exemplo ilustrar o problema da concorrncia em Servlets. Oexemplo contm tambm um trecho de cdigo para recebimento de valores deformulrios, o que ser discutido mais adiante.

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

    public class Soma extends HttpServlet {

    Vector v = new Vector(5); protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException { v.clear(); Enumeration e = req.getParameterNames();

    while (e.hasMoreElements()) { String name = (String)e.nextElement();

    Servlet2

    thread1Servlet1

    thread2

    thread1

    usurio1

    usurio2

    usurio3

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    17

    String value = req.getParameter(name); if (value != null) v.add(value); }

    res.setContentType("text/html"); java.io.PrintWriter out = res.getWriter(); out.println(""); out.println("Servlet"); out.println(""); out.println(" A soma e'"); int soma =0; for(int i =0; i< v.size() ; i++) { soma += Integer.parseInt((String)v.get(i)); } out.println(soma); out.println(""); out.println(""); out.println(""); out.close(); }}

    Exemplo XX.XX- Servlet com problemas de concorrncia.

    Note que o Servlet utiliza uma varivel de instncia para referenciar oVector que armazena os valores. Se no forem usadas primitivas desincronizao (como no cdigo do exemplo) e duas requisies simultneaschegarem ao Servlet o resultado pode ser inconsistente, uma vez que o Vectorpoder conter parte dos valores de uma requisio e parte dos valores de outrarequisio. Neste caso, para corrigir esse problema basta declarar a varivelcomo local ao mtodo doPost() ou usar primitivas de sincronizao.

    Obtendo Informaes sobre a Requisio

    O objeto HttpServletRequest passado para o Servlet contmvrias informaes importantes relacionadas com a requisio, como porexemplo o mtodo empregado (POST ou GET), o protocolo utilizado, oendereo remoto, informaes contidas no cabealho e muitas outras. O Servletdo exemplo XX.XX retorna uma pgina contendo informaes sobre arequisio e sobre o cabealho da requisio.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    18

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

    public class RequestInfo extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println(""); out.println("Exemplo sobre Requisicao de Info "); out.println(""); out.println(" Exemplo sobre Requisicao de Info "); out.println("Metodo: " + req.getMethod()+); out.println("Request URI: " + req.getRequestURI()+); out.println("Protocolo: " + req.getProtocol()+); out.println("PathInfo: " + req.getPathInfo()+); out.println("Endereco remoto: " + req.getRemoteAddr()+); Enumeration e = req.getHeaderNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = req.getHeader(name); out.println(name + " = " + value+""); } out.println(""); }

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { doGet(req, res); }}

    Exemplo XX.XX- Servlet que retorna as informaes sobre a requisio.

    Note que o mtodo doPost() chama o mtodo doGet(), de modoque o Servlet pode receber os dois tipos de requisio. A figura 8 mostra oresultado de uma execuo do Servlet do exemplo XX.XX.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    19

    Exemplo sobre Requisicao de Info

    Metodo: GETRequest URI: /servlet/RequestInfoProtocolo: HTTP/1.0PathInfo: nullEndereco remoto: 127.0.0.1

    Connection = Keep-AliveUser-Agent = Mozilla/4.7 [en] (Win95; I)Pragma = no-cacheHost = localhost:8080Accept = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*Accept-Encoding = gzipAccept-Language = enAccept-Charset = iso-8859-1,*,utf-8

    Figura 8. Sada da execuo do Servlet que exibe as informaes sobre arequisio.

    Lidando com Formulrios

    Ser capaz de lidar com as informaes contidas em formulrios HTML fundamental para qualquer tecnologia de desenvolvimento de aplicaes paraWeb. por meio de formulrios que os usurios fornecem dados, preenchempedidos de compra e (ainda mais importante) digitam o nmero do carto decrdito. As informaes digitadas no formulrio chegam at o Servlet por meiodo objeto HttpServletRequest e so recuperadas por meio do mtodogetParameter() deste objeto. Todo item de formulrio HTML possui umnome e esse nome passado como argumento para o mtodogetParameter() que retorna na forma de String o valor do item deformulrio.

    O Servlet do exemplo XX.XX exibe o valor de dois itens de formulriosdo tipo text. Um denominado nome e o outro denominado de sobrenome.Em seguida o Servlet cria um formulrio contendo os mesmos itens deformulrio. Note que um formulrio criado por meio do tag . Comoparmetros opcionais deste tag temos mtodo da requisio (method), aURL para onde ser submetida a requisio (action). No caso do exemplo, o

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    20

    mtodo adotado o POST e a requisio ser submetida ao prprio ServletForm.

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

    public class Form extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html");

    PrintWriter out = res.getWriter(); out.println(""); out.println("Trata formulario"); out.println("");

    out.println("Trata formulario"); String nome = req.getParameter("nome"); String sobreNome = req.getParameter("sobrenome"); if (nome != null || sobreNome != null) { out.println("Nome = " + nome + ""); out.println("Sobrenome = " + sobreNome); } out.println(""); out.print(""); out.println("Nome : "); out.println("Sobrenome: "); out.println(""); out.println(""); out.println(""); }

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { doGet(req, res); }}

    Exemplo XX.XX- Servlet para lidar com um formulrio simples.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    21

    Lidando com Cookies

    Um cookie nada mais que um bloco de informao que enviado doservidor para o navegador no cabealho pgina. A partir de ento, dependendodo tempo de validade do cookie, o navegador reenvia essa informao para oservidor a cada nova requisio. Dependo do caso o cookie tambmarmazenado no disco da mquina cliente e quando o site novamente visitado ocookie enviado novamente para o servidor, fornecendo a informao desejada.

    Os cookies foram a soluo adotada pelos desenvolvedores do Netscapepara implementar a identificao de clientes sobre um protocolo HTTP que no orientado conexo. Esta soluo, apesar das controvrsias sobre apossibilidade de quebra de privacidade, passou ser amplamente adotada e hojeos cookies so parte integrante do padro Internet, normalizados pela normaRFC 2109.

    A necessidade da identificao do cliente de onde partiu a requisio e omonitoramento de sua interao com o site (denominada de sesso) importante para o desenvolvimento de sistemas para a Web pelas seguintesrazes:

    necessrio associar os itens selecionados para compra com ousurio que deseja adquiri-los. Na maioria da vezes a seleo dositens e compra feita por meio da navegao de vrias pginas dosite e a todo instante necessrio distinguir os usurios que estorealizando as requisies.

    necessrio acompanhar as interao do usurio com o site paraobservar seu comportamento e, a partir dessas informaes, realizaradaptaes no site para atrair um maior nmero de usurios ourealizar campanhas de marketing.

    necessrio saber que usurio est acessando o site para, de acordocom o seu perfil, fornecer uma visualizao e um conjunto defuncionalidades adequadas s suas preferncias.

    Todas essas necessidades no podem ser atendidas com o uso bsico doprotocolo HTTP, uma vez que ele no orientado sesso ou conexo. Com oscookies possvel contornar essa deficincia, uma vez que as informaes que

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    22

    so neles armazenadas podem ser usadas para identificar os clientes. Existemoutras formas de contornar a deficincia do protocolo de HTTP, como acodificao de URL e o uso de campos escondidos nas pginas HTML, mas ouso de cookies a tcnica mais utiliza, por ser mais simples e padronizada. Noentanto, o usurio pode impedir que o navegador aceite cookies, o que torna oato de navegar pela Web muito desagradvel. Neste caso, necessrio utilizaras outras tcnicas para controle de sesso.

    A API Servlet permite a manipulao explicita de cookies. Para controlede sesso o programador pode manipular diretamente os cookies, ou usar umaabstrao de nvel mais alto, implementada por meio do objetoHttpSession. Se o cliente no permitir o uso de cookies a API Servletfornece mtodos para a codificao de URL. O exemplo XX.XX mostra o usode cookies para armazenar as informaes digitadas em um formulrio.

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

    public class CookieTeste extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html");

    PrintWriter out = res.getWriter(); out.println(""); out.println(""); out.println("Teste de Cookies"); out.println("");

    out.println("Teste de Cookies");

    Cookie[] cookies = req.getCookies(); if (cookies.length > 0) { for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; out.print("Cookie Nome: " + cookie.getName() + ""); out.println(" Cookie Valor: " + cookie.getValue() +""); } }

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    23

    String cName = req.getParameter("cookienome"); String cValor = req.getParameter("cookievalor"); if (cName != null && cValor != null) { Cookie cookie = new Cookie(cName ,cValor); res.addCookie(cookie); out.println(""); out.println(""); out.print("Nome : "+cName +""); out.print("Valor : "+cValor); }

    out.println(""); out.print(""); out.println("Nome : "); out.println("Valor : "); out.println(""); out.println(""); out.println(""); }

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { doGet(req, res); }}

    Exemplo XX.XX- Servlet para lidar com Cookies.

    Para se criar um cookie necessrio criar um objeto Cookie, passandopara o construtor um nome e um valor, sendo ambos instncias de String. Ocookie enviado para o navegador por meio do mtodo addCookie() doobjeto HttpServletResponse. Um vez que os cookies so enviados nocabealho da pgina, o mtodo addCookie() deve ser chamado antes doenvio de qualquer contedo para o navegador. Para recuperar os cookiesenviados pelo navegador usa-se o mtodo getCookies() do objetoHttpServletRequest que retorna um array de Cookie. Os mtodosgetName() e getvalue() do objeto Cookie so utilizados para recuperaro nome o valor da informao associada ao cookie.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    24

    Os objetos da classe Cookie possuem vrios mtodos para controle douso de cookies. possvel definir tempo de vida mximo do cookie, osdomnios que devem receber o cookie (por default o domnio que deve recebero cookie o que o criou), o diretrio da pgina que deve receber o cookie, se ocookie deve ser enviado somente sob um protocolo seguro e etc. Por exemplo,para definir a idade mxima de um cookie devemos utilizar o mtodosetMaxAge(), passando um inteiro como parmetro. Se o inteiro for positivoindicar em segundos o tempo mximo de vida do cookie. Um valor negativoindica que o cookie deve apagado quando o navegador terminar. O valor zeroindica que o cookie deve ser apagado imediatamente. O trecho de cdigoexemplo XX.XX mostra algumas alteraes no comportamento default de umcookie.

    ...

    Cookie cookie = new Cookie(cName ,cValor);cookie.setDomain(*.uvf.br); // todos os domnios como dpi.ufv.br mas no *.dpi.ufv.brcookie.setMaxAge (3600); // uma hora de tempo de vida...

    Exemplo XX.XX- Mudanas no comportamento default do cookie.

    Lidando com Sesses

    A manipulao direta de cookies para controle de sesso um tantobaixo nvel, uma vez que o usurio deve se preocupar com a identificao,tempo de vida e outros detalhes. Por isso a API Servlet fornece um objeto comcontroles de nvel mais alto para monitorar a sesso, o HttpSession. Oobjeto HttpSession monitora a sesso utilizando cookies de formatransparente. No entanto, se o cliente no aceitar o uso de cookies possvelutilizar como alternativa a codificao de URL para adicionar o identificador dasesso. Essa opo, apesar de ser mais genrica, no primeira opo devido apossibilidade de criao de gargalos pela necessidade da anlise prvia detodas requisies que chegam ao servidor. O exemplo XX.XX mostra o uso deum objeto HttpSession para armazenar as informaes digitadas em umformulrio.

    import java.io.*;import java.util.*;

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    25

    import javax.servlet.*;import javax.servlet.http.*;

    public class SessionTeste extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { resp.setContentType("text/html");

    PrintWriter out = resp.getWriter(); out.println(""); out.println("Teste de Sessao"); out.println(""); out.println(""); out.println("Teste de Sessao"); HttpSession session = req.getSession(true); out.println("Identificador: " + session.getId()); out.println(""); out.println("Data: "); out.println(new Date(session.getCreationTime()) + ""); out.println("Ultimo acesso: "); out.println(new Date(session.getLastAccessedTime()));

    String nomedado = req.getParameter("nomedado"); String valordado = req.getParameter("valordado"); if (nomedado != null && valordado != null) { session.setAttribute(nomedado, valordado); }

    out.println(""); out.println("Dados da Sessao:" + ""); Enumeration valueNames = session.getAttributeNames();

    while (valueNames.hasMoreElements()) { String name = (String)valueNames.nextElement(); String value = (String) session.getAttribute(name); out.println(name + " = " + value+""); }

    out.println(""); out.print(""); out.println("Nome: "); out.println("Valor: "); out.println("");

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    26

    out.println(""); out.println(""); }

    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { doGet(req, resp); }}

    Exemplo XX.XX- Servlet para lidar com Sesses.

    Para controlar a sesso necessrio obter um objeto HttpSession pormeio do mtodo getSession() do objeto HttpServletRequest. Opcionalmente, omtodo getSession() recebe como argumento um valor booleano que indica se para criar o objeto HttpSession se ele no existir (argumento true) ou se pararetorna null caso ele no exista (argumento false). Para se associar um objeto ouinformao sesso usa-se o mtodo setAttribute() do objeto HttpSession,passando para o mtodo um String e um objeto que ser identificado peloString. Note que o mtodo aceita qualquer objeto e, portanto, qualquer objetopode ser associado sesso. Os objetos associados a uma sesso sorecuperados com o uso mtodo getAttribute() do objeto HttpSession, que recebecomo argumento o nome associado ao objeto. Para se obter uma enumerao donomes associados sesso usa-se o mtodo getAttributeNames() do objetoHttpSession.

    A figura 9 mostra o resultado da execuo do exemplo XX.XX.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    27

    Teste de Sessao

    Identificador: session3Data: Sun May 28 15:19:15 GMT-03:00 2000Ultimo acesso: Sun May 28 15:19:43 GMT-03:00 2000

    Dados da Sessao:Alcione = 4Alexandra = 6NomeValor

    Figura 9. Sada resultante da execuo do Servlet que lida com Sesses.

    Enviar Consulta

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    28

    JSP

    Servlets uma boa idia, mas voc se imaginou montando uma pginacomplexa usando println()? Muitas vezes o desenvolvimento de um site uma tarefa complexa que envolve vrios profissionais. A tarefa de projeto dolayout da pgina fica a cargo do Web Designer, incluindo a diagramao dostextos e imagens, aplicao de cores, tratamento das imagens, definio daestrutura da informao apresentada no site e dos links para navegao pelamesma. J o Desenvolvedor Web responsvel pela criao das aplicaes quevo executar em um site. O trabalho destes dois profissionais somado nacriao de um nico produto, mas durante o desenvolvimento a interfernciamutua deve ser a mnima possvel. Ou seja, um profissional no deve precisaralterar o que foi feito pelo outro profissional para cumprir sua tarefa. Atecnologia Servlet no nos permite atingir esse ideal. Por exemplo, suponha queum Web Designer terminou o desenvolvimento de uma pgina e a entregoupara o Desenvolvedor Web codificar em um Servlet. Se aps a codificao oWeb Designer desejar realizar uma alterao na pgina ser necessrio que elealtere o cdigo do Servlet (do qual ele nada entende) ou entregar uma novapgina para o Desenvolvedor Web para que ele a codifique totalmente maisuma vez. Qualquer uma dessas alternativas so indesejveis e foi devido a esseproblema a Sun desenvolveu uma tecnologia baseada em Servlets chamada deJSP.

    Java Server Pages (JSP) so pginas HTML que incluem cdigo Java eoutros tags especiais. Desta forma as partes estticas da pgina no precisam sergeradas por println(). Elas so fixadas na prpria pgina. A parte dinmica gerada pelo cdigo JSP. Assim a parte esttica da pgina pode ser projetadapor um Web Designer que nada sabe de Java.

    A primeira vez que uma pgina JSP carregada pelo container JSP ocdigo Java compilado gerando um Servlet que executado, gerando umapgina HTML que enviada para o navegador. As chamadas subsequentes soenviadas diretamente ao Servlet gerado na primeira requisio, no ocorrendomais as etapas de gerao e compilao do Servlet.

    A figura 10 mostra um esquema das etapas de execuo de uma pginaJSP na primeira vez que requisitada. Na etapa (1) a requisio enviada paraum servidor Web que reencaminha a requisio (etapa 2) para o containerServlet/JSP. Na etapa (3) o container verifica que no existe nenhuma instnciade Servlet correspondente pgina JSP. Neste caso, a pgina JSP traduzidapara cdigo fonte de uma classe Servlet que ser usada na resposta requisio.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    29

    Na etapa (4) o cdigo fonte do Servlet compilado, e na etapa (5) criada umainstncia da classe. Finalmente, na etapa (6) invocado o mtodo service()da instncia Servlet para gerar a resposta requisio.

    Figura 10. Etapas da primeira execuo de uma pgina JSP.

    A idia de se usar scripts de linguagens de programao em pginasHTML que so processados no lado servidor para gerar contedo dinmico no restrita linguagem Java. Existem vrias solues desse tipo fornecida poroutros fabricantes. Abaixo segue uma comparao de duas das tecnologias maispopulares com JSP.

    PHP X JSP

    PHP (Personal Home Pages) uma linguagem script para ser executadano lado servidor criada em 1994 como um projeto pessoal de Rasmus Lerdorf.Atualmente encontra-se na verso 4. A sintaxe fortemente baseada em C maspossui elementos de C++, Java e Perl. Possui suporte programao OO pormeio de classes e objetos. Possui tambm suporte extensivo Banco de dadosODBC, MySql, Sybase, Oracle e outros. PHP uma linguagem mais fcil no

    ServidorHttp

    (1)Requisio de

    pgina JSP

    ContainerServlet/JSP Pginajsp

    FonteServlet

    (3)Traduz

    (2)Encaminha a requisio

    (5)Instancia e

    executa

    (6)Resposta requisio

    Navegador

    BytecodeServlet

    (4)Compila

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    30

    desenvolvimento de pequenas aplicaes para Web em relao JSP, uma vezque uma linguagem mais simples e menos rgida do que JSP. No entanto, amedida que passamos para aplicaes de maior porte, o uso de PHP no indicado, uma vez que necessrio o uso de linguagens com checagem maisrgidas e com maior suporte escalabilidade, como o caso de Java.

    ASP X JSP

    ASP (Active Server Pages) a soluo desenvolvida pela Microsoftpara atender as requisies feitas servidores Web. Incorporada inicialmenteapenas ao Internet Information Server (IIS), no entanto, atualmente j suportada por outros servidores populares, como o Apache. O desenvolvimentode pginas que usam ASP envolve a produo de um script contendo HTMLmisturado com blocos de cdigo de controle ASP. Este cdigo de controle podeconter scripts em JavaScript ou VBScript. A primeira vantagem de JSP sobreASP que a parte dinmica escrita em Java e no Visual Basic ou outralinguagem proprietria da Microsoft, portanto JSP mais poderoso e fcil deusar. Em segundo lugar JSP mais portvel para outros sistemas operacionais eservidores WEB que no sejam Microsoft.

    Primeiro exemplo em JSP

    Para que o leitor possa ter uma idia geral da tecnologia JSPapresentaremos agora a verso JSP do Ol mundo. O exemplo XX.XX mostra ocdigo da pgina.

    Exemplo JSP

    Exemplo XX.XX- Verso JSP do Ol mundo.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    31

    Quem est habituado aos tags HTML notar que se trata basicamente deuma pgina HTML contendo cdigo Java delimitado pelos smbolos . Para facilitar a visualizao destacamos os scripts Java com negrito. Noprimeiro trecho de script declarada uma varivel x com o valor Ol mundo(a seqncia denota em HTML). No segundo trecho de script ocontedo da varivel x extrado e colocado na pgina resultante da execuodo Servlet correspondente. Em seguida mostraremos como executar o exemploXX.XX.

    Executando o arquivo JSP

    Para executar o exemplo XX.XX salve-o com a extenso .jsp. Porexemplo ola.jsp. Se voc estiver usando o servidor Tomcat, coloque-oarquivo no subdiretrio /webapps/examples/jsp do Tomcat. Por exemploexamples/jsp/teste. Para invocar o arquivo JSP basta embutir a URLem uma pgina ou digitar diretamente a seguinte URL no navegador.

    http://localhost:8080/examples/jsp/ola.jsp

    Usamos o diretrio /webapps/examples/jsp para testarrapidamente o exemplo. Para desenvolver uma aplicao aconselhvel criarum diretrio apropriado como mostrado na seo que tratou de Servlets.

    O Servlet criado a partir da pgina JSP colocado em um diretrio detrabalho. No caso do Tomcat o Servlet colocado em subdiretrio associado aplicao subordinado ao diretrio /work do Tomcat. O exemplo XX.XXmostra os principais trechos do Servlet criado a partir da traduo do arquivoola.jsp pelo tradutor do Tomcat. Note que o Servlet subclasse de umaclasse HttpJspBase e no da HttpServlet. Alm disso, o mtodo queexecutado em resposta requisio o mtodo _jspService() e no omtodo service(). Note tambm que todas as partes estticas da pgina JSPso colocadas como argumentos do mtodo write() do objeto referenciadoout.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    32

    public class _0002fjsp_0002fola_00032_0002ejspola_jsp_0 extends HttpJspBase { ....public void _jspService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { .... PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; ... try { ... out.write("\r\n \r\n Exemplo JSP\r\n\r\n \r\n"); String x = "Ol Mundo!";

    out.write("\r\n"); out.print(x); out.write("\r\n \r\n\r\n"); ... } catch (Exception ex) { ... } }}

    Exemplo XX.XX- Servlet correspondente pgina JSP do Ol mundo.

    Objetos implcitos

    No exemplo XX.XX pode-se ver a declarao de variveis quereferenciam a alguns objetos importantes. Estas variveis esto disponveis parao projetista da pgina JSP. As variveis mais importantes so:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    33

    Classe VarivelHttpServletRequestHttpServletResponsePageContextServletContextHttpSessionJspWriter

    requestresponsepageContextapplicationsessionout

    Os objetos referenciados pelas variveis request e response jtiveram seu uso esclarecido na seo sobre Servlets. O objeto do tipoJspWriter tem a mesma funo do PrinterWriter do Servlet. Os outrosobjetos tero sua funo esclarecida mais adiante.

    Tags JSP

    Os tags JSP possuem a seguinte forma geral:

    O primeiro caractere % pode ser seguido de outros caracteres quedeterminam o significado preciso do cdigo dentro do tag. Os tags JSPpossuem correspondncia com os tags XML. Existem cinco categorias de tagsJSP:

    ExpressesScriptletsDeclaraesDiretivasComentrios

    Em seguida comentaremos cada uma dessas categorias.

    Expresses

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    34

    Expresses so avaliadas, convertidas para String e colocadas napgina enviada. A avaliao realizada em tempo de execuo, quando apgina requisitada.

    Exemplos:

    No primeiro exemplo ser colocado na pgina a data corrente emmilsimo de segundos e no segundo ser colocado o mtodo usado narequisio. Note que cada expresso contm apenas um comando Java. Notetambm que o comando Java no terminado pelo caractere ;.

    Scriptlets

    Quando necessrio mais de um comando Java ou o resultado dacomputao no para ser colocado na pgina de resposta preciso usar outracategoria de tags JSP: os Scriptlets . Os Scriptlets permitem inserir trechos decdigo em Java na pgina JSP. O exemplo XX.XX mostra uma pgina JSPcontendo um Scriptlet que transforma a temperatura digitada em celcius para oequivalente em Fahrenheit.

    Conversao Celcius Fahrenheit

    Celcius:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    35

    Exemplo XX.XX- Pgina JSP que converte graus Celcius para Fahrenheit.

    Note o uso das variveis request e out sem a necessidade dedeclarao. Todo o cdigo digitado inserido no mtodo _jspService(). Afigura 11 mostra o resultado da requisio aps a digitao do valor 30 na caixade texto do formulrio.

    Figura 11. Resultado da converso de 30 graus celcius.

    O cdigo dentro do scriptlet inserido da mesma forma que escrito etodo o texto HTML esttico antes e aps ou um scriptlet convertido paracomandos print(). Desta forma o scriptlets no precisa conter comandospara cdigo esttico e blocos de controle abertos afetam o cdigo HTMLenvolvidos por scriptlets. O exemplo XX.XX mostra dois formas de se produziro mesmo efeito. No cdigo da esquerda os Scriplets se intercalam com cdigoHTML. O cdigo HTML, quando da traduo da pgina JSP para Servlet inserido como argumentos de mtodos println() gerando o cdigo dadireita. Ambas as formas podem ser usadas em pginas JSP e produzem omesmo efeito.

    Valor em Fahrenheit:86.0

    Celcius:

    Enviar Consulta

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    36

    Previso do Tempo

    Hoje vai fazer sol!

    Hoje vai chover!

    out.println("Previso do Tempo");if (Math.random() < 0.5) { out.println(" Hoje vai fazer sol!");} else { out.println(" Hoje vai chover!");}

    Exemplo XX.XX- Dois cdigos equivalentes.

    Declaraes

    Uma declarao JSP permite definir variveis ou mtodos que soinseridos no corpo do Servlet. Como as declaraes no geram sada, elas sonormalmente usadas em combinao com expresses e scriptlets. O ExemploXX.XX mostra a declarao de uma varivel que usada para contar o nmerode vezes que a pgina corrente foi requisitada desde que foi carregada.

    Acessos desde carregada:

    Exemplo XX.XX- Declarao de uma varivel usando o tag de declarao.

    As variveis declaradas desta forma sero variveis de instncia. J asvariveis declaradas em Scriptlets so variveis locais ao mtodo_jspService(). Por isso possvel contar o nmero de requisies com oexemplo XX.XX. Se varivel fosse declarada em um Scriptlet a varivel serialocal ao mtodo _jspService() e, portanto, teria seu valor reinicializado acada chamada.

    Como j foi dito, os tags de declaraes permitem a declarao demtodos. O Exemplo XX.XX mostra a declarao de um mtodo que convertecelcius para Fahrenheit.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    37

    Exemplo XX.XX- Declarao de um mtodo para a converso de celcius paraFahrenheit.

    Comentrios

    Existem dois tipos de comentrios utilizados em pginas JSP. Oprimeiro exclui todo o bloco comentado da sada gerada pelo processamento dapgina. A forma geral deste tipo de comentrio a seguinte:

    O segundo tipo de comentrio o utilizado em pginas HTML. Nestecaso o comentrio enviado dentro da pgina de resposta. A forma geral destetipo de comentrio a seguinte:

    Diretivas

    Diretivas so mensagens para JSP container. Elas no enviam nada paraa pgina mas so importantes para definir atributos JSP e dependncias com oJSP container. A forma geral da diretivas a seguinte:

    ou

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    38

    Em seguida comentaremos as principais diretivas.

    Diretiva page

    A diretiva page permite a definio dos seguintes atributos:

    importcontentTypeisThreadSafesessionbufferautoflushinfoerrorPageisErrorPagelanguage

    Segue a descrio de cada um desses atributos.

    Atributo e Forma Geral Descrioimport="package.class"

    ou

    import="package.class1,...,package.classN"

    Permite especificar os pacotes que devem serimportados para serem usados na pgina JSP.

    Exemplo:

    contentType="MIME-Type" Especifica o tipo MIME da sada. O default text/html.

    Exemplo:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    39

    possui o mesmo efeito do scriptlet

    isThreadSafe="true|false" Um valor true (default) indica um processamentonormal do Servlet, onde mltiplas requisies soprocessadas simultaneamente. Um valor false indica queo processamento deve ser feito por instancias separadasdo Servlet ou serialmente.

    session="true|false Um valor true (default) indica que a varivelpredefinida session (HttpSession) deve serassociada sesso, se existir, caso contrrio uma novasesso deve ser criada e associada a ela. Um valor falseindica que nenhuma sesso ser usada.

    buffer="sizekb|none" Especifica o tamanho do buffer para escrita usado peloobjeto JspWriter. O tamanho default no menor que8k..

    autoflush="true|false Um valor true (default) indica que o buffer deve seresvaziado quando estiver cheio.

    info="mensagem" Define uma cadeia de caracteres que pode serrecuperada via getServletInfo().

    errorPage="url Especifica a pgina JSP que deve ser processada emcaso de excees no capturadas.

    IsErrorPage="true|false Indica se a pgina corrente pode atuar como pgina deerro para outra pgina JSP. O default false.

    Language="java Possibilita definir a linguagem que est sendo usada. Nomomento a nica possibilidade Java.

    Tabela I.XX Atributos da diretiva page.

    Diretiva include

    Permite incluir arquivos no momento em que a pgina JSP traduzidaem um Servlet.

    Exemplo:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    40

    Extraindo Valores de Formulrios

    Uma pgina JSP, da mesma forma que um Servlet, pode usar o objetoreferenciado pela varivel request para obter os valores dos parmetros deum formulrio. O exemplo XX.XX usado para converter graus Celcius emFahrenheit fez uso deste recurso. O exemplo XX.XX mostra outra pgina JSPcom formulrio. Note que o scriptlet usado para obter o nome e os valores detodos os parmetros contidos no formulrio. Como o mtodogetParameterNames() retorna uma referncia a um objetoEnumeration preciso importar o pacote java.util, por meio da diretivapage.

    Formulrio

    =

    Nome: Telefone:

    Exemplo I.XX Pgina JSP com formulrio.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    41

    A figura 12 mostra o resultado da requisio aps a digitao dosvalores Alcione e 333-3333 nas caixas de texto do formulrio.

    Figura 12- Sada do exemplo XX.XX.

    Criando e Modificando Cookies

    Da mesma for que em Servlets os cookies em JSP so tratados por meioda classe Cookie. Para recuperar os cookies enviados pelo navegador usa-se omtodo getCookies() do objeto HttpServletRequest que retorna umarranjo de Cookie. Os mtodos getName() e getvalue() do objetoCookie so utilizados para recuperar o nome o valor da informao associadaao cookie. O cookie enviado para o navegador por meio do mtodoaddCookie() do objeto HttpServletResponse. O exemplo XX.XXmostra uma pgina JSP que exibe todos os cookies recebidos em umarequisio e adiciona mais um na resposta.

    Session id:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    42 For(int i = 0; i < cookies.length; i++) { %> Cookie name: Value: antiga idade mxima em segundos:

    nova idade mxima em segundos:

    Exemplo I.XX Pgina JSP que exibe os cookies recebidos.

    A figura 13 mostra o resultado aps trs acessos seguidos pgina JSP.Note que existe um cookie a mais com o nome JSESSIONID e valor igual sesso. Este cookie o usado pelo container para controlar a sesso.

    Session id: 9ppfv0lsl1Cookie name: Cookie 0value: Valor 0antiga idade mxima em segundos: -1nova idade mxima em segundos: 5Cookie name: Cookie 1value: Valor 1antiga idade mxima em segundos: -1nova idade mxima em segundos: 5Cookie name: JSESSIONIDvalue: 9ppfv0lsl1antiga idade mxima em segundos: -1nova idade mxima em segundos: 5

    Figura 13- Sada do exemplo XX.XX aps trs acessos.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    43

    Lidando com sesses

    O atributos de uma sesso so mantidos em um objeto HttpSessionreferenciado pela varivel session. Pode-se armazenar valores em umasesso por meio do mtodo setAttribute() e recuper-los por meio domtodo getAttribute(). O tempo de durao default de uma sessoinativa (sem o recebimento de requisies do usurio) 30 minutos mas essevalor pode ser alterado por meio do mtodosetMaxInactiveInterval(). O exemplo XX.XX mostra duas pginasJSP. A primeira apresenta um formulrio onde podem ser digitados dois valoresrecebe dois valores de digitados em um formulrio e define o intervalo mximode inatividade de uma sesso em 10 segundos. A segunda pgina recebe asubmisso do formulrio, insere os valores na sesso e apresenta os valoresrelacionados com a sesso assim como a identificao da sesso.

    FormulrioId da sesso: Essa sesso foi criada em

    Antigo intervalo de inatividade =

    Novo intervalo de inatividade=

    =

    Nome: Telefone:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    44

    Id da sesso: 0) session.setAttribute("nome",nome); if (telefone !=null &&telefone.length()>0) session.setAttribute("telefone",telefone);%>

    Exemplo I.XX Exemplo do uso de sesso.

    O exemplo XX.XX mostra que a sesso mantida mesmoquando o usurio muda de pgina. As figura 14 e 15 mostram o resultado darequisio aps a digitao dos valores Alcione e 333-3333 nas caixas detexto do formulrio, submisso para pgina sessao2.jsp e o retorno pgina sessao1.jsp.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    45

    Figura 14- Tela da pgina sessao1.jsp.

    Figura 15. Tela da pgina sessao2.jsp.

    O Uso de JavaBeans

    FormulrioId da sesso: soo8utc4m1Essa sesso foi criada em 1002202317590Antigo intervalo de inatividade = 1800Novo intervalo de inatividade= 10

    telefone = 333-3333nome = Alcione

    Nome:

    Telefone:

    envie

    Id da sesso: soo8utc4m1Retorna

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    46

    A medida que o cdigo Java dentro do HTML torna-se cada vez maiscomplexo o desenvolvedor pode-se perguntar: Java em HTML no oproblema invertido do HTML em Servlet? O resultado no ser to complexoquanto produzir uma pgina usando println()? Em outras palavras, estounovamente misturando contedo com forma?

    Para solucionar esse problema a especificao de JSP permite o uso deJavaBeans para manipular a parte dinmica em Java. JavaBeans j foramdescritos detalhadamente em um captulo anterior, mas podemos encarar umJavaBean como sendo apenas uma classe Java que obedece a uma certapadronizao de nomeao de mtodos, formando o que denominado depropriedade. As propriedades de um bean so acessadas por meio de mtodosque obedecem a conveno getXxxx e setXxxx. , onde Xxxx o nome dapropriedade. Por exemplo, getItem() o mtodo usado para retornar o valorda propriedade item. A sintaxe para o uso de um bean em uma pgina JSP :

    Onde nome o identificador da varivel que conter uma refernciapara uma instncia do JavaBean. Voc tambm pode modificar o atributoscope para estabelecer o escopo do bean alm da pgina corrente.

    Para modificar as propriedades de um JavaBean voc pode usar ojsp:setProperty ou chamar um mtodo explicitamente em umscriptlet. Para recuperar o valor de uma propriedade de um JavaBean vocpode usar o jsp:getProperty ou chamar um mtodo explicitamente emum scriptlet. Quando dito que um bean tem uma propriedade prop dotipo T significa que o bean deve prover um mtodo getProp() e um mtododo tipo setProp(T). O exemplo XX.XX mostra uma pgina JSP e umJavaBean. A pgina instancia o JavaBean, altera a propriedade mensagem erecupera o valor da propriedade, colocando-o na pgina.

    Pgina bean.jsp

    Uso de beans

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    47

    Uso de JavaBeans

    Mensagem:

    Arquivo Curso/BeanSimples.java

    package curso;

    public

    class BeanSimples {

    private String men = "Nenhuma mensagem";

    public String getMensagem() {

    return(men); }

    public void setMensagem(String men) {

    this.men = men; }}

    Exemplo I.XX Exemplo do uso de JavaBean.

    A figura 16 mostra o resultado da requisio dirigida pginabean.jsp.

    Figura 16- Resultado da requisio pgina bean.jsp.

    Se no tag setProperty usarmos o valor * para o atributoproperty ento todos os valores de elementos de formulrios que possurem

    Mensagem: Ola mundo!

    Uso de JavaBeans

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    48

    nomes iguais propriedades sero transferidos para as respectivas propriedadesno momento do processamento da requisio. Por exemplo, seja uma pgina jspcontendo um formulrio com uma caixa de texto com nome mensagem, comomostrado no exemplo XX.XX. Note que, neste caso, a propriedade mensagemdo JavaBean tem seu valor atualizado para o valor digitado na caixa de texto,sem a necessidade de uma chamada explcita no tag setProperty. Osvalores so automaticamente convertidos para o tipo correto no bean.

    Uso de beans Uso de JavaBeans

    Mensagem:

    Texto:

    Exemplo I.XX Exemplo de atualizao automtica da propriedade.

    A figura 17 mostra o resultado da requisio dirigida pginabean2.jsp aps a digitao do texto Ol!

    Figura 17- Resultado da requisio pgina bean2.jsp.

    Mensagem: Ola!

    Uso de JavaBeans

    envie

    Texto:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    49

    Escopo

    Existem quatro valores possveis para o escopo de um objeto: page,request, session e application. O default page. A tabelaXX.XX descreve cada tipo de escopo.

    Escopo Descriopage Objetos declarados com nesse escopo so vlidos at a

    resposta ser enviada ou a requisio ser encaminhadapara outro programa no mesmo ambiente, ou seja, spodem ser referenciados nas pginas onde foremdeclarados. Objetos declarados com escopo page soreferenciados pelo objeto pagecontext.

    request Objetos declarados com nesse escopo so vlidos durantea requisio e so acessveis mesmo quando a requisio encaminhada para outro programa no mesmo ambiente.Objetos declarados com escopo request soreferenciados pelo objeto request.

    session Objetos declarados com nesse escopo so vlidos durantea sesso desde que a pgina seja definida para funcionarem uma sesso. Objetos declarados com escoposession so referenciados pelo objeto session.

    application Objetos declarados com nesse escopo so acessveis porpginas no mesmo servidor de aplicao. Objetosdeclarados com escopo application soreferenciados pelo objeto application.

    Tabela I.XX Escopo dos objetos nas pginas JSP.

    Implementao de um Carrinho de compras

    O exemplo abaixo ilustra o uso de JSP para implementar um carrinho decompras virtual. O carrinho de compras virtual simula um carrinho de comprasde supermercado, onde o cliente vai colocando os produtos selecionados paracompra at se dirigir para o caixa para fazer o pagamento. No carrinho de

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    50

    compras virtual os itens selecionados pelo usurio so armazenados em umaestrutura de dados at que o usurio efetue o pagamento. Esse tipo de exemploexige que a pgina JSP funcione com o escopo session para manter ocarrinho de compras durante a sesso. O exemplo XX.XX mostra um exemplosimples de implementao de carrinho de compras. O exemplo composto pordois arquivos: um para a pgina JSP e um para o JavaBean que armazena ositens selecionados.

    Pgina compras.jsp

    0) {%> Voc comprou os seguintes itens:

    Entre um item para adicionar ou remover: Televiso Rdio Computador Vdeo Cassete

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    51

    JavaBean compra/Carrinho.java

    Package compra;

    Import javax.servlet.http.*;Import java.util.Vector;Import java.util.Enumeration;

    Public class Carrinho { Vector v = new Vector(); String submit = null; String item = null;

    Private void addItem(String name) {v.addElement(name); }

    Private void removeItem(String name) {v.removeElement(name); }

    Public void setItem(String name) {item = name; }

    Public void setSubmit(String s) { submit = s; }

    Public String[] getItems() { String[] s = new String[v.size()]; v.copyInto(s); return s; }

    private void reset() { submit = null; item = null; }

    public void processRequest(HttpServletRequest request) { if (submit == null) return;

    if (submit.equals("adicione")) addItem(item); else if (submit.equals("remova")) removeItem(item); reset(); }}

    Exemplo I.XX Implementao de um carrinho de compras Virtual.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    52

    O exemplo XX.XX implementa apenas o carrinho de compras, deixandode fora o pagamento dos itens, uma vez que esta etapa depende de cada sistema.Geralmente o que feito direcionar o usurio para outra pgina onde eledigitar o nmero do carto de crdito que ser transmitido por meio de umaconexo segura para o servidor. Existem outras formas de pagamento, comoboleto bancrio e dinheiro virtual. O prprio carrinho de compras geralmente mais complexo, uma vez que os para compra devem ser obtidos dinamicamentede um banco de dados. A figura 18 mostra a tela resultante de algumasinteraes com o carrinho de compras.

    Figura 18- Carrinho de compras virtual.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    53

    Reencaminhando ou Redirecionando requisies

    Existem algumas situaes onde pode ser desejvel transferir umarequisio para outra URL. Isto feito com frequncia em sistemas quecombinam o uso de Servlets juntamente com JSP. No entanto, a transfernciapode ser para qualquer recurso. Assim, podemos transferir uma requisio deum Servlet para uma pgina JSP, HTML ou um Servlet. Da mesma forma umapgina JSP pode transferir uma requisio para uma pgina JSP, HTML ou umServlet.

    Existem dois tipos de transferncia de requisio: o redirecionamento eo reencaminhamento. O redirecionamento obtido usando o mtodosendRedirect() de uma instncia HttpServletResponse, passandocomo argumento a URL de destino. O exemplo XX.XX mostra o cdigo de umServlet redirecionando para uma pgina HTML.

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

    public class Redireciona extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.sendRedirect("/test/index.html"); }}

    Exemplo I.XX Redirecionamento de requisio.

    Note pelo exemplo que preciso passar o contexto do recurso(/teste). No caso de redirecionamento o a requisio corrente perdida euma nova requisio feita para a URL de destino. Por isso no se deveassociar nenhum objeto requisio, uma vez que o objetoHttpServletRequest corrente ser perdido. O que ocorre na prtica queo servidor envia uma mensagem HTTP 302 de volta para o cliente informandoque o recurso foi transferido para outra URL e o cliente envia uma novarequisio para a URL informada.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    54

    J no caso de reencaminhamento a requisio encaminhadadiretamente para a nova URL mantendo todos os objetos associados e evitandouma nova ida ao cliente. Portanto, o uso de reencaminhamento mais eficientedo que o uso de redirecionamento. O reencaminhamento obtido usando omtodo forward() de uma instncia RequestDispatcher, passandocomo argumento os objetos HttpServletRequest eHttpServletResponse para a URL de destino. Uma instnciaRequestDispatcher obtida por meio do mtodogetRequestDispatcher()de uma instncia ServletContext , que obtido, por sua vez, por meio do mtodo getServletContext() doServlet. O exemplo XX.XX mostra o cdigo de um Servlet reencaminhando arequisio para uma pgina JSP.

    import javax.servlet.*;import javax.servlet.http.*;

    public class Reencaminha extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) { try { getServletContext().getRequestDispatcher("/index.html"). forward(request,response); }catch (Exception e) { System.out.println("Servlet falhou: "); e.printStackTrace(); } }}

    Exemplo I.XX Reencaminhamento de requisio.

    Note que no necessrio passar o contexto na URL, como feito noredirecionamento, uma vez que a requisio encaminhada no contextocorrente.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    55

    Uma Arquitetura para comrcio eletrnico

    O projeto de uma soluo para comrcio eletrnico uma tarefacomplexa e deve atender diversos requisitos. Nesta seo mostraremos umamodelo de arquitetura bsico para comrcio eletrnico que pode ser adaptadopara solues mais especficas. Este modelo implementa o padro de projetoMVC, procurando, desta forma, isolar esses aspectos de um sistema decomputao.

    Tipos de aplicaes na WEB

    Podemos enquadra as aplicaes na Web em um dos seguintes tipos:

    Business-to-consumer (B2C) entre empresa e consumidor. Exemplo:uma pessoa compra um livro na Internet.

    Business-to-business (B2B) Troca de informaes e servios entreempresas. Exemplo: o sistema de estoque de uma empresa de automveisdetecta que um item de estoque precisa ser resposta e faz o pedidodiretamente ao sistema de produo do fornecedor de autopeas. Neste tipode aplicao a linguagem XML possui um papel muito importante, uma vezque existe a necessidade de uma padronizao dos tags para comunicaode contedo.

    User-to-data acesso bases de informao. Exemplo: uma usurioconsulta uma base de informao.

    User-to-user chat, e troca de informaes entre usurios (napster).

    O exemplo que mostraremos tipicamente um caso de User-to-data,(agenda eletrnica na Web) mas possui a mesma estrutura de um B2C.

    Arquitetura MVC para a Web

    A figura XX.XX contm um diagrama de blocos que mostra aparticipao de Servlets, JSP e JavaBeans na arquitetura proposta. A idia

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    56

    isolar cada aspecto do modelo MVC com a tecnologia mais adequada. A pginaJSP tima para fazer o papel da viso, uma vez que possui facilidades para ainsero de componentes visuais e para a apresentao de informao. Noentanto, um pouco estranho usar uma pgina JSP para receber e tratar umarequisio. Esta tarefa, que se enquadra no aspecto de controle do modelo MVC mais adequada a um Servlet, uma vez que neste momento compontes deapresentao so indesejveis. Finalmente, desejvel que a modelagem donegcio fique isolada dos aspectos de interao. A proposta que a modelagemdo negcio fique contida em classes de JavaBeans. Em aplicaes maissofisticadas a modelagem do negcio deve ser implementada por classes deEnterprise JavaBeans (EJB), no entanto esta forma de implementao foge aoescopos deste livro. Cada componente participa da seguinte forma:

    Servlets Atuam como controladores, recebendo as requisies dosusurios. Aps a realizao das anlises necessria sobre a requisio,instancia o JavaBean e o armazena no escopo adequado (ou no caso o beanj tenha sido criado no escopo) e encaminha a requisio para a pgina JSP.

    JavaBeans Atuam como o modelo da soluo, independente da requisioe da forma de apresentao. Comunicam-se com a camada intermediriaque encapsula a lgica do problema.

    JSP Atuam na camada de apresentao utilizando os JavaBeans paraobteno dos dados a serem exibidos, isolando-se assim de como os dadosso obtidos. O objetivo minimizar a quantidade de cdigo colocado napgina.

    Camada Intermediria (Middleware) Incorporam a lgica de acesso aosdados. Permitem isolar os outros mdulos de problemas como estratgias deacesso aos dados e desempenho. O uso de EJB (Enterprise JavaBeans) recomendado para a implementao do Middleware, uma vez que os EJBspossuem capacidades para gerncia de transaes e persistncia. Istoimplica na adoo de um servidor de aplicao habilitado para EJB.

    A figura 19 mostra a interao entre os componenetes.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    57

    Figura 19. Arquitetura de uma aplicao para Comrcio Eletrnico.

    Essa arquitetura possui as seguintes vantagens:

    1. Facilidade de manuteno: a distribuio lgica das funes entre osmdulos do sistema isola o impacto das modificaes.

    2. Escalabilidade: Modificaes necessria para acompanhar o aumento dademanda de servios (database pooling, clustering, etc) ficam concentradasna camada intermediria.

    A figura 20 mostra a arquitetura fsica de uma aplicao de comrcioeletrnico.

    Navegador Web

    JSP(Apresentao)

    RequisioServlet

    (controlador)

    Resposta

    JavaBean(modelo)

    Cria uma instncia

    Servidor de Aplicao1

    54

    3

    2

    SGBD

    JDBC

    MiddleWare

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    58

    Figura 20. Arquitetura fsica de uma aplicao para Comrcio Eletrnico.

    Demilitarized Zone (DMZ) onde os servidores HTTP so instalados. ADMZ protegida da rede pbica por um firewall, tambm chamado de firewallde protocolo. O firewall de protocolo deve ser configurado para permitirtrfego apenas atravs da porta 80. Um segundo firewall, tambm chamado defirewall de domnio separa a DMZ da rede interna. O firewall de domnio deveser configurado para permitir comunicao apenas por meio das portas doservidor de aplicao

    Agenda Web: Um Exemplo de uma aplicao Web usando aarquitetura MVC

    O exemplo a seguir mostra o desenvolvimento da agenda eletrnica parao funcionamento na Web. A arquitetura adotada uma implementao domodelo MVC. Apenas, para simplificar a soluo, a camada intermediria foisimplificada e implementada por um JavaBean que tem a funo de gerenciara conexo com o banco de dados. O banco de dados ser composto por duastabelas, uma para armazenar os usurios autorizados a usar a tabela e outra paraarmazenar os itens da agenda. A figura 21 mostra o esquema conceitual dobanco de dados e a figura 22 mostra o comando para a criao das tabelas. Noteque existe um relacionamento entre a tabela USUARIO e a tabela PESSOA,mostrando que os dados pessoais sobre o usurio ficam armazenados naagenda.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    59

    Figura 21. Esquema conceitual do banco de dados para a agenda.

    As tabelas do BD devem ser criadas de acordo com o seguinte script:

    CREATE TABLE PESSOA (ID INT PRIMARY KEY, NOME VARCHAR(50) NOT NULL, TELEFONE VARCHAR(50), ENDERECO VARCHAR(80), EMAIL VARCHAR(50), HP VARCHAR(50), CELULAR VARCHAR(20), DESCRICAO VARCHAR(80));

    CREATE TABLE USUARIO (ID INT PRIMARY KEY, LOGIN VARCHAR(20) NOT NULL, SENHA VARCHAR(20) NOT NULL, CONSTRAINT FK_USU FOREIGN KEY (ID) REFERENCES PESSOA(ID));

    Figura 22. Script para criao das tabelas.

    Para se usar a agenda necessrio que exista pelo menos um usuriocadastrado. Como no exemplo no vamos apresentar uma tela para cadastro deusurios ser preciso cadastr-los por meio comandos SQL. Os comandos dafigura 23 mostram como cadastrar um usurio.

    INSERT INTO PESSOA(ID,NOME,TELEFONE,ENDERECO,EMAIL)VALUES(0,'Alcione de Paiva Oliveira','3899-1769', 'PH Rolfs','[email protected]');

    INSERT INTO USUARIO(ID,LOGIN,SENHA) VALUES(0,'Alcione','senha');

    USUARIO PESSOA1:1 1:1

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    60

    Figura 23. Script para cadastra um usurio.

    O sistema e-agenda composta pelos seguintes arquivos:

    Arquivo Descrioagenda.html Pgina inicial do site, contendo o formulrio para a

    entrada do login e senha para entrar no restante dosite.

    principal.jsp Pgina JSP contendo o formulrio para entrada dedados para insero, remoo ou consulta de itens daagenda.

    LoginBean.java JavaBean responsvel por verificar se o usurio estautorizado a acessar a agenda.

    AgendaServlet.java Servlet responsvel pelo tratamento de requisiessobre alguma funo da agenda (consulta, insero eremoo)

    AcaoBean.java JavaBean responsvel pela execuo da aosolicitada pelo usurio.

    ConnectionBean.java JavaBean responsvel pelo acesso ao DB e controledas conexes.

    Tabela XV.XX. Arquivos do sistema e-agenda.

    O diagrama de colaborao abaixo mostra as interao entre oscomponentes do sistema.

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    61

    Figura 24. Interao entre os componentes do sistema.

    Descreveremos agora cada componente da aplicao. O exemploXX.XX mostra cdigo HTML da pgina agenda.html. Esta a pginainicial da aplicao. Ela contm o formulrio para a entrada do login e senhapara entrar no restante do site.

    1234567891011121314151617181920

    Agenda

    Login: Senha:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    62

    21222324252627282920313233343536373839

    function TestaVal(){ if (document.TesteSub.login.value == "") { alert ("Campo Login nao Preenchido...Form nao Submetido") return false } else if (document.TesteSub.senha.value == "") { alert ("Campo Senha nao Preenchido...Form nao Submetido") return false } else { return true }}//-->

    Exemplo I.XX agenda.html.

    O formulrio est definido nas linha 11 a 17. Na linha 12 o parmetroaction indica a URL que dever receber a requisio. A URL virtual e suaassociao com o Servlet AgendaServlet ser definida no arquivoweb.xml. Na linha 16 definido um campo oculto (Hidden) como o nomede corrente e valor 0. Ele ser usado pelo AgendaServlet reconhecer apgina de onde saiu a requisio. As linha 19 a 31 definem uma funo emJavaScript que ser usada para verificar se o usurio digitou o nome e a senhaantes de enviar a requisio ao usurio. O uso de JavaScript no lado cliente paracriticar a entrada do usurio muito comum pois diminui a sobrecarga doservidor.

    O exemplo XX.XX mostra cdigo da pgina principal.jsp. Estapgina contm o formulrio para entrada de dados para insero, remoo ouconsulta de itens da agenda. Na linha 4 a diretiva page define que o servidordeve acompanhar a sesso do usurio e importa o pacote agenda. Na linha 7um objeto da classe agenda.LoginBean recuperado da sesso por meiodo mtodo getAttribute(). Para recuperar o objeto preciso passar para omtodo o nome que est associado ao objeto na sesso. De forma semelhante,na linha 8 um objeto da classe agenda.AcaoBean recuperado darequisio por meio do mtodo getAttribute(). Este objeto recuperadoda requisio porque cada requisio possui uma ao diferente associada. Na

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    63

    linha 9 verificado se objeto agenda.LoginBean foi recuperado e se oretorno do mtodo getStatus() true. Se o objetoagenda.LoginBean no foi recuperado significa que existe uma tentativade acesso direto pgina principal.jsp sem passar primeiro pela pginaagenda.html ou que a sesso se esgotou. Se o mtodo getStatus()retornar false significa que o usurio no est autorizado a acessar essapgina. Nestes casos processado o cdigo associado ao comando else dalinha 51 que apaga a sesso por meio do mtodo invalidate() do objetoHttpSession (linha 53) e mostra a mensagem Usurio no autorizado(linha 55). Caso o objeto indique que o usurio est autorizado os comandosinternos ao if so executados. Na linha 11 mostrada uma mensagem com onome do usurio obtido por meio do mtodo getNome() do objetoagenda.LoginBean . Na linha 13 mostrado o resultado da ao anteriorpor meio do mtodo toString() do objeto agenda.AcaoBean. A aopode ter sido de consulta, insero de um novo item na agenda e remoo deum item na agenda. No primeiro caso mostrado uma lista dos itens quesatisfizeram a consulta. No segundo e terceiro casos exibida uma mensagemindicado se a operao foi bem sucedida.

    1234567891011121314151617181920212223242526

    Tela da Agenda

    Sesso do

    Nome: Telefone: Endereo: Email: Pgina: Celular: Descrio:

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    64272829303132333435363738394041424344454647484950515253545556575859

    Usurio no autorizado

    Exemplo I.XX principal.jsp.

    As linhas 17 a 31 definem o cdigo do formulrio de entrada. Nas linhas17 e 18 so definidos os atributos do formulrio. O atributo method indica arequisio ser enviada por meio do mtodo POST. O atributo name define onome do formulrio como sendo formprin. O atributo onsubmit defineque a funo javaSript TestaVal() deve ser executada quando o formulriofor submetido. Finalmente, o atributo action define a URL para onde arequisio deve ser enviada. Neste caso a URL agenda/agenda que estmapeada para o Servlet AgendaServlet. O mapeamento feito no arquivoweb.xml do diretrio web-inf do contexto agenda, como mostrado nafigura XX.XX. As linhas 19 a 25 definem os campos de texto para entrada dos

  • Apostila Servlet/JSP

    Alcione de Paiva Oliveira - Universidade Federal de Viosa

    65

    valores. As linhas 27 a 29 definem os botes de submit. Todos possuem omesmo nome, de forma que o Servlet precisa apenas examinar o valor doparmetro acao para determinar qual ao foi solicitada Na linha 30 definidoum campo oculto (Hidden) como o nome de corrente e valor 0. Ele serusado pelo AgendaServlet reconhecer a pgina de onde saiu a requisio.As linha 33 a 47 definem uma funo em JavaScript que ser usada paraverificar se o usurio entrou com valores nos campos de texto nome oudecricao. No mnimo um desses campos deve ser preenchido para que umaconsulta possa ser realizada.

    O exemplo XX.XX mostra cdigo do JavaBean usado para intermediara conexo com o banco de dados. O JavaBean ConnectionBean tem aresponsabilidade de abrir uma conexo com o banco de dados, retornar umareferncia desta conexo quando solicitado e registrar se a conexo esta livre ouocupada. Neste exemplo estamos trabalhando com apenas uma conexo com obanco de dados porque a verso gerenciador de banco de dados utilizado(PointBasetm), por ser um verso limitada, permite apenas uma conexo aberta.Se o SGBD permitir varias conexes simultneas pode ser necessrio um maiorcontrole sobre as conexes, mantendo-as em uma estrutura de dadosdenominada de pool de conexes. Na linha 12 podemos observar que oconstrutor da classe foi declarado com o modificador de acesso private. Istosignifica que no possvel invocar o construtor por meio de um objeto deoutra classe. Isto feito para que se possa ter um controle sobre a criao deinstncias da classe. No nosso caso permitiremos apenas que uma instncia daclasse seja criada, de modo que todas as referncias apontem para esse objeto.Esta tcnica de programao, onde se permite uma nica instncia de umaclasse denominada de padro de projeto Singleton. O objetivo de uti