Você está na página 1de 43

UNIDADE 2 PROGRAMAO JAVA PARA WEB

OBJETIVOS DA UNIDADE Demonstrar a linguagem Java direcionada a aplicaes em ambientes web. Possibilitar ao aluno que utilize os recursos desta linguagem em diversas aplicaes na Internet, apresentando suas ferramentas e estabelecendo uma prtica atravs da implantao de um microblog.

1 INTRODUO
Como voc j deve saber a Internet uma gigantesca "rede" que liga um incontvel nmero de computadores entre si. uma rede heterognea, j que diversos tipos de computadores esto ligados a ela. Todos esses computadores utilizam-se do protocolo TCP/IP como voc deve ter estudado na disciplina de Redes de Computadores. Como eles so distintos, precisam de uma linguagem que no esteja necessariamente amarrada a uma plataforma de hardware/software especfica. Como voc j pde constatar, Java mostra-se ideal quanto a esse fator. Uma vez que os programas Java so transmitidos como bytecodes, eles podem rodar em qualquer computador sem necessitar que o cdigo seja reescrito, independente da plataforma na qual ele ser executado. Nosso estudo ser direcionado para a utilizao da plataforma Java voltada para web e ns iremos discutir os pontos principais para que voc seja capaz de desenvolver aplicaes de alcance global com Java.

2 ANATOMIA DE UMA APLICAO WEB


Aplicaes web Java, trabalham basicamente atravs da troca de mensagens onde o usurio faz requisies e recebe respostas, contudo por trs do conceito bsico de pedir e receber existe uma srie de ferramentas, protocolos, sistemas operativos e servidores de aplicao que tornam tudo isso possvel. Estudaremos alguns conceitos fundamentais para o desenvolvimento de aplicaes e veremos como fazer isso utilizando a plataforma Java.

2.1 CONCEITOS BSICOS 2.1.1 HTML


Acrnimo para HiperText Markup Language, o HTML se popularizou nos anos 90 e amadureceu com o crescimento da Internet basicamente por ser uma linguagem simples que possibilitava a publicao de documentos online com ttulos, fotos, tabelas, possibilidades de recuperao de documentos atravs de links, alm de formulrios para realizao de transaes, entre outras funcionalidades. Na atualidade, mesmo com o surgimento de novos tipos de documentos, o HTML ainda , indiscutivelmente, a forma mais comum de publicao para internet e se um dia ela for substituda, ainda assim, precisaremos conhec-la em funo do grande volume de sistemas legados, j implantados e em produo e que necessitaro de manuteno.

2.1.2 Protocolo HTTP

Contm o conjunto de definies que regulamentam a transmisso de informaes com caractersticas especficas da web. Esse protocolo foi criado tambm nos anos 90 para simples transferncias de dados brutos, no entanto, ele sofreu melhorias em suas definies com a popularizao da Internet. por meio do protocolo HTTP que so efetuadas as transmisses das solicitaes aos servidores web e deles, recebidas as respostas.
NOTA Mais sobre HTTP: Voc pode obter maiores informaes sobre o protocolo HTTP no padro IETF, RCF 2616.

2.1.3 Solicitao e Resposta


De posse de um formato padro de documentos e de um protocolo para prover a comunicao voc passar a possuir os requisitos bsicos para solicitar e disponibilizar informaes, contudo, ir precisar de ferramentas que lhe permita realizar requisies e fornecer respostas, dependendo do lado que voc esteja.

2.1.3.1 O Browser
atravs deste programa que se realiza as solicitaes s informaes disponveis na WEB. Existem vrios browsers disponveis no mercado, dentre os mais populares esto o Internet Explorer da Microsoft, o Firefox da Mozilla e o Safari da Apple.
FIGURA 17 EXEMPLOS DE TELAS DE BROWSERS

2.1.3.2 O Servidor WEB


O servidor web basicamente constitudo de um computador, plugado na Internet, contendo um servidor WEB instalado. Existem vrios servidores disponveis no mercado, dentre eles, o mais popular o Apache da fundao Apache, contudo, at aqui estamos falando de servidor HTTP e precisaremos de um pouco mais que isso para aplicaes Java, j que alm de entender o protocolo HTTP ele tambm necessita implementar as especificaes de Servlet e JSP.

2.2 ESTRUTURA DA APLICAO JAVA PARA WEB 2.2.1 Estrutura de diretrios

Para desenvolver uma aplicao Java para web necessrio seguir a estrutura de diretrios recomendada pela especificao. Essa organizao deve obrigatoriamente seguir o modelo. aplicacao |-- WEB-INF | |-- classes | | `-- ... | |-- lib | | `-- ... | `-- web.xml |-- ... `-- index.jsp

Entendendo melhor esses diretrios temos: aplicacao Diretrio principal, desenvolvimento. WEB-INF Obrigatoriamente deve ser escrita em letras maisculas. Fique bastante alerta sobre isso, alguns sistemas operacionais costumam no se preocupar com a escrita do nome dos arquivos e algumas vezes tomam a liberdade de mudar isso para, por exemplo, Web-inf, isso no reconhecido na estrutura de diretrios e sua aplicao no funcionar. classes Diretrio onde ficar os arquivos contendo as regras de negcio da aplicao. lib Diretrio onde ficaro as bibliotecas atravs das quais sua aplicao necessita para funcionar. web.xml O arquivo web.xml tambm conhecido como descritor de distribuio, do ingls Deployment Descriptor(DD), nele que sero definidos parmetros iniciais, regras de navegao, configuraes de sesso, pgina inicial, etc. index.jsp geralmente, reflete o nome da aplicao em

Pgina inicial da aplicao, esse nome pode ser configurado para o nome desejado no DD.

2.2.2 Visibilidade
Junto a estrutura definida pela especificao deve ficar claro o que visvel para um cliente web e o que visvel apenas para a aplicao. Voc precisa definir isso de forma a no deixar exposta para web, informaes como a regra de negcio da empresa e sim, os recursos que sero trabalhados e enviados ao cliente baseados nas aes e regras definidas pela aplicao. Na estrutura web exposta, tudo visvel aos clientes web, com exceo das informaes contidas no diretrio WEB-INF, pois l que ficaro as classes contendo as regras de negcio e navegao da sua aplicao, e isso s diz respeito a aplicao, o cliente s precisa receber a pgina contendo seu extrato e de forma alguma, informaes internas como acesso a dados, bancos utilizados, regras de negcio e etc.

2.2.3 Como a aplicao deve ser distribuda


J vimos que a aplicao deve ter uma estrutura obrigatria para ser reconhecida como uma aplicao web, caso essa estrutura seja colocada em um servidor web, j suficiente para que a aplicao funcione, contudo, a plataforma Java, defini alguns formatos de arquivos para agrupar os diversos tipos de aplicao. Para web, o arquivo a ser distribudo ser um arquivo web, do ingls Web ARchive, onde esse arquivo nada mais que um arquivo compactado contendo a estrutura da aplicao web, ou seja, se voc tem uma aplicao chamada microblog, essa aplicao ser compactada em um arquivo chamado microblog.war.

2.2.4 Ferramentas
O Java ao ser instalado vem com ferramentas que do apoio ao desenvolvimento de aplicaes, dentre elas, possumos uma especialmente construda para realizar o servio de compactao, o JAR. 2.2.4.1 JAR O jar um arquivo de aplicao distribudo junto com o kit de desenvolvimento Java e sua utilizao, assim como a maioria das ferramentas, deve ser executada em um terminal ou prompt de comandos e segue a seguinte sintaxe:

jar cvf <arquivo>.<extenso> <arquivos/diretrio a compactar> ou seja, se quiser compactar a aplicao existente em um diretrio chamado microblog o comando a ser executado ser: jar cvf microblog.war microblog/ O jar, possui muitas outras funcionalidades que podem ser visualizadas executando simplesmente jar. 2.2.4.2 ANT Mesmo possuindo todos os requisitos necessrios ao empacotamento, existem algumas ferramentas que do um suporte adicional a esse trabalho e incluem ainda funcionalidades como compilao dos cdigos Java, envio de email, suporte a testes de software, dentre outras. O ant, pode ser adquirido no site http://ant.apache.org/ e sua instalao bem simples, basta ter o Java instalado, descompactar o arquivo do ant no diretrio de sua preferncia, criar uma varivel de ambiente chamada ANT_HOME indicando esse diretrio e incluir o diretrio bin do ant no PATH do sistema operacional. Sua execuo se d a partir da leitura de um arquivo chamado build.xml onde nele ser definida todas as tarefas que devero ser executadas. Abaixo, a estrutura central de um build.xml. <?xml version="1.0" encoding="UTF-8"?> <project name="projeto" basedir="." default="tarefaDefault"> <target name="tarefa1"> </target> <target name="tarefaDefault"> </target> </project> importante frisar que a estrutura de uma aplicao web Java deve ser feita obrigatoriamente da forma que a especificao determina, contudo, no necessariamente sua pasta de projetos no ambiente de desenvolvimento precisa seguir exatamente essa estrutura, como no exemplo a seguir.

2.3 MO NA MASSA

2.3.1 Iniciando uma aplicao


Iniciaremos uma nova aplicao construindo a estrutura de diretrios conforme o esquema a seguir. Ser fcil voc observar que a estrutura criada no exatamente a estrutura de uma aplicao web Java, contudo, aps a execuo do build, teremos como resultado um arquivo .war com a exata estrutura exigida pela especificao. MicroBlog/ |-- build.xml |-- src `-- webapp | |-- WEB-INF | | `-- classes | |-- lib | `-- web.xml `-- index.jsp

2.3.2 Build.xml
<?xml version="1.0" encoding="UTF-8"?> <project name="microblog" basedir="." default="dist"> <!-- DEFINIO DAS PROPRIEDADES A SEREM UTILIZADAS --> <property name="src.dir" value="${basedir}/src" /> <property name="bin.dir" value="${basedir}/webapp/WEB-INF/classes" /> <property name="dest.dir" value="${basedir}/target" /> <property name="web.dir" value="${basedir}/webapp" /> <!-- TAREFA INICIAL LIMPEZA DOS DIRETRIOS --> <target name="init"> <delete dir="${dest.dir}" /> <mkdir dir="${dest.dir}" /> </target> <!-- CONTRUO DO ARQUIVO DE DISTRIBUIO --> <target name="dist" depends="init"> <war destfile="${dest.dir}/${ant.project.name}.war" webxml="${web.dir}/WEB-INF/web.xml"> <fileset dir="${web.dir}"> <exclude name="**/web.xml" /> </fileset> </war> </target> </project>

2.3.3 Index.jsp
<html>

<title>MicroBlog da IFPA</title> <body> <b>IFPA</b><br> <b>Microblog</b> <hr> </body> </html>

2.3.4 Web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <description>MicroBlog</description> <display-name>MicroBlog</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>

2.3.5 Resultado Final


Para finalizar, no diretrio MicroBlog bastar executar o ant e se tudo correr bem ser exibido um resultado semelhante ao texto abaixo: Microblog> ant Buildfile: build.xml init: [delete] Deleting directory /home/william/workspace/MicroBlog/target [mkdir] Created dir: /home/william/workspace/MicroBlog/target dist: [war] Building war: /home/william/workspace/MicroBlog/target/microblog.war
BUILD SUCCESSFUL

Total time: 0 seconds Isso indica que o processo de gerao do arquivo finalizou com sucesso e agora voc possui um arquivo microblog.war dentro do diretrio target com as caractersticas exigidas pela especificao.

2.4 PARA ONDE TUDO ISSO VAI?


Como de conhecimento, Java uma linguagem interpretada e para sua execuo requer um ambiente que de suporte a esse trabalho, no caso a Java Virtual Machine(JVM) instalada. Em aplicaes web, necessrio algo que vai alm da JVM, j que precisamos desde a interpretao de documentos HTML at comunicao de redes atravs dos protocolos de comunicao, sobre tudo o HTTP, que como j foi visto o principal na utilizao da Internet. Muitas comunidades e at grandes corporaes investem milhes de dlares em solues para servidores de aplicaes, oferecendo melhorias e funcionalidades adicionais especificao, de forma que se tornem mais competitivos. Abordaremos para o mdulo, um dos mais populares container web do mercado. O Tomcat da fundao de software Apache.

2.4.1 Container Web Tomcat


Sendo um dos mais populares continer web do mercado, o Tomcat uma implementao de cdigo aberto das especificaes de Servlet e JSP da JCP, que com o apoio da comunidade Java, vem ao longo dos anos ganhando espao e maturidade para suportar aplicaes de mdio e at, algumas vezes, de grande porte. 2.4.1.1 COMO OBTER? A fundao apache disponibiliza o tomcat atravs do site http://tomcat.apache.org. Durante o desenvolvimento deste fascculo a verso disponvel era a 6.0.18, onde seu contedo foi testado. 2.4.1.2 INSTALAO E CONFIGURAO Uma vez finalizado o download, voc deve descompactar o arquivo em um diretrio de sua preferncia, sempre lembrando que interessante evitar diretrio/pastas, com nomes contendo espaos em branco e mesclas de caixa alta e baixa, j que a aplicao Java, por ser multiplataforma pode ser transportada para sistemas operacionais sensveis a essa diferenas. O tomcat est distribudo atravs da seguinte estrutura de diretrios: apache-tomcat-6.0.18 |-- bin | |-- catalina.sh | |-- catalina.bat | |-- shutdown.bat | |-- shutdown.sh | |-- startup.bat | |-- startup.sh | |-- ... | `-- version.sh

|-- conf | |-- context.xml | |-- server.xml | |-- tomcat-users.xml | |-- ... | `-- web.xml |-- lib | |-- jsp-api.jar | |-- servlet-api.jar | |-- ... | `-- mysql-connector-java-5.1.13-bin.jar (Acesso a dados - Adicione) |-- logs | |-- ... | `-- catalina.out |-- temp |-- webapps `-- work

bin Armazena os scripts responsveis pelo gerenciamento do tomcat, dentre eles o principal o catalina, responsvel pela inicializao e finalizao do container. conf Armazena os principais arquivos de configurao do tomcat, e dentre eles, ns iremos utilizar o material do context.xml para definies de acesso a dados e, o tomcat-users.xml, para definio do usurio e senha para acesso ao administrador do tomcat. lib Contm as bibliotecas para o funcionamento das aplicaes web, dentre elas, destaca-se a servlet-api.jar e jsp-api.jar, implementao das referncias para aplicaes web Java. logs Local onde so armazenadas informaes relativas a execuo do tomcat e das aplicaes nele distribudas. temp Arquivos temporrios. webapps Local onde sero armazenadas as aplicaes. work

Local onde armazenado o cache das aplicaes e os arquivos de servlets compilados a partir do jsp. As configuraes de usurio e senha, necessrias para o acesso ao manager do tomcat, devem ser includas no arquivo tomcat-users.xml, e que deve se parecer com o arquivo abaixo: <?xml version='1.0' encoding='utf-8'?> <tomcat-users> <role rolename="role1"/> <role rolename="tomcat"/> <role rolename="manager"/> <role rolename="admin"/> <user username="tomcat" password="tomcat" roles="tomcat"/> <user username="role1" password="tomcat" roles="role1"/> <user username="admin" password="admin" roles="manager,admin"/> </tomcat-users>

2.4.1.3 INICIALIZANDO O TOMCAT Aps as configuraes utilizaremos o script catalina para inicializao. No diretrio bin digite: No sistema linux Tomcat_home/bin$ ./catalina.sh run Sistema windows Tomcat_home\bin> catalina run Dessa forma teremos inicializao com a exibio do log em tempo de execuo no terminal Linux ou no prompt de comandos, caso esteja utilizando Windows. Aps a inicializao execute o browser da sua preferncia e acesso o endereo: http://localhost:8080/ Se tudo correr bem, ser exibida a voc a pgina inicial do tomcat.

FIGURA 18 TELA INICIAL DO TOMCAT

2.4.1.4 DISTRIBUINDO A APLICAO Para distribuir a aplicao necessrio acessar o Tomcat Manager e digitar o usurio e senha configurados anteriormente no tomcat-users.xml. Ento, selecione a aplicao na seo WAR file to deploy e clique em deploy, conforme a figura abaixo.

FIGURA 19 TELA DE INFORMAO DO TOMCAT

2.5 SERVLET
Muito alm de uma solicitao a uma simples pgina com informaes estticas, os usurios da Internet buscam informaes dinmicas e atualizadas que vo desde consultas simples a livros em uma biblioteca at informaes de extrato de sua conta no banco. Esta necessidade fez com que novas tecnologias fossem acopladas ao desenvolvimento de pginas HTML para fornecer esse dinamismo. O Servlet pode nos ajudar nisso.

2.5.1 O que um Servlet?


So classes Java utilizadas para proporcionar caractersticas que auxiliam servidores de aplicaes nas transaes do tipo requisio/resposta. Ou como diz o autor do livro Tutorial do J2EE.
Um servlet uma classe de linguagem de programao Java utilizada para estender as capacidades de servidores que hospedam acessos de aplicativos por meio de um modelo de programao requisioresposta. (BODOFF, 2005, p.319).

Os servlets proporcionam o dinamismo necessrio s aplicaes web modernas. possvel organizar as aplicaes dividindo-as por funcionalidades e separando essas funcionalidades em servlets especficos, como em uma loja virtual. Pode-se ter um servlet chamado UsuarioServlet, responsvel pela gesto de usurios, ProdutoServlet, para controle dos produtos, VendaServlet, para o registros das vendas e assim por diante.

2.5.2 Primeiro Servlet


Um servlet, nada mais do que uma classe Java, que estende da classe javax.servlet.HttpServlet. Uma vez que um servlet em si pode responder a qualquer tipo de requisio, a plataforma nos facilita a vida fornecendo uma classe abstrata com todas as funcionalidades necessrias ao atendimento de requisies do tipo HTTP atravs de mtodos doGet, doPost, etc. Iniciaremos a escrita do nosso primeiro servlet com uma funcionalidade bem simples. Seu trabalho ser recepcionar o usurio respondendo com bom dia, boa tarde ou boa noite dependendo do horrio. Esse cdigo, poder gerar alguns questionamentos que sero esclarecidos no decorrer do exemplo. arquivo: RecepcionistaServlet.java Este arquivo deve ser criado dentro da pasta src no diretrio br/com/empresa/microblog/utils. package br.com.empresa.microblog.utils; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

public class RecepcionistaServlet extends HttpServlet { private static final long serialVersionUID = 2214154810613869132L; // mtodo que torna o servlet capaz de tratar do // protocolo HTTP mtodos do tipo GET apenas. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // cria um atributo atravs do objeto request como o nome // boasVindas e com a mensagem retornada pelo mtodo // privado boasVindas(Data). req.setAttribute("boasVindas", boasVindas(new Date())); // cria um despachante para encaminhar a requisio a // pgina de resposta a ser enviada ao solicitante RequestDispatcher dispecher = req.getRequestDispatcher("/bemvindo.jsp"); dispecher.forward(req, resp); } private String boasVindas(Date dataAtual) { String result = ""; SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); Date horaAtual; Date tarde; Date noite; try { // Retira a hora da data atual. horaAtual = (Date) sdf.parse(sdf.format(dataAtual)); // define os delimitadores tarde = (Date) sdf.parse("12:00"); noite = (Date) sdf.parse("18:00"); // compara a hora atual com os delimitadores // para definio da resposta. if (horaAtual.before(tarde)) { result = "Bom dia"; } else if (horaAtual.after(tarde) && horaAtual.before(noite)) { result = "Boa tarde"; } else

{ result = "Boa noite"; } } catch (ParseException e) { e.printStackTrace(); } // retorna a mensagem correspondente return result; } } Agora criaremos o arquivo bemvindo.jsp onde esse arquivo ser o arquivo de resposta do exemplo e dever ficar no diretrio raiz da aplicao, no mesmo nvel do index.jsp, no diretrio webapp. O delhalhe nesse arquivo a linguagem de expresso, Expression Language(EL), ${}, neste local dever ser passado o nome dado ao atributo da requisio passado no mtodo doGet do servlet RecepcionistaServlet. Falaremos mais sobre EL mais adiante. <html> <title>Primeiro Servlet</title> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <body> <h2>Desenvolvimento Web com Java</h2> <b>${boasVindas}, usurio !</b> <hr> </body> </html>

web.xml Neste arquivo, como dito anteriormente, voc definir como a aplicao deve se comportar e o que ela deve fazer quando determinado evento acontecer. Criamos um servlet que realizar uma tarefa. No web.xml, define-se de que forma essa tarefa ser disparada. Para isso, contamos com a tag <servlet> e o <servlet-mapping>. Inclua o cdigo abaixo no seu web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <description>MicroBlog</description> <display-name>MicroBlog</display-name>

<servlet> <servlet-name>RecepcionistaServlet</servlet-name> <servlet-class> br.com.empresa.microblog.utils.RecepcionistaServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>RecepcionistaServlet</servlet-name> <url-pattern>/bemvindo.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>

2.5.3 Ajustando o build.xml


Agora, alm de pginas, tambm possumos cdigo Java que precisaro estar dentro do arquivo .war na distribuio. Para que o ant realize o trabalho grosso, precisamos incluir uma nova tarefa no build.xml e fazer alguns ajustes como demonstra a listagem abaixo: <?xml version="1.0" encoding="UTF-8"?> <project name="microblog" basedir="." default="deploy"> <!-- arquivo de propriedades, ajuda a organizar melhor o build e deve ser criado no mesmo que o build.xml --> <property file="build.properties" /> <!-- propriedades que serao utilizadas abaixo, somente para facilitar --> <property name="src.dir" value="${basedir}/src" /> <property name="bin.dir" value="${basedir}/webapp/WEB-INF/classes" /> <property name="dest.dir" value="${basedir}/target" /> <property name="res.dir" value="${basedir}/resources" /> <property name="web.dir" value="${basedir}/webapp" /> <!-- Indica o local onde esto as bibliotecas necessarias a compilao das classes java --> <path id="libs.classpath"> <fileset dir="${web.dir}/WEB-INF/lib" includes="*.jar" /> <fileset dir="${tomcat.home}/lib" includes="*.jar" /> </path> <!-- preparao do ambiente, incluimos o trabalho de realizar o deploy da aplicao no tomcat para tornar mais rpido o

desenvolvimento e os testes --> <target name="init"> <delete dir="${dest.dir}" /> <delete dir="${web.dir}/WEB-INF/classes" /> <delete file="${tomcat.home}/webapps/${ant.project.name}.war" /> <delete dir="${tomcat.home}/webapps/${ant.project.name}" /> <delete dir="${tomcat.home}/work/Catalina/localhost/microblog" /> <mkdir dir="${tomcat.home}/work/Catalina/localhost/microblog" /> <mkdir dir="${dest.dir}" /> <mkdir dir="${web.dir}/WEB-INF/classes" /> </target> <!-- Compilao dos arquivos java da aplicao --> <target name="compile" depends="init" > <javac srcdir="${src.dir}" destdir="${web.dir}/WEB-INF/classes" source="1.5" classpathref="libs.classpath" debug="true" /> </target> <!-- Construo do arquivo war --> <target name="dist" depends="compile"> <war destfile="${dest.dir}/${ant.project.name}.war" webxml="${web.dir}/WEB-INF/web.xml"> <fileset dir="${web.dir}"> <exclude name="**/web.xml" /> </fileset> </war> </target> <!-- distribuio do arquivo war para o tomcat --> <target name="deploy" depends="dist"> <copy file="${dest.dir}/${ant.project.name}.war" todir="${tomcat.home}/webapps" /> </target> </project> O arquivo build.properties, mencionado no build.xml, deve ter o seguinte contedo: tomcat.home=<diretorio do tomcat sem a barra no final> Se o seu tomcat estiver instalado no diretrio c:\java\tomcat, seu build.properties deve estar assim: tomcat.home=c:\java\tomcat

2.5.4 Executando
Aps a concluso das configuraes voc est pronto para testar a aplicao, para isso, abra o browser e acesse a aplicao pelo endereo:

http://localhost:8080/microlog/bemvindo.do Dever aparecer um resultado semelhante ao da tela abaixo:


FIGURA 20 TELA DE CONFIRMAO DE TESTE

2.6 JAVA SERVER PAGE 2.6.1 O que o Java Server Page ?


Segundo Hall & Brow (2005, p.267): A tecnologia Java Server Pages(JSP) o habilita a misturar HTML esttico e regular de maneira normal, usando ferramentas familiares de construo de pginas Web. O JSP de forma bem simples surgiu da idia de simplificar o desenvolvimento de resposta web dinmicas associadas a uma pgina HTML comum. Em outras palavras, JSP a associao de contedo web esttico a cdigo Java responsvel pelo contedo dinmico. Voc pode, inclusive, utilizar linguagens de expresses e at mesmo embutir cdigo Java puro em suas pginas. Voltando ao cdigo da pgina de recepo do exemplo anterior, podemos observar que bemvindo.jsp um exemplo de pgina HTML que possui um artefato que a diferencia de uma pgina HTML pura: sua EL ${}. Para desenvolver uma pgina web, voc j viu que no muito diferente de uma HTML, contudo recomenda-se que a extenso seja .jsp. O que importante saber sobre o jsp que todo seu cdigo convertido em uma classe Java que estende HTTPServlet, ou seja, o JSP no final um servlet. Isso se d no momento da primeira requisio quando o servidor identifica a pgina jsp solicitada e converte essa pgina para cdigo Java e ento executa o servlet e retorna o resultado.

Podemos perceber isso no tomcat atravs do diretrio work no caminho TOMCAT_HOME/work/Catalina/localhost/microblog/org/apache/jsp, nesse diretrio encontraremos dois arquivos, o bemvindo_jsp.class e o bemvindo_jsp.java, ambos gerados a partir da solicitao que se faz ao RecepcionistaServlet. Em funo disso, a primeira chamada a um recurso JSP no servidor mais lenta, contudo tudo se normaliza aps as classes terem sido compiladas.

2.6.2 Scriptlets, por que no se deve usar nunca?


Como falamos anteriormente podemos perfeitamente incluir cdigos Java em pginas e para isso utilizamos as tags <%%>: <% <cdigo java> %> Ento para exemplificar, ser criada uma pgina chamada bemvindoScriptlet.jsp e incluiremos nela o cdigo de boas vindas conforme a listagem abaixo: <html> <title>Primeiro Servlet</title> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <% String result = ""; java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("HH:mm"); java.util.Date horaAtual = new java.util.Date(); java.util.Date tarde; java.util.Date noite; try { // Retira a hora da data atual. horaAtual = (java.util.Date) sdf.parse(sdf.format(new java.util.Date())); // define os delimitadores tarde = (java.util.Date) sdf.parse("12:00"); noite = (java.util.Date) sdf.parse("18:00"); // compara a hora atual com os delimitadores // para definio da resposta. if (horaAtual.before(tarde)) { result = "Bom dia"; } else if (horaAtual.after(tarde) && horaAtual.before(noite)) { result = "Boa tarde"; } else {

result = "Boa noite"; } } catch (java.text.ParseException e) { e.printStackTrace(); } %> <body> <h2>Desenvolvimento Web com Java</h2> <b><%= result %>, usurio !</b> <hr> </body> </html> Com isso, aps executar o ant, pode-se testar chamando no mais o servlet, e sim a pgina web direto! Voc ter o resultado semelhante ao anterior.

FIGURA 21 TELA DE CONFIRMAO DA APLICAO

fcil perceber que no levar muito tempo, dependendo do tamanho da aplicao, para que a manuteno desse cdigo fique seriamente comprometida e, dentre outras coisas, dificulte a reusabilidade, ou seja, haver retrabalho se em outro ponto da aplicao houver necessidade de saudar o usurio. Isso sem contar que nossos amigos web designers no precisaro ter que deparar com blocos de cdigo Java para fazer algo que muitas vezes nem lhe interessa. No lhe aconselho a utilizar scriptlet em pginas e sim, EL e tags que veremos a seguir, contudo, vale levar em conta que muitas aplicaes para web j esto prontas e precisando de manuteno. Voc muito provavelmente encontrar esses cdigos ao longo da vida profissional, ento, bom conhecer.

2.7 Facilitando a vida com EL e JSTL


Adicionada a especificao de JSP 2.0 a EL vem como uma forma de tornar as pginas jsp mais limpas sem uso de scriptlet. Apesar da sintaxe bem semelhante a da linguagem Java, a EL possui caractersticas prprias e funcionalidades que nem sempre funcionam como Java funcionaria e por isso, vale a pena ficar alerta. Ser necessrio, para ter acesso as funcionalidades da JSTL, adicionarmos as libs jstl.jar e standard.jar que voc pode baixar da Internet ou procurar nas aplicaes de exemplo do tomcat. Para exemplificar, vamos imaginar que temos um objeto no escopo de requisio chamado usurio e esse objeto possui a seguinte estrutura: package br.com.empresa.microblog.usuario.entity; import java.io.Serializable; public class Usuario implements Serializable { private Integer id ; private String nome; private String login; private String senha; // mtodos gets e sets ... // mtodos equals, hashcods e to strings da especificao de javabeans ... } Para que possamos exibir o nome desde objeto usurio em uma pginas JSP teramos o seguinte cdigo: Com scriptlet: <%= ((caminho.completo.Usuario) request.getAttribute("usuario")).getNome() %> Com EL ${usuario.nome} Na comparao dos cdigos acima, voc pode perceber a necessidade de uma converso(cast) para a classe Usurio no objeto Object retornado pelo mtodo getAttribute do objeto request, para ento ter acesso ao mtodo getNome() que retorna o nome do usurio, enquanto que pela EL, isso tudo feito internamente.

Ento, voltando aos nossos amigos designers, eles ainda tero que se deparar com trechos de cdigos desconhecidos, contudo, a adaptao ser bem mais tranquila com a EL e com a JSTL em virtude de j estarem acostumados com linguagens de scripts, sem contar que o cdigo na pgina HTML ficar muito mais limpo.
NOTA CONSULTANDO O SITE JAVA: Para mais informaes consulte o site da Java Community Process pesquisando pela JSR 245.

Abaixo, veremos mais alguns operadores: Operadores . ou [ ]: Tem funo semelhante sendo que no caso do operador [ ] possvel incluir aspas para o caso de atributos com formato nome.outronome. Ex. ${usuario.nome]} Objetos implcitos da EL A JSP possui alguns objetos implcitos que esto disponveis para serem utilizados na EL conforme listagem abaixo. param: Mapeia um nome de parmetro de solicitao de um nico valor. paramValues: Mapeia um nome de parmetro de solicitao para uma matriz de valores. header: Mapeia um nome de cabealho de solicitao como um nico valor. headerValues: Mapeia um nome de cabealho de solicitao para uma matriz de valores. cookie: Mapeia um nome de cookie em um nico cookie. initParam: Mapas de um contexto nome do parmetro de inicializao para um nico valor. pageScope: Mapeamento de nomes de variveis no escopo de pgina. requestScope: Mapeamento de nomes de variveis no escopo de requisio. sessionScope: Mapeamento de nomes de variveis no escopo de sesso. applicationScope: Mapeamento de nomes de varivel no escopo de aplicao. importante saber que, em uma expresso do tipo: ${nome.valor} nome ou um atributo em um dos quatro escopos ou um objeto implcito da EL.

2.7.1 O que so escopos ?


Para que voc entenda o que so escopos, necessrio ter em mente que na troca de informaes entre as transaes, enviamos e recebemos informaes, mas sabemos que, uma aplicao uma vez disponibilizada na web, corre o risco de ser acessadas por pessoas no mundo inteiro, inclusive ao mesmo tempo. Ento como saber se o servidor est mandando a informao correta a determinado cliente ? Para isso temos os escopos, disponveis em quatro possibilidades: Escopos de Aplicao ou Contexto, Sesso, Requisio e de Pgina. Estes escopos permitem que informaes sejam manipuladas e que existam no servidor enquanto for do interesse do desenvolvedor. Veremos, a seguir, em detalhes cada um deles.

2.7.2 Escopo de aplicao ou contexto.


Este escopo disponibilizado para todas as requisies, ou seja, qualquer cliente pode acessar informaes desse contexto. Essa informao pode ser, por exemplo, uma referncia a um determinado layout padro, para que todos os clientes quando acessem o site pela primeira vez, tenham a chance de visualiz-lo com o mesmo estilo ou quem sabe o endereo de email do administrador do sistema que deve ser o mesmo para todos os clientes que acessem a aplicao. Objetos nesse escopo podem ser atribudo de forma declarativa, atravs do web.xml e de forma programtica atravs de cdigo Java feito na prpria aplicao. Declarativa: No arquivo web.xml inclua o trecho abaixo: <context-param> <description>Este o estilo default da aplicao</description> <param-name>estilo</param-name> <param-value>default</param-value> </context-param> <context-param> <description>Email do administrador</description> <param-name>emailAdmin</param-name> <param-value>admin@empresa.com.br</param-value> </context-param> Vale lembrar que esse escopo disponibilizado na distribuio da aplicao no servidor, ou seja, qualquer cliente poder requisitar essas informaes e obter respostas. Programtica:

Este cdigo deve ser includo dentro de um servlet j que o mesmo possui o mtodo getServletContex() de sua classe pai e nos permite atribuir objetos em seu escopo. getServletContext().setAttribute("estilo", "default"); getServletContext().setAttribute("emailAdmin", "admin@empresa.com.br"); Uma vez executado, deixar a informao disponvel para todos os clientes.

2.7.3 - Escopo de Sesso.


Imagine voc realizando uma compra em um comrcio eletrnico qualquer. Voc seleciona um produto e o adiciona em um carrinho de compra, contudo, existem uma infinidade de outros clientes tentando comprar produtos, e adicionando itens no carrinho. Se voc se aprofundar um pouco na especificao do protocolo HTTP, ver que o mesmo no guarda informaes do requisitante, o seja, uma conexo aberta, a informao processada e essa conexo fechada, com isso, o servidor no saber mais quem fez a solicitao e a quem pertence qual carrinho. O que queremos evitar que um cliente adicione um produto em seu carrinho e quando o cliente tentar adicionar o segundo perceba que seu carrinho est vazio ou que existem itens a mais no carrinho que voc no adicionou. A soluo para esse cenrio catico o objeto HTTPSession, com ele, quando um cliente fizer uma requisio criada uma sesso e identificada por identificador chamado JSESSIONID. Esse identificador enviado no contedo da mensagem de resposta ao cliente em forma de cookie de forma que, quando ele adicionar um produto em um carrinho o servidor tenha como identificar qual o carrinho daquele identificador e ento adicionar o produto, evitando erros. Podemos obter um objeto HTTPSession das seguintes formas: HTTPSession sessao = request.getSession(); HTTPSession sessao = request.getSession(true); // Ambas utilizadas para criar sesso ou utilizar a sesso existente. HTTPSession sessao = request.getSession(false); // Utiliza a sesso existente apenas. A sesso possui um tempo de vida que podemos configurar no web.xml atravs das tag <session-config>, onde nela indicaremos a quantidade de tempo em minutos que a sesso permanecer viva: <session-config> <session-timeout>15</session-timeout> </session-config>

Muito provavelmente voc j dever ter passado por uma situao onde est acessando uma transao bancria e de posse do seu extrato, realiza alguns clculos, e quando volta ao computador para realizar um pagamento a aplicao solicita que se autentique no site do banco novamente porque sua sesso expirou. Em aplicaes Java, esse tempo configurado no DD e caso no exista requisies por um determinado perodo de tempo, (no nosso exemplo 15 minutos), o servidor invalida a sesso perdendo com isso todos os controles que indicavam que existia um usurio conectado ao site, obrigando-o a se autenticar novamente. A partir da sesso, existem alguns mtodos importantes que precisamos conhecer. >> setAttribute(String,String); adiciona objetos no escopo de sesso, ou seja, objetos que existem enquanto a aplicao no exceder o timeout da sesso ou enquanto a aplicao no chama o mtodo invalidade(). >> session.setAttribute("usuarioLogado", usuario); adiciona o objeto usurio a sesso identificando esse objeto com o nome usuarioLogado. >> removeAttribute(String); remove o atributo da sesso. >> session.removeAttribute("usuarioLocado"); remove o atributo chamado usuarioLogado da sesso. >> invalidate(); torna invlida a sesso, ou seja, remove todos os atributos e exclui o identificador. Vale observar que existem outros mtodos que podem ser interessantes na construo de aplicaes reais. Voc pode encontrar mais informaes sobre esses mtodos na especificao de Servlet.

2.7.4 Escopo de Requisio.


Este escopo interessante para informaes que devem ser repassadas aos clientes, no entanto, no precisam existir aps o envio. Um exemplo simples de entender seria quando um usurio faz uma pesquisa e o servidor retorna uma lista como resultado. Essa lista, ter serventia at o retorno da requisio, no interessando posteriormente ao usurio e com isso no havendo necessidade de manter esse recurso. >> request.setAttribute(string, objeto);

responsvel por atribuir objetos no escopo de requisio. >> request.removeAttribute(string); responsvel por remover atributos do escopo de requisio.

2.7.5 Escopo de Pgina.


Este escopo existe apenas durante a execuo da pgina, geralmente o escopo da pgina utilizado com scriptlets e tags onde valores e variveis so criadas apenas para realizar tarefas na pgina. Outros Operadores Existem muitos outros operadores disponveis na EL, mostraremos alguns, contudo vale consultar a documentao para a lista completa. Operadores Aritmticos Adio: + Subtrao: Multiplicao: * Diviso: / ou div Resto: % ou mod Operaes Relacionais Igual: == ou eq Diferente; != ou ne Menor que = < ou lt Maior que = > ou gt Menor ou igual a = <= ou le Maior ou igual a = >= ou ge Operadores Lgicos E: && ou and OU: || ou or Negao: ! ou not Nulo ou Vazio: empty Operador Condicional A?B:C Onde, A a expresso que retorna um valor boleano(verdadeiro ou falso). B ser a operao realizada caso a condio avaliada em A for verdadeira e C caso seja falsa.

2.7.6 Estruturas condicionais


possvel realizar operaes condicionar em pginas de forma a realizar determinadas tarefas se uma condicional for satisfeita.

Scriptlets <%@page import="br.com.empresa.microblog.usuario.entity.Usuario"%> <html> <title>MicroBlog da Facu</title> <body> <b>IFPA</b><br> <b>Microblog</b> <hr> <% Usuario usuario = new Usuario(); usuario = (Usuario)session.getAttribute("usuario"); %> <b>Bom dia <%= (usuario == null ? "Convidado":usuario.getNome() ) %></b> </body> </html> JSTL <c:if test="${empty usuarioAtivo}"> <b>Bem vindo, Convidado</b> </c:if> <c:if test="${not empty usuarioAtivo}"> <b>Bem vindo ${usuarioAtivo.nome}</b> </c:if> Mltiplas opes <c:choose> <c:when test="${expresso}">...</c:when> <c:when test="${expresso}">...</c:when> <c:otherwise>... </c:otherwise> </c:choose>

2.7.7 Laos
possvel realizar laos de repetio atravs da JSTL de forma simples passando apenas a coleo de dados e indicando a varivel que representar o objeto no lao. O var um exemplo tpico de escopo de pgina, j que essa varivel est disponvel apenas na pgina e durante a repetio. <c:forEach var="nome" items="${nomeDaCollection}"> <c:out value="${nome}"/> </c:forEach> Exemplo de lao:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <% boolean inverte = false; %> <b>Gesto de Usurios</b> <hr /> <table align="right" border="0" width="100%"> <tr style="background-color: #bbccff;"> <td><b>nome</b></td> </tr> <c:forEach var="usr" items="${listaUsuarios}"> <tr bgcolor="<%=(inverte = !inverte) ? "#C5EBEC" : "#FFFFFF"%>"> <td><c:out value="${usr.nome}" /></td> </tr> </c:forEach> </table>

3. OUVINTES (Listeners)
O listeners so classes bastante interessante quando se deseja monitorar o comportamento da aplicao para a realizao de tarefas especficas baseado em determinados eventos. Imagine se os requisitos de seu prximo aplicativo web, determinar que voc precisa contar o nmero de acessos, ou que determinada pgina deve ser vlida por um perodo determinado de tempo, como em uma prova online, ou simplesmente realizar um log para terminar o IP, data e hora do requisitante para posterior auditoria! So muitas as possibilidades! Segundo Bond (2003, p.493): um servlet pode ser designado como um ouvinte de eventos. Isso permite que a servlet seja notificada quando algum evento externo ou alterao tenha ocorrido. Existem vrios listeners disponvel para monitorar eventos em nvel de servidor, para utilizarmos, precisamos de uma declarao no DD e de classes implementando os listeners. Veremos rapidamente alguns deles. HTTPSessionListener Responsvel pelo monitoramento dos eventos que dizem respeito a sesso, onde um evento chamado HTTPSessionEvent disparado no momento em que uma sesso criada ou invalidada. Para utilizarmos criaremos uma classe chamada MonitoraSessaoListener, para que possamos obter o nmero de usurios online no sistema, ou seja, o nmero de clientes que abriro uma sesso na aplicao.

A Classe deve ser uma classe Java que implemente a interface javax.servlet.http.HttpSessionListener. Essa interface, por sua vez, determina a necessidade de implementar os mtodos: sessionCreated(HttpSessionEvent evento): executado no momento em que uma sesso criada. sessionDestroyed(HttpSessionEvent evento): executada no momento em que uma sesso finalizada por timeout ou quando alguma parte da aplicao chama o mtodo invalidade(). Dessa forma podemos criar um contador e incrementar um valor a cada nova criao de sesso e decrementar um a cada invalidao. Para que isso funcione voc precisar declarar o listener no DD conforme o modelo abaixo: <listener> <description>Descricao do listener</description> <listener-class> br.com.empresa.microblog.utils.MonitoraSessaoListener </listener-class> </listener> Assim como o existe o listener para sesso, existem outros para atributos e at para que a prpria classe saiba quando foi adicionado ou retirado da sesso, ou seja, vale apena dedicar algum tempo para estudar os listeners em detalhe porque mesmo que voc nunca chegue a usar, importante saber que eles existem.

4 FILTROS Os filtros nada mais so que classes responsveis por verificar o contedo das requisies e determinar, baseado em condicionais, se uma requisio vlida, ou se a partir dessa requisio, ela deve ser encaminhada para um ou outro lugar.
Os filtros lhe permitem interceptar a solicitao. E se puder interceptar a solicitao, voc poder tambm controlar a resposta. E, melhor de tudo, o servlet nem percebe o que aconteceu. (BASHAM, SIERRA, 2008, p.701)

Uma forma simples de utilizar filtros quando, por exemplo, um usurio mal intencionado tenta acessar uma URL que o mesmo no tem permisso, ou em uma compra da web onde o usurio para concluir o pedido, necessite primeiro ser autenticado.

Os filtros so disponibilizados atravs de classes Java e configurados no DD, e com base nessa configurao essas classes interceptam requisies que estejam dentro do escopo do filtro em questo. Para exemplificar, vamos implementar um pequeno e simples mecanismo de segurana em nosso pequeno site, contudo para isso, precisaremos conhecer alguns conceitos sobre segurana.

5 SEGURANA
impossvel falar em desenvolvimento de sistemas sem discutir segurana. A segurana web algo que gera cada vez mais investimentos para tornar os sites seguros e confiveis. Imagine um banco onde voc no tenha certeza de que o valor passado realmente reflete o real, ou que voc no tenha realmente certeza de que suas informaes no esto sendo visualizadas por um usurio no autorizado ? A indstria de software e a comunidade cientfica no para de investir e trabalhar para gerar solues seguras quanto ao acesso a informaes remotas, j que os oportunistas e foras da lei tambm trabalham incansavelmente para obter informaes de forma ilcita. Veremos alguns conceitos bsicos de segurana e de antemo deixamos claro que para manter um site seguro e protegido de oportunistas haver um longa jornada a ser percorrida! Existem quatro conceitos bsicos que precisam ser avaliados quanto a questo da segurana no ambiente web, so eles: autenticao, autorizao, confiabilidade e integridade. Autenticao Define regras para garantir que o usurio realmente quem diz ser. Normalmente essa etapa da segurana validada atravs de controles de usurios, senhas, tokens de segurana, validaes de informaes de cadastro, etc. Autorizao Agora que j se sabe que o usurio quem diz ser, preciso determinar o que este usurio pode ou no acessar, ou seja, o que ele est autorizado a fazer no sistema. Confidencialidade e Integridade Esses conceitos so interligados, pois dizem respeito a fazer com que os dados no sejam vistos e nem alterados durante a transmisso. Para esses casos existem protocolos especiais disponveis no mercado que fornecem transmisses de dados criptografados de forma a impedir que usurios oportunistas capturem blocos de cdigos na transmisso com o objetivo de obter e/ou manipular informaes.

5.1 O FILTRO DE SEGURANA Precisamos implantar um controle de segurana em nosso sistema de forma que, alguns pontos da aplicao sejam protegidos onde para acesso, o usurio deve estar autenticado no sistema. Em nosso exemplo, montaremos um servlet que encaminhe o cliente a pgina de login, sempre que o mesmo esteja tentando acessar uma rea restrita do sistema sem estar devidamente autenticado. Uma vez na pgina de login, o usurio entrar com um nome e uma senha com a validade das informaes. Inclui-se no escopo de sesso, um objeto boleano de nome logado com o valor verdadeiro. Devidamente autenticado, o usurio, ao acessar o recurso restrito, ter sua solicitao novamente verificada para ento sim ser encaminhar ao recurso protegido. Abaixo a classe Java do filtro.
package br.com.empresa.microblog.security; import import import import import import import import import import java.io.IOException; javax.servlet.Filter; javax.servlet.FilterChain; javax.servlet.FilterConfig; javax.servlet.ServletException; javax.servlet.ServletRequest; javax.servlet.ServletResponse; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.servlet.http.HttpSession;

public class SecurityFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(true); Object logado = session.getAttribute("logado"); if (logado != null && ((Boolean)logado)) { filterChain.doFilter(servletRequest, servletResponse); } else { response.sendRedirect("/microblog/login.jsp"); } } public void init(FilterConfig arg0) throws ServletException { } }

Abaixo a declarao do filtro no web.xml. <filter>

<filter-name>SecurityFilter</filter-name> <filter-class> br.com.empresa.microblog.security.SecurityFilter </filter-class> </filter> <filter-mapping> <filter-name>SecurityFilter</filter-name> <url-pattern>/usuario.do</url-pattern> </filter-mapping>

6 EXERCITANDO COM UM ESTUDO DE CASO (microblog)


Nosso estudo de caso ser uma pequena aplicao, onde haver um cadastro de usurio e a partir disso, mensagens podero ser trocadas e usurios podero ser adicionados de forma que os mesmos tenham acesso a suas mensagens e voc as mensagens dele. J existem aplicaes no mercado com esse conceito, a mais famosa dela o twitter. Iniciaremos com alguns pontos fundamentais de segurana e controle de usurios, e o restante ser tarefa sua. 6. 1. Acesso a dados Inicialmente faremos algumas configuraes em nosso ambiente, de forma a permitir que nossa aplicao tenha acesso a banco de dados. Utilizaremos para os testes o MySQL. O banco a ser criado se chamar microblog e possuir a tabela usurio com a estrutura a seguir. Script para criao do banco: create database microblog; create table USUARIO( ID integer(5) not null auto_increment, NOME varchar(50), LOGIN varchar(30), SENHA varchar(33), primary key(ID), CONSTRAINT uniqueLogin UNIQUE (LOGIN) ); // incluso se registros para teste insert into usuario (NOME,LOGIN,SENHA) VALUES ('ANA','ANA MARIA SILVA','123'); insert into usuario (NOME,LOGIN,SENHA) VALUES ('PEDRO','PEDRO SILVA','321');

6.2 CONFIGURANDO O TOMCAT


Para voc ter acesso a base de dados necessrio ter um driver JDBC e de uma pequena configurao no arquivo context.xml do diretrio conf do tomcat. No site http://dev.mysql.com/downloads/, possvel localizar o item Connector/J e fazer o download do arquivo. Ele dever ficar localizado dentro do diretrio lib do tomcat, fazendo com que todas as aplicaes do continer que precisem acessar o banco mysql j tenham o driver necessrio disponvel. A verso disponvel durante a escrita desse documento era a 5.1.13, o arquivo deve ter o nome parecido com mysql-connector-java-5.1.13-bin.jar. Aps o download e com o arquivo colocado em seu devido lugar, hora de configurar a chamada de acesso a base no context.xml e isso feito incluindo o texto abaixo: <Resource name="jdbc/MicroblogDB" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="senha" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/microblog"/> Como foi feita uma modificao no arquivo de configurao do continer, o tomcat solicita que o continer seja reiniciado. No esquea de trocar a senha senha pela senha do seu usurio. Vale lembrar que essa configurao para o Tomcat e que sofrer modificaes caso voc opte por um outro continer web.

6.3 CONFIGURANDO AS CLASSES DE ACESSO A DADOS


Para acesso a base de dados, e no intuito de no termos que repetir o mesmo cdigo sempre que necessitarmos realizar uma consulta, construiremos uma classe abstrata que guardar todos os mtodos necessrios a conexo com o banco, e a partir da, estenderemos para outras funes mais particulares. A classe se chamar AbstractDAO.java e dever se parecer com a classe descrita na listagem abaixo: package br.com.empresa.microblog.core; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import br.com.empresa.microblog.usuario.entity.Usuario; public abstract class AbstractDAO<T, K extends java.io.Serializable>

{ private Connection getConnection() { Connection con = null; try { Context initContext; try { initContext = new InitialContext(); Context envContext = (Context) initContext.lookup("java:/comp/env"); DataSource ds = (DataSource)envContext.lookup("jdbc/MicroblogDB"); con = ds.getConnection(); } catch (NamingException e) { e.printStackTrace(); } } catch (SQLException e) { e.printStackTrace(); } return con; } protected ResultSet executeSQL(String sql) { Statement stm; ResultSet rs = null; try { stm = getConnection().createStatement(); rs = stm.executeQuery(sql); getConnection().close(); } catch (SQLException e) { e.printStackTrace(); } return rs; } protected void persiste(String sql) { Statement stm; int rs = 0; try { stm = getConnection().createStatement(); rs = stm.executeUpdate(sql); getConnection().close(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } Agora precisamos de uma classe que represente os dados na tabela que guardar informaes dos usurios.

Para mapear as informaes do banco com a classe Java, utilizaremos a classe Usuario.java, seguindo a especificao de javabean conforme a listagem abaixo: package br.com.empresa.microblog.usuario.entity; import java.io.Serializable; public class Usuario implements Serializable { private static final long serialVersionUID = 4089062415173328490L; private private private private public public public public public public public public Integer id ; String nome; String login; String senha;

Integer getId() { return id; } void setId(Integer id) { this.id = id; } String getNome() { return nome; } void setNome(String nome){ this.nome = nome; } String getLogin() { return login; } void setLogin(String login) { this.login = login; } String getSenha() { return senha; } void setSenha(String senha) { this.senha = senha; }

public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((login == null) ? 0 : login.hashCode()); return result; } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Usuario other = (Usuario) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id))

return false; if (login == null) { if (other.login != null) return false; } else if (!login.equals(other.login)) return false; return true; } public String toString() { return id + " - " + login; } } A partir dessa classe, montaremos a classe UsuarioDAO.java que estender a classe AbstractDAO e ir gerenciar a manipulao dos dados com o usurio. package br.com.empresa.microblog.usuario.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import br.com.empresa.microblog.core.AbstractDAO; import br.com.empresa.microblog.exceptions.DAOException; import br.com.empresa.microblog.usuario.entity.Usuario; public class UsuarioDAO extends AbstractDAO<Usuario, Integer> { public void excluir(Integer idUsuario){ StringBuffer sql = new StringBuffer(""); sql.append("DELETE FROM USUARIO WHERE ID = "); sql.append(idUsuario); persiste(sql.toString()); } public void salvar(Usuario usuario){ StringBuffer sql = new StringBuffer(""); sql.append("INSERT INTO USUARIO (LOGIN, NOME, SENHA) VALUES ('"); sql.append(usuario.getLogin()); sql.append("','"); sql.append(usuario.getNome()); sql.append("','"); sql.append(usuario.getSenha()); sql.append("')"); persiste(sql.toString()); } public void atualizar(Usuario usuario){

StringBuffer sql = new StringBuffer(""); sql.append("UPDATE USUARIO SET "); sql.append("LOGIN = '"); sql.append(usuario.getLogin()); sql.append("', NOME='"); sql.append(usuario.getNome()); sql.append("',SENHA = '"); sql.append(usuario.getSenha()); sql.append("' WHERE ID = "); sql.append(usuario.getId()); persiste(sql.toString()); } public List<Usuario> findAll() { List<Usuario> result = new ArrayList<Usuario>(); ResultSet rs = executeSQL("SELECT * FROM USUARIO"); Usuario dto = null; try { while (rs.next()) { dto = new Usuario(); dto.setId(rs.getInt(1)); dto.setNome(rs.getString(2)); dto.setLogin(rs.getString(3)); dto.setSenha(rs.getString(4)); result.add(dto); } } catch (SQLException e){ e.printStackTrace(); } return result; } public Usuario findUsuario(Integer id) { StringBuffer sql = new StringBuffer("SELECT * FROM USUARIO WHERE ID="); sql.append(id); ResultSet rs = executeSQL(sql.toString()); Usuario dto = null; try { while (rs.next()) { dto = new Usuario(); dto.setId(rs.getInt(1)); dto.setNome(rs.getString(2)); dto.setLogin(rs.getString(3)); dto.setSenha(rs.getString(4)); } } catch (SQLException e) { e.printStackTrace(); }

return dto; } public List<Usuario> findUsuario(String login, String nome) { StringBuffer sql = new StringBuffer("SELECT * FROM USUARIO WHERE 1=1 "); if (null != login && !login.equals("")){ sql.append(" AND LOGIN LIKE '" + login +"%'"); } if (null != nome && !nome.equals("")){ sql.append(" AND NOME LIKE '%" + nome + "%'"); } sql.append(" ORDER BY LOGIN, NOME ASC"); List<Usuario> result = new ArrayList<Usuario>(); ResultSet rs = executeSQL(sql.toString()); Usuario dto = null; try { while (rs.next()) { dto = new Usuario(); dto.setId(rs.getInt(1)); dto.setNome(rs.getString(2)); dto.setLogin(rs.getString(3)); dto.setSenha(rs.getString(4)); result.add(dto); } } catch (SQLException e) { e.printStackTrace(); } return result; } public Usuario autenticaUsuario(String login, String senha) { StringBuffer sql = new StringBuffer("SELECT * FROM USUARIO WHERE LOGIN='"); sql.append(login); sql.append("' AND SENHA = '"); sql.append(senha); sql.append("'"); ResultSet rs = executeSQL(sql.toString()); Usuario dto = null; try { while (rs.next()) { dto = new Usuario(); dto.setId(rs.getInt(1)); dto.setNome(rs.getString(2)); dto.setLogin(rs.getString(3));

dto.setSenha(rs.getString(4)); } } catch (SQLException e) { e.printStackTrace(); } return dto; } } Com isso, temos a classe responsvel pelo acesso e manipulao dos dados do usurio. Agora utilizaremos o servlet para controlar as transaes entre a base de dados e a viso do usurio. Para isso, criaremos o UsuarioServlet.java conforme a listagem abaixo. package br.com.empresa.microblog.usuario.servlet; import java.io.IOException; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import br.com.empresa.microblog.usuario.dao.UsuarioDAO; import br.com.empresa.microblog.usuario.entity.Usuario; public class UsuarioServlet extends HttpServlet { private static final long serialVersionUID = -7574758523789658525L; private UsuarioDAO dao = new UsuarioDAO(); protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doProcessaRequest(req, resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doProcessaRequest(req, resp); } protected void doProcessaRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String acao = request.getParameter("acao"); // Mostra no log do tomcat o resultado da acao. System.out.println("acao = " + acao); if (acao.equals("pesquisar")) {

doPesquisar(request, response); } } private void doPesquisar(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { List<Usuario> lista; String login = (String) request.getParameter("login"); String nome = (String) request.getParameter("nome"); lista = dao.findUsuario(login.toUpperCase(), nome.toUpperCase()); if (lista.size() < 1) { System.out.println("Nenhum registro encontrado."); request.setAttribute("mensagem", "Nenhum registro encontrado."); } else { System.out.println(lista.size() + " Registro(s) encontrado(s)"); } request.setAttribute("listaUsuarios", lista); RequestDispatcher dis = request.getRequestDispatcher("pages/usuario/pesquisar.jsp"); dis.forward(request, response); } } Vamos ento a tela de consulta onde teremos uma listagem com o login e o nome dos usurios. Esse arquivo dever ser criado em MicroBlog/pages/usuario/ e se chamar pesquisar.jsp. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <% boolean inverte = false; %>

<b>Gesto de Usurios</b> <hr /> <div align="right"><a href="/microblog">voltar</a></div> <br /> <form name="form" method="POST" action="/microblog/usuario.do"> <input type="hidden" name="acao" value="pesquisar" /> <table align="center" border="0" width="100%"> <tr> <td style="width: 80px;">Login</td> <td><input type="text" name="login" maxlength="10" size="10" /></td>

</tr> <tr> <td style="width: 80px;">Nome</td> <td><input type="text" name="nome" maxlength="50" size="50" /></td> </tr> </table> </form> <br /> <c:if test="${not empty mensagem}"> <hr/> <b>${mensagem}</b> <hr/> </c:if> <c:if test="${empty mensagem}"> <table align="right" border="0" width="100%" style="border-style: groove; font-family: arial"> <tr style="background-color: #D8D8D8;"> <td style="width: 120px; text-align: left;"><b>login</b></td> <td><b>nome</b></td> </tr> <c:forEach var="usr" items="${listaUsuarios}"> <tr bgcolor="<%=(inverte = !inverte) ? "#F0F0F0" : "#FFFFFF"%>"> <td><c:out value="${usr.login}" /></td> <td><c:out value="${usr.nome}" /></td> </tr> </c:forEach> </table> </c:if> Aps juntar isso tudo, execute o ant e acesse o browser no endereo http://localhost:8080/microblog/pages/usuario/pesquisar.jsp e como resultado ser mostrado uma tela semelhante a mostrada abaixo:
FIGURA 22 TELA DE RESULTADO DO USO DO ANT

O exemplo acima ilustra como realizar uma busca por dados em uma base mysql via um datasource gerenciado pelo tomcat. Existem tambm alguns mtodos que sero teis para implementar a parte de incluso, edio e excluso de dados alm da segurana. Vale lembrar que no exemplo acima no existe nenhum mecanismo de criptografia, contudo, com uma pesquisa simples na Internet, fcil encontrar vrios algoritmos j implementados em Java. Vale lembrar que um dos mais seguros mecanismos de criptografia o MD5, utilizados por muitos sistemas operacionais na atualidade.

PARA SABER MAIS


Consulte os endereos abaixo listados para aprofundar um pouco mais todos os conhecimentos adquiridos nesta unidade. www.tomcat.apache.org www.jcp.org http://java.sun.com/j2ee/setstandard.html www.w3.org www.w3.org/Protocols/rfc2616/rfc2616.html

REFLEXES SOBRE A APRENDIZAGEM


A linguagem Java obteve um espao bastante significativo no cenrio da programao e em especial para o ambiente web em virtude de suas grandes variaes de aplicaes que possibilitam recursos que proporcionam bastante efetividade na operacionalidade da Internet. Utilizar hoje em dia o Java na Internet quase uma obrigatoriedade para aqueles profissionais que desejam ter seus sites oferecendo eficincia e excelente prestatividade aos seus usurios em geral.

RESUMO DA UNIDADE
A unidade aborda consideraes gerais e depois especficas da linguagem de programao Java direcionada a web. Inicialmente observamos alguns conceitos fundamentais ao aprendizado, a estrutura da aplicao Java para web e elementos essenciais como o Servlet e o JSP. Consta ainda da unidade, uma seo que possui o propsito de oferecer ao aluno uma prtica de desenvolvimento utilizando os conhecimentos absorvidos com o assunto em tela.

SUGESTES DE LEITURA
Sugiro que voc faa uma leitura complementar nos links informados na seo Saiba Mais acima e, se possvel, em alguns dos livros indicados na bibliografia deste fascculo.

Você também pode gostar