Вы находитесь на странице: 1из 43

UNIDADE 2

PROGRAMAÇÃO JAVA PARA WEB

OBJETIVOS DA UNIDADE
Demonstrar a linguagem Java direcionada a aplicações em ambientes web.
Possibilitar ao aluno que utilize os recursos desta linguagem em diversas aplicações
na Internet, apresentando suas ferramentas e estabelecendo uma prática através
da implantação de um microblog.
1 – INTRODU•‚O
Como voc€ j• deve saber a Internet ‚ uma gigantesca "rede" que liga um
incont•vel nƒmero de computadores entre si. „ uma rede heterog€nea, j• que
diversos tipos de computadores est…o 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 s…o distintos, precisam de uma linguagem que n…o esteja
necessariamente amarrada a uma plataforma de hardware/software espec†fica.
Como voc€ j• p‡de constatar, Java mostra-se ideal quanto a esse fator.
Uma vez que os programas Java s…o transmitidos como bytecodes, eles
podem “rodar” em qualquer computador sem necessitar que o cŠdigo seja reescrito,
independente da plataforma na qual ele ser• executado.
Nosso estudo ser• direcionado para a utiliza‹…o da plataforma Java voltada
para web e nŠs iremos discutir os pontos principais para que voc€ seja capaz de
desenvolver aplica‹Œes de alcance global com Java.

2 – ANATOMIA DE UMA APLICA•‚O WEB


Aplica‹Œes web Java, trabalham basicamente atrav‚s da troca de
mensagens onde o usu•rio faz requisi‹Œes e recebe respostas, contudo por tr•s do
conceito b•sico de pedir e receber existe uma s‚rie de ferramentas, protocolos,
sistemas operativos e servidores de aplica‹…o que tornam tudo isso poss†vel.
Estudaremos alguns conceitos fundamentais para o desenvolvimento de
aplica‹Œes e veremos como fazer isso utilizando a plataforma Java.

2.1 – CONCEITOS BŽSICOS


2.1.1 – HTML
Acr‡nimo 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 publica‹…o de documentos online com t†tulos,
fotos, tabelas, possibilidades de recupera‹…o de documentos atrav‚s de links, al‚m
de formul•rios para realiza‹…o de transa‹Œes, entre outras funcionalidades.
Na atualidade, mesmo com o surgimento de novos tipos de documentos, o
HTML ainda ‚, indiscutivelmente, a forma mais comum de publica‹…o para internet
e se um dia ela for substitu†da, ainda assim, precisaremos conhec€-la em fun‹…o do
grande volume de sistemas legados, j• implantados e em produ‹…o e que
necessitar…o de manuten‹…o.

2.1.2 – Protocolo HTTP


Cont‚m o conjunto de defini‹Œes que regulamentam a transmiss…o de
informa‹Œes com caracter†sticas espec†ficas da web. Esse protocolo foi criado
tamb‚m nos anos 90 para simples transfer€ncias de dados brutos, no entanto, ele
sofreu melhorias em suas defini‹Œes com a populariza‹…o da Internet. „ por meio
do protocolo HTTP que s…o efetuadas as transmissŒes das solicita‹Œes aos
servidores web e deles, recebidas as respostas.
NOTA – Mais sobre HTTP: Voc€ pode obter maiores informa‹Œes sobre o protocolo HTTP no
padr…o IETF, RCF 2616.

2.1.3 – Solicita‹…o e Resposta


De posse de um formato padr…o de documentos e de um protocolo para
prover a comunica‹…o voc€ passar• a possuir os requisitos b•sicos para solicitar e
disponibilizar informa‹Œes, contudo, ir• precisar de ferramentas que lhe permita
realizar requisi‹Œes e fornecer respostas, dependendo do lado que voc€ esteja.

2.1.3.1 – O Browser
„ atrav‚s deste programa que se realiza as solicita‹Œes •s informa‹Œes
dispon†veis na WEB. Existem v•rios browsers dispon†veis no mercado, dentre os
mais populares est…o 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 constitu†do de um computador, plugado na
Internet, contendo um servidor WEB instalado.
Existem v•rios servidores dispon†veis no mercado, dentre eles, o mais
popular ‚ o Apache da funda‹…o Apache, contudo, at‚ aqui estamos falando de
servidor HTTP e precisaremos de um pouco mais que isso para aplica‹Œes Java, j•
que al‚m de entender o protocolo HTTP ele tamb‚m necessita implementar as
especifica‹Œes de Servlet e JSP.

2.2 – ESTRUTURA DA APLICA•‘O JAVA PARA WEB


2.2.1 – Estrutura de diretŠrios
Para desenvolver uma aplicação Java para web é necessário seguir a
estrutura de diretórios recomendada pela especificação. Essa organização deve
obrigatoriamente seguir o modelo.

aplicacao
|-- WEB-INF
| |-- classes
| | `-- ...
| |-- lib
| | `-- ...
| `-- web.xml
|-- ...
`-- index.jsp

Entendendo melhor esses diretórios temos:

aplicacao
Diretório principal, geralmente, reflete o nome da aplicação em
desenvolvimento.

WEB-INF
Obrigatoriamente deve ser escrita em letras maiúsculas. Fique bastante
alerta sobre isso, alguns sistemas operacionais costumam não se preocupar com a
escrita do nome dos arquivos e algumas vezes tomam a liberdade de mudar isso
para, por exemplo, Web-inf, isso não é reconhecido na estrutura de diretórios e sua
aplicação não funcionará.

classes
Diretório onde ficará os arquivos contendo as regras de negócio da
aplicação.

lib
Diretório onde ficarão as bibliotecas através das quais sua aplicação
necessita para funcionar.

web.xml
O arquivo web.xml é também conhecido como descritor de distribuição, do
inglês Deployment Descriptor(DD), é nele que serão definidos parâmetros iniciais,
regras de navegação, configurações de sessão, página inicial, etc.
index.jsp
P•gina inicial da aplica‹…o, esse nome pode ser configurado para o nome
desejado no DD.

2.2.2 – Visibilidade
Junto a estrutura definida pela especifica‹…o deve ficar claro o que ‚ vis†vel
para um cliente web e o que ‚ vis†vel apenas para a aplica‹…o.
Voc€ precisa definir isso de forma a n…o deixar exposta para web,
informa‹Œes como a regra de negŠcio da empresa e sim, os recursos que ser…o
trabalhados e enviados ao cliente baseados nas a‹Œes e regras definidas pela
aplica‹…o.
Na estrutura web exposta, tudo ‚ vis†vel aos clientes web, com exce‹…o das
informa‹Œes contidas no diretŠrio WEB-INF, pois ‚ l• que ficar…o as classes
contendo as regras de negŠcio e navega‹…o da sua aplica‹…o, e isso sŠ diz respeito
a aplica‹…o, o cliente sŠ precisa receber a p•gina contendo seu extrato e de forma
alguma, informa‹Œes internas como acesso a dados, bancos utilizados, regras de
negŠcio e etc.

2.2.3 – Como a aplica‹…o deve ser distribu†da


J• vimos que a aplica‹…o deve ter uma estrutura obrigatŠria para ser
reconhecida como uma aplica‹…o web, caso essa estrutura seja colocada em um
servidor web, j• ‚ suficiente para que a aplica‹…o funcione, contudo, a plataforma
Java, defini alguns formatos de arquivos para agrupar os diversos tipos de
aplica‹…o. Para web, o arquivo a ser distribu†do ser• um arquivo web, do ingl€s
Web ARchive, onde esse arquivo nada mais ‚ que um arquivo compactado
contendo a estrutura da aplica‹…o web, ou seja, se voc€ tem uma aplica‹…o
chamada microblog, essa aplica‹…o ser• compactada em um arquivo chamado
microblog.war.

2.2.4 – Ferramentas
O Java ao ser instalado vem com ferramentas que d…o apoio ao
desenvolvimento de aplica‹Œes, dentre elas, possu†mos uma especialmente
constru†da para realizar o servi‹o de compacta‹…o, o JAR.

2.2.4.1 – JAR

O “jar” ‚ um arquivo de aplica‹…o distribu†do junto com o kit de


desenvolvimento Java e sua utiliza‹…o, assim como a maioria das ferramentas,
deve ser executada em um terminal ou “prompt” de comandos e segue a seguinte
sintaxe:
jar –cvf <arquivo>.<extens…o> <arquivos/diretŠrio a compactar>

ou seja, se quiser compactar a aplica‹…o existente em um diretŠrio 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 necess•rios ao empacotamento,


existem algumas ferramentas que d…o um suporte adicional a esse trabalho e
incluem ainda funcionalidades como compila‹…o dos cŠdigos Java, envio de email,
suporte a testes de software, dentre outras.
O ant, pode ser adquirido no site http://ant.apache.org/ e sua instala‹…o ‚
bem simples, basta ter o Java instalado, descompactar o arquivo do ant no diretŠrio
de sua prefer€ncia, criar uma vari•vel de ambiente chamada ANT_HOME indicando
esse diretŠrio e incluir o diretŠrio bin do ant no PATH do sistema operacional.
Sua execu‹…o se d• a partir da leitura de um arquivo chamado build.xml
onde nele ser• definida todas as tarefas que dever…o 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 aplica‹…o web Java deve ser feita
obrigatoriamente da forma que a especifica‹…o determina, contudo, n…o
necessariamente sua pasta de projetos no ambiente de desenvolvimento precisa
seguir exatamente essa estrutura, como no exemplo a seguir.

2.3 – M‘O NA MASSA


2.3.1 – Iniciando uma aplica‹…o
Iniciaremos uma nova aplica‹…o construindo a estrutura de diretŠrios
conforme o esquema a seguir. Ser• f•cil voc€ observar que a estrutura criada n…o ‚
exatamente a estrutura de uma aplica‹…o web Java, contudo, apŠs a execu‹…o do
build, teremos como resultado um arquivo .war com a exata estrutura exigida pela
especifica‹…o.

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

<!-- DEFINI•‘O 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 DIRET’RIOS -->


<target name="init">
<delete dir="${dest.dir}" />
<mkdir dir="${dest.dir}" />
</target>

<!-- CONTRU•‘O DO ARQUIVO DE DISTRIBUI•‘O -->


<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 diretŠrio 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 gera‹…o do arquivo finalizou com sucesso e


agora voc€ possui um arquivo microblog.war dentro do diretŠrio target com as
caracter†sticas exigidas pela especifica‹…o.
2.4 – PARA ONDE TUDO ISSO VAI?
Como ‚ de conhecimento, Java ‚ uma linguagem interpretada e para sua
execu‹…o requer um ambiente que de suporte a esse trabalho, no caso a Java
Virtual Machine(JVM) instalada.
Em aplica‹Œes web, ‚ necess•rio algo que vai al‚m da JVM, j• que
precisamos desde a interpreta‹…o de documentos HTML at‚ comunica‹…o de redes
atrav‚s dos protocolos de comunica‹…o, sobre tudo o HTTP, que como j• foi visto ‚
o principal na utiliza‹…o da Internet.
Muitas comunidades e at‚ grandes corpora‹Œes investem milhŒes de dŠlares
em solu‹Œes para servidores de aplica‹Œes, oferecendo melhorias e funcionalidades
adicionais • especifica‹…o, de forma que se tornem mais competitivos.
Abordaremos para o mŠdulo, um dos mais populares container web do
mercado. O Tomcat da funda‹…o de software Apache.

2.4.1 – Container Web – Tomcat


Sendo um dos mais populares cont€iner web do mercado, o Tomcat ‚ uma
implementa‹…o de cŠdigo aberto das especifica‹Œes de Servlet e JSP da JCP, que
com o apoio da comunidade Java, vem ao longo dos anos ganhando espa‹o e
maturidade para suportar aplica‹Œes de m‚dio e at‚, algumas vezes, de grande
porte.

2.4.1.1 – COMO OBTER?


A funda‹…o apache disponibiliza o tomcat atrav‚s do site
http://tomcat.apache.org. Durante o desenvolvimento deste fasc†culo a vers…o
dispon†vel era a 6.0.18, onde seu conteƒdo foi testado.

2.4.1.2 – INSTALA•‘O E CONFIGURA•‘O


Uma vez finalizado o download, voc€ deve descompactar o arquivo em um
diretŠrio de sua prefer€ncia, sempre lembrando que ‚ interessante evitar
diretŠrio/pastas, com nomes contendo espa‹os em branco e mesclas de caixa alta e
baixa, j• que a aplica‹…o Java, por ser multiplataforma pode ser transportada para
sistemas operacionais sens†veis a essa diferen‹as. O tomcat est• distribu†do
atrav‚s da seguinte estrutura de diretŠrios:

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 responsáveis pelo gerenciamento do tomcat, dentre
eles o principal é o catalina, responsável pela inicialização e finalização do
container.

conf
Armazena os principais arquivos de configuração do tomcat, e dentre eles,
nós iremos utilizar o material do context.xml para definições de acesso a dados e, o
tomcat-users.xml, para definição do usuário e senha para acesso ao administrador
do tomcat.

lib
Contém as bibliotecas para o funcionamento das aplicações web, dentre
elas, destaca-se a servlet-api.jar e jsp-api.jar, implementação das referências para
aplicações web Java.

logs
Local onde são armazenadas informações relativas a execução do tomcat e
das aplicações nele distribuídas.

temp
Arquivos temporários.

webapps
Local onde serão armazenadas as aplicações.

work
Local onde ‚ armazenado o “cache” das aplica‹Œes e os arquivos de
servlets compilados a partir do jsp.
As configura‹Œes de usu•rio e senha, necess•rias para o acesso ao
manager do tomcat, devem ser inclu†das 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


ApŠs as configura‹Œes utilizaremos o script catalina para inicializa‹…o. No
diretŠrio bin digite:

No sistema linux
Tomcat_home/bin$ ./catalina.sh run

Sistema windows
Tomcat_home\bin> catalina run

Dessa forma teremos inicializa‹…o com a exibi‹…o do log em tempo de


execu‹…o no terminal Linux ou no prompt de comandos, caso esteja utilizando
Windows. ApŠs a inicializa‹…o execute o browser da sua prefer€ncia e acesso o
endere‹o:

http://localhost:8080/

Se tudo correr bem, ser• exibida a voc€ a p•gina inicial do tomcat.

FIGURA 18 – TELA INICIAL DO TOMCAT


2.4.1.4 – DISTRIBUINDO A APLICA•‘O
Para distribuir a aplica‹…o ‚ necess•rio acessar o Tomcat Manager e digitar
o usu•rio e senha configurados anteriormente no tomcat-users.xml.
Ent…o, selecione a aplica‹…o na se‹…o WAR file to deploy e clique em deploy,
conforme a figura abaixo.

FIGURA 19 – TELA DE INFORMA•‘O DO TOMCAT

2.5 – SERVLET
Muito al‚m de uma solicita‹…o a uma simples p•gina com informa‹Œes
est•ticas, os usu•rios da Internet buscam informa‹Œes din“micas e atualizadas que
v…o desde consultas simples a livros em uma biblioteca at‚ informa‹Œes de extrato
de sua conta no banco. Esta necessidade fez com que novas tecnologias fossem
acopladas ao desenvolvimento de p•ginas HTML para fornecer esse dinamismo. O
Servlet pode nos ajudar nisso.
2.5.1 – O que ‚ um Servlet?
S…o classes Java utilizadas para proporcionar caracter†sticas que auxiliam
servidores de aplica‹Œes nas transa‹Œes do tipo requisi‹…o/resposta. Ou como diz o
autor do livro Tutorial do J2EE.

Um servlet ‚ uma classe de linguagem de programa‹…o


Java utilizada para estender as capacidades de
servidores que hospedam acessos de aplicativos por
meio de um modelo de programa‹…o requisi‹…o-
resposta. (BODOFF, 2005, p.319).

Os servlets proporcionam o dinamismo necess•rio •s aplica‹Œes web


modernas. „ poss†vel organizar as aplica‹Œes dividindo-as por funcionalidades e
separando essas funcionalidades em servlets espec†ficos, como em uma loja virtual.
Pode-se ter um servlet chamado UsuarioServlet, respons•vel pela gest…o de
usu•rios, 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
requisi‹…o, a plataforma nos facilita a vida fornecendo uma classe abstrata com
todas as funcionalidades necess•rias ao atendimento de requisi‹Œes do tipo HTTP
atrav‚s de m‚todos doGet, doPost, etc.
Iniciaremos a escrita do nosso primeiro servlet com uma funcionalidade
bem simples. Seu trabalho ser• recepcionar o usu•rio respondendo com bom dia,
boa tarde ou boa noite dependendo do hor•rio.
Esse cŠdigo, poder• gerar alguns questionamentos que ser…o esclarecidos
no decorrer do exemplo.
arquivo: RecepcionistaServlet.java
Este arquivo deve ser criado dentro da pasta src no diretŠrio
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;

// método que torna o servlet capaz de tratar do


// protocolo HTTP métodos do tipo GET apenas.
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
// cria um atributo através do objeto request como o nome
// boasVindas e com a mensagem retornada pelo método
// privado boasVindas(Data).
req.setAttribute("boasVindas", boasVindas(new Date()));

// cria um despachante para encaminhar a requisição a


// página 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 definição 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 diretório raiz da aplicação, no mesmo
nível do index.jsp, no diretório webapp. O delhalhe nesse arquivo é a linguagem de
expressão, Expression Language(EL), ${}, neste local deverá ser passado o nome
dado ao atributo da requisição passado no método 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}, usuário !</b>
<hr>

</body>
</html>

web.xml
Neste arquivo, como dito anteriormente, você definirá como a aplicação
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
código 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, al‚m de p•ginas, tamb‚m possu†mos cŠdigo Java que precisar…o
estar dentro do arquivo .war na distribui‹…o. 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 est…o as bibliotecas necessarias a compila‹…o


das classes java -->
<path id="libs.classpath">
<fileset dir="${web.dir}/WEB-INF/lib" includes="*.jar" />
<fileset dir="${tomcat.home}/lib" includes="*.jar" />
</path>

<!-- prepara‹…o do ambiente, incluimos o trabalho de realizar o


deploy da aplica‹…o no tomcat para tornar mais r•pido 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>

<!-- Compila‹…o dos arquivos java da aplica‹…o -->


<target name="compile" depends="init" >
<javac srcdir="${src.dir}"
destdir="${web.dir}/WEB-INF/classes"
source="1.5"
classpathref="libs.classpath" debug="true" />
</target>

<!-- Constru‹…o 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>

<!-- distribui‹…o 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


conteƒdo: tomcat.home=<diretorio do tomcat sem a barra no final>

Se o seu tomcat estiver instalado no diretŠrio c:\java\tomcat, seu


build.properties deve estar assim: tomcat.home=c:\java\tomcat

2.5.4 – Executando
ApŠs a conclus…o das configura‹Œes voc€ est• pronto para testar a
aplica‹…o, para isso, abra o browser e acesse a aplica‹…o pelo endere‹o:
http://localhost:8080/microlog/bemvindo.do

Dever• aparecer um resultado semelhante ao da tela abaixo:

FIGURA 20 – TELA DE CONFIRMA•‘O 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 est•tico e regular de maneira normal, usando
ferramentas familiares de constru‹…o de p•ginas Web”.
O JSP de forma bem simples surgiu da id‚ia de simplificar o
desenvolvimento de resposta web din“micas associadas a uma p•gina HTML
comum. Em outras palavras, JSP ‚ a associa‹…o de conteƒdo web est•tico a cŠdigo
Java respons•vel pelo conteƒdo din“mico.
Voc€ pode, inclusive, utilizar linguagens de expressŒes e at‚ mesmo
embutir cŠdigo Java puro em suas p•ginas. Voltando ao cŠdigo da p•gina de
recep‹…o do exemplo anterior, podemos observar que bemvindo.jsp ‚ um exemplo
de p•gina HTML que possui um artefato que a diferencia de uma p•gina HTML
pura: sua EL ${}.
Para desenvolver uma p•gina web, voc€ j• viu que n…o ‚ muito diferente de
uma HTML, contudo recomenda-se que a extens…o seja .jsp.
O que ‚ importante saber sobre o jsp ‚ que todo seu cŠdigo ‚ convertido
em uma classe Java que estende HTTPServlet, ou seja, o JSP no final ‚ um servlet.
Isso se d• no momento da primeira requisi‹…o quando o servidor identifica a
p•gina jsp solicitada e converte essa p•gina para cŠdigo Java e ent…o executa o
servlet e retorna o resultado.
Podemos perceber isso no tomcat atrav‚s do diretŠrio work no caminho
TOMCAT_HOME/work/Catalina/localhost/microblog/org/apache/jsp, nesse diretŠrio
encontraremos dois arquivos, o bemvindo_jsp.class e o bemvindo_jsp.java, ambos
gerados a partir da solicita‹…o que se faz ao RecepcionistaServlet.
Em fun‹…o disso, a primeira chamada a um recurso JSP no servidor ‚ mais
lenta, contudo tudo se normaliza apŠs as classes terem sido compiladas.

2.6.2 – Scriptlets, por que n…o se deve usar nunca?


Como falamos anteriormente podemos perfeitamente incluir cŠdigos Java
em p•ginas e para isso utilizamos as tags <%%>:

<% <cŠdigo java> %>

Ent…o para exemplificar, ser• criada uma p•gina chamada


bemvindoScriptlet.jsp e incluiremos nela o cŠdigo 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 defini‹…o 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 %>, usu•rio !</b>
<hr>

</body>
</html>

Com isso, apŠs executar o ant, pode-se testar chamando n…o mais o
servlet, e sim a p•gina web direto! Voc€ ter• o resultado semelhante ao anterior.

FIGURA 21 – TELA DE CONFIRMA•‘O DA APLICA•‘O

„ f•cil perceber que n…o levar• muito tempo, dependendo do tamanho da


aplica‹…o, para que a manuten‹…o desse cŠdigo fique seriamente comprometida e,
dentre outras coisas, dificulte a “reusabilidade”, ou seja, haver• retrabalho se em
outro ponto da aplica‹…o houver necessidade de saudar o usu•rio. Isso sem contar
que nossos amigos web designers n…o precisar…o ter que deparar com blocos de
cŠdigo Java para fazer algo que muitas vezes nem lhe interessa.
N…o lhe aconselho a utilizar scriptlet em p•ginas e sim, EL e tags que
veremos a seguir, contudo, vale levar em conta que muitas aplica‹Œes para web j•
est…o prontas e precisando de manuten‹…o. Voc€ muito provavelmente encontrar•
esses cŠdigos ao longo da vida profissional, ent…o, ‚ bom conhecer.
2.7 – Facilitando a vida com EL e JSTL
Adicionada a especifica‹…o de JSP 2.0 a EL vem como uma forma de tornar
as p•ginas jsp mais limpas sem uso de scriptlet.
Apesar da sintaxe bem semelhante a da linguagem Java, a EL possui
caracter†sticas prŠprias e funcionalidades que nem sempre funcionam como Java
funcionaria e por isso, vale a pena “ficar alerta”.
Ser• necess•rio, para ter acesso as funcionalidades da JSTL, adicionarmos
as libs jstl.jar e standard.jar que voc€ pode baixar da Internet ou procurar nas
aplica‹Œes de exemplo do tomcat.
Para exemplificar, vamos imaginar que temos um objeto no escopo de
requisi‹…o chamado usu•rio 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;

// métodos gets e sets


...
// métodos equals, hashcods e to strings da especificação de javabeans
...

Para que possamos exibir o nome desde objeto usu•rio em uma p•ginas
JSP ter†amos o seguinte cŠdigo:

Com scriptlet:

<%= ((caminho.completo.Usuario) request.getAttribute("usuario")).getNome() %>

Com EL

${usuario.nome}

Na compara‹…o dos cŠdigos acima, voc€ pode perceber a necessidade de


uma convers…o(cast) para a classe Usu•rio no objeto Object retornado pelo m‚todo
getAttribute do objeto request, para ent…o ter acesso ao m‚todo getNome() que
retorna o nome do usu•rio, enquanto que pela EL, isso tudo ‚ feito internamente.
Ent…o, voltando aos nossos amigos designers, eles ainda ter…o que se
deparar com trechos de cŠdigos desconhecidos, contudo, a adapta‹…o 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 cŠdigo na p•gina HTML ficar• muito mais
limpo.

NOTA – CONSULTANDO O SITE JAVA: Para mais informa‹Œes consulte o site da Java Community
Process pesquisando pela JSR 245.

Abaixo, veremos mais alguns operadores:

Operadores . ou [ ]:

Tem fun‹…o semelhante sendo que no caso do operador [ ] ‚ poss†vel incluir


aspas para o caso de atributos com formato “nome.outronome”.

Ex. ${usuario.’nome’]}

Objetos impl†citos da EL
A JSP possui alguns objetos impl†citos que est…o dispon†veis para serem
utilizados na EL conforme listagem abaixo.

param: Mapeia um nome de par“metro de solicita‹…o de um ƒnico valor.


paramValues: Mapeia um nome de par“metro de solicita‹…o para uma matriz de
valores.
header: Mapeia um nome de cabe‹alho de solicita‹…o como um ƒnico valor.
headerValues: Mapeia um nome de cabe‹alho de solicita‹…o para uma matriz de
valores.
cookie: Mapeia um nome de cookie em um ƒnico cookie.
initParam: Mapas de um contexto nome do par“metro de inicializa‹…o para um
ƒnico valor.
pageScope: Mapeamento de nomes de vari•veis no escopo de p•gina.
requestScope: Mapeamento de nomes de vari•veis no escopo de requisi‹…o.
sessionScope: Mapeamento de nomes de vari•veis no escopo de sess…o.
applicationScope: Mapeamento de nomes de vari•vel no escopo de aplica‹…o.

„ importante saber que, em uma express…o do tipo:

${nome.valor}

nome ou ‚ um atributo em um dos quatro escopos ou ‚ um objeto impl†cito


da EL.
2.7.1 – O que s…o escopos ?
Para que voc€ entenda o que s…o escopos, ‚ necess•rio ter em mente que
na troca de informa‹Œes entre as transa‹Œes, enviamos e recebemos informa‹Œes,
mas sabemos que, uma aplica‹…o uma vez disponibilizada na web, corre o risco de
ser acessadas por pessoas no mundo inteiro, inclusive ao mesmo tempo.
Ent…o como saber se o servidor est• mandando a informa‹…o correta a
determinado cliente ?
Para isso temos os escopos, dispon†veis em quatro possibilidades: Escopos
de Aplica‹…o ou Contexto, Sess…o, Requisi‹…o e de P•gina.
Estes escopos permitem que informa‹Œes 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 aplica‹…o ou contexto.


Este escopo ‚ disponibilizado para todas as requisi‹Œes, ou seja, qualquer
cliente pode acessar informa‹Œes desse contexto.
Essa informa‹…o pode ser, por exemplo, uma refer€ncia a um determinado
layout padr…o, 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 endere‹o de
email do administrador do sistema que deve ser o mesmo para todos os clientes
que acessem a aplica‹…o.
Objetos nesse escopo podem ser atribu†do de forma declarativa, atrav‚s do
web.xml e de forma program•tica atrav‚s de cŠdigo Java feito na prŠpria aplica‹…o.

Declarativa:
No arquivo web.xml inclua o trecho abaixo:

<context-param>
<description>Este ‚ o estilo default da aplica‹…o</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 distribui‹…o da aplica‹…o


no servidor, ou seja, qualquer cliente poder• requisitar essas informa‹Œes e obter
respostas.

Program•tica:
Este código deve ser incluído dentro de um servlet já que o mesmo possui o
método 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 informação disponível para todos os clientes.

2.7.3 - Escopo de Sessão.

Imagine você realizando uma compra em um comércio eletrônico 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 especificação do protocolo HTTP, verá
que o mesmo não guarda informações do requisitante, o seja, uma conexão é
aberta, a informação é processada e essa conexão é fechada, com isso, o servidor
não saberá mais quem fez a solicitação 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ê não adicionou.
A solução para esse cenário caótico é o objeto HTTPSession, com ele,
quando um cliente fizer uma requisição é criada uma sessão e identificada por
identificador chamado JSESSIONID.
Esse identificador é enviado no conteúdo 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
então 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 sessão ou utilizar a sessão existente.

HTTPSession sessao = request.getSession(false);


// Utiliza a sessão existente apenas.

A sessão possui um tempo de vida que podemos configurar no web.xml


através das tag <session-config>, onde nela indicaremos a quantidade de tempo em
minutos que a sessão permanecerá viva:

<session-config>
<session-timeout>15</session-timeout>
</session-config>
Muito provavelmente voc€ j• dever ter passado por uma situa‹…o onde est•
acessando uma transa‹…o banc•ria e de posse do seu extrato, realiza alguns
c•lculos, e quando volta ao computador para realizar um pagamento a aplica‹…o
solicita que se autentique no site do banco novamente porque sua sess…o expirou.
Em aplica‹Œes Java, esse tempo ‚ configurado no DD e caso n…o exista
requisi‹Œes por um determinado per†odo de tempo, (no nosso exemplo 15 minutos),
o servidor invalida a sess…o perdendo com isso todos os controles que indicavam
que existia um usu•rio conectado ao site, obrigando-o a se autenticar novamente.
A partir da sess…o, existem alguns m‚todos importantes que precisamos
conhecer.

>> setAttribute(String,String);
adiciona objetos no escopo de sess…o, ou seja, objetos que existem enquanto a
aplica‹…o n…o exceder o “timeout” da sess…o ou enquanto a aplica‹…o n…o chama o
m‚todo invalidade().

>> session.setAttribute("usuarioLogado", usuario);


adiciona o objeto usu•rio a sess…o identificando esse objeto com o nome
usuarioLogado.

>> removeAttribute(String);
remove o atributo da sess…o.

>> session.removeAttribute("usuarioLocado");
remove o atributo chamado usuarioLogado da sess…o.

>> invalidate();
torna inv•lida a sess…o, ou seja, remove todos os atributos e exclui o identificador.

Vale observar que existem outros m‚todos que podem ser interessantes na
constru‹…o de aplica‹Œes reais. Voc€ pode encontrar mais informa‹Œes sobre esses
m‚todos na especifica‹…o de Servlet.

2.7.4 – Escopo de Requisi‹…o.


Este escopo ‚ interessante para informa‹Œes que devem ser repassadas
aos clientes, no entanto, n…o precisam existir apŠs o envio.
Um exemplo simples de entender seria quando um usu•rio faz uma
pesquisa e o servidor retorna uma lista como resultado. Essa lista, ter• serventia at‚
o retorno da requisi‹…o, n…o interessando posteriormente ao usu•rio e com isso n…o
havendo necessidade de manter esse recurso.

>> request.setAttribute(string, objeto);


respons•vel por atribuir objetos no escopo de requisi‹…o.

>> request.removeAttribute(string);
respons•vel por remover atributos do escopo de requisi‹…o.

2.7.5 – Escopo de P•gina.


Este escopo existe apenas durante a execu‹…o da p•gina, geralmente o
escopo da p•gina ‚ utilizado com scriptlets e tags onde valores e vari•veis s…o
criadas apenas para realizar tarefas na p•gina.

Outros Operadores
Existem muitos outros operadores dispon†veis na EL, mostraremos alguns,
contudo vale consultar a documenta‹…o para a lista completa.

Operadores Aritm‚ticos
Adi‹…o: +
Subtra‹…o: -
Multiplica‹…o: *
Divis…o: / ou div
Resto: % ou mod

Opera‹Œes 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 LŠgicos
E: && ou and
OU: || ou or
Nega‹…o: ! ou not

Nulo ou Vazio: empty

Operador Condicional
A?B:C
Onde, A ‚ a express…o que retorna um valor boleano(verdadeiro ou falso). B ser• a
opera‹…o realizada caso a condi‹…o avaliada em A for verdadeira e C caso seja
falsa.

2.7.6 – Estruturas condicionais


„ poss†vel realizar opera‹Œes condicionar em p•ginas 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>

Mƒltiplas op‹Œes

<c:choose>
<c:when test="${express…o}">...</c:when>
<c:when test="${express…o}">...</c:when>
<c:otherwise>... </c:otherwise>
</c:choose>

2.7.7 – La‹os

„ poss†vel realizar la‹os de repeti‹…o atrav‚s da JSTL de forma simples


passando apenas a cole‹…o de dados e indicando a vari•vel que representar• o
objeto no la‹o.
O “var” ‚ um exemplo t†pico de escopo de p•gina, j• que essa vari•vel est•
dispon†vel apenas na p•gina e durante a repeti‹…o.

<c:forEach var="nome" items="${nomeDaCollection}">


<c:out value="${nome}"/>
</c:forEach>

Exemplo de la‹o:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<% boolean inverte = false; %>

<b>Gest…o de Usu•rios</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 s…o classes bastante interessante quando se deseja monitorar o
comportamento da aplica‹…o para a realiza‹…o de tarefas espec†ficas baseado em
determinados eventos.
Imagine se os requisitos de seu prŠximo aplicativo web, determinar que
voc€ precisa contar o nƒmero de acessos, ou que determinada p•gina deve ser
v•lida por um per†odo 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! S…o 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 altera‹…o tenha ocorrido”.
Existem v•rios listeners dispon†vel para monitorar eventos em n†vel de
servidor, para utilizarmos, precisamos de uma declara‹…o no DD e de classes
implementando os listeners. Veremos rapidamente alguns deles.

HTTPSessionListener
Respons•vel pelo monitoramento dos eventos que dizem respeito a sess…o,
onde um evento chamado HTTPSessionEvent ‚ disparado no momento em que
uma sess…o ‚ criada ou invalidada.
Para utilizarmos criaremos uma classe chamada MonitoraSessaoListener,
para que possamos obter o nƒmero de usu•rios online no sistema, ou seja, o
nƒmero de clientes que abrir…o uma sess…o na aplica‹…o.
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 m‚todos:

sessionCreated(HttpSessionEvent evento):
executado no momento em que uma sess…o ‚ criada.

sessionDestroyed(HttpSessionEvent evento):
executada no momento em que uma sess…o ‚ finalizada por “timeout” ou quando
alguma parte da aplica‹…o chama o m‚todo invalidade().

Dessa forma podemos criar um contador e incrementar um valor a cada


nova cria‹…o de sess…o e decrementar um a cada invalida‹…o. 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 sess…o, existem outros para atributos e
at‚ para que a prŠpria classe saiba quando foi adicionado ou retirado da sess…o, 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 s…o que classes respons•veis por verificar o conteƒdo
das requisi‹Œes e determinar, baseado em condicionais, se ‚ uma requisi‹…o v•lida,
ou se a partir dessa requisi‹…o, ela deve ser encaminhada para um ou outro lugar.

Os filtros lhe permitem interceptar a solicita‹…o. E se


puder interceptar a solicita‹…o, voc€ poder• tamb‚m
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 usu•rio mal
intencionado tenta acessar uma URL que o mesmo n…o tem permiss…o, ou em uma
compra da web onde o usu•rio para concluir o pedido, necessite primeiro ser
autenticado.
Os filtros são disponibilizados através de classes Java e configurados no
DD, e com base nessa configuração essas classes interceptam requisições que
estejam dentro do escopo do filtro em questão.
Para exemplificar, vamos implementar um pequeno e simples mecanismo
de segurança em nosso pequeno site, contudo para isso, precisaremos conhecer
alguns conceitos sobre segurança.

5 – SEGURAN•A
É impossível falar em desenvolvimento de sistemas sem discutir segurança.
A segurança web é algo que gera cada vez mais investimentos para tornar os sites
seguros e confiáveis.
Imagine um banco onde você não tenha certeza de que o valor passado
realmente reflete o real, ou que você não tenha realmente certeza de que suas
informações não estão sendo visualizadas por um usuário não autorizado ?
A indústria de software e a comunidade científica não para de investir e
trabalhar para gerar soluções seguras quanto ao acesso a informações remotas, já
que os oportunistas e foras da lei também trabalham incansavelmente para obter
informações de forma ilícita.
Veremos alguns conceitos básicos de segurança e de antemão deixamos
claro que para manter um site seguro e protegido de oportunistas haverá um longa
jornada a ser percorrida!
Existem quatro conceitos básicos que precisam ser avaliados quanto a
questão da segurança no ambiente web, são eles: autenticação, autorização,
confiabilidade e integridade.

Autenticaƒ„o
Define regras para garantir que o usuário é realmente quem diz ser.
Normalmente essa etapa da segurança é validada através de controles de usuários,
senhas, tokens de segurança, validações de informações de cadastro, etc.

Autorizaƒ„o
Agora que já se sabe que o usuário é quem diz ser, é preciso determinar o
que este usuário pode ou não acessar, ou seja, o que ele está autorizado a fazer no
sistema.

Confidencialidade e Integridade
Esses conceitos são interligados, pois dizem respeito a fazer com que os
dados não sejam vistos e nem alterados durante a transmissão. Para esses casos
existem protocolos especiais disponíveis no mercado que fornecem transmissões
de dados criptografados de forma a impedir que usuários oportunistas capturem
blocos de códigos na transmissão com o objetivo de obter e/ou manipular
informações.
5.1 – O FILTRO DE SEGURAN•A
Precisamos implantar um controle de seguran‹a em nosso sistema de
forma que, alguns pontos da aplica‹…o sejam protegidos onde para acesso, o
usu•rio deve estar autenticado no sistema.
Em nosso exemplo, montaremos um servlet que encaminhe o cliente a
p•gina de login, sempre que o mesmo esteja tentando acessar uma •rea restrita do
sistema sem estar devidamente autenticado.
Uma vez na p•gina de login, o usu•rio entrar• com um nome e uma senha
com a validade das informa‹Œes. Inclui-se no escopo de sess…o, um objeto boleano
de nome “logado” com o valor verdadeiro.
Devidamente autenticado, o usu•rio, ao acessar o recurso restrito, ter• sua
solicita‹…o novamente verificada para ent…o sim ser encaminhar ao recurso
protegido.

Abaixo a classe Java do filtro.

package br.com.empresa.microblog.security;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import 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 declara‹…o 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 aplicação, onde haverá um
cadastro de usuário e a partir disso, mensagens poderão ser trocadas e usuários
poderão ser adicionados de forma que os mesmos tenham acesso a suas
mensagens e você as mensagens dele.
Já existem aplicações no mercado com esse conceito, a mais famosa dela
é o twitter. Iniciaremos com alguns pontos fundamentais de segurança e controle de
usuários, e o restante será tarefa sua.

6. 1. Acesso a dados
Inicialmente faremos algumas configurações em nosso ambiente, de forma
a permitir que nossa aplicação tenha acesso a banco de dados.
Utilizaremos para os testes o MySQL. O banco a ser criado se chamará
microblog e possuirá a tabela usuário com a estrutura a seguir.

Script para criação 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)
);

// inclusão 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 ‚ necess•rio ter um driver JDBC e
de uma pequena configura‹…o no arquivo context.xml do diretŠrio conf do tomcat.
No site http://dev.mysql.com/downloads/, ‚ poss†vel localizar o item
Connector/J e fazer o download do arquivo. Ele dever• ficar localizado dentro do
diretŠrio lib do tomcat, fazendo com que todas as aplica‹Œes do cont€iner que
precisem acessar o banco mysql j• tenham o driver necess•rio dispon†vel.
A vers…o dispon†vel 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.
ApŠs 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 modifica‹…o no arquivo de configura‹…o do cont€iner, o


tomcat solicita que o cont€iner seja reiniciado. N…o esque‹a de trocar a senha
”senha” pela senha do seu usu•rio.
Vale lembrar que essa configura‹…o ‚ para o Tomcat e que sofrer•
modifica‹Œes caso voc€ opte por um outro cont€iner web.

6.3 – CONFIGURANDO AS CLASSES DE ACESSO A DADOS


Para acesso a base de dados, e no intuito de n…o termos que repetir o
mesmo cŠdigo sempre que necessitarmos realizar uma consulta, construiremos
uma classe abstrata que guardar• todos os m‚todos necess•rios a conex…o com o
banco, e a partir da†, estenderemos para outras fun‹Œes 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á informações dos usuários.
Para mapear as informações do banco com a classe Java, utilizaremos a
classe Usuario.java, seguindo a especificação 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 Integer id ;
private String nome;
private String login;
private String senha;

public Integer getId() { return id; }


public void setId(Integer id) { this.id = id; }
public String getNome() { return nome; }
public void setNome(String nome){ this.nome = nome; }
public String getLogin() { return login; }
public void setLogin(String login) { this.login = login; }
public String getSenha() { return senha; }
public 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 manipulação dos dados com o
usuário.

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 responsável pelo acesso e manipulação dos


dados do usuário. Agora utilizaremos o servlet para controlar as transações entre a
base de dados e a visão do usuário. 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 então a tela de consulta onde teremos uma listagem com o login e o
nome dos usuários. 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>Gestão de Usuários</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>

ApŠs juntar isso tudo, execute o ant e acesse o browser no endere‹o


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 também alguns métodos
que serão úteis para implementar a parte de inclusão, edição e exclusão de dados
além da segurança.
Vale lembrar que no exemplo acima não existe nenhum mecanismo de
criptografia, contudo, com uma pesquisa simples na Internet, é fácil encontrar vários
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 endereços 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

REFLEXÕES SOBRE A APRENDIZAGEM


A linguagem Java obteve um espaço bastante significativo no cenário da
programação e em especial para o ambiente web em virtude de suas grandes
variações de aplicações 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 eficiência e excelente
prestatividade aos seus usuários em geral.

RESUMO DA UNIDADE
A unidade aborda considerações gerais e depois específicas da linguagem
de programação Java direcionada a web. Inicialmente observamos alguns conceitos
fundamentais ao aprendizado, a estrutura da aplicação Java para web e elementos
essenciais como o Servlet e o JSP.
Consta ainda da unidade, uma seção que possui o propósito de oferecer ao
aluno uma prática de desenvolvimento utilizando os conhecimentos absorvidos com
o assunto em tela.

SUGESTÕES DE LEITURA

Sugiro que você faça uma leitura complementar nos links informados na seção
Saiba Mais acima e, se possível, em alguns dos livros indicados na bibliografia
deste fascículo.

Вам также может понравиться