Escolar Documentos
Profissional Documentos
Cultura Documentos
EM SISTEMAS WEB
autor
JOÃO PAULO CASATI
1ª edição
SESES
rio de janeiro 2016
Conselho editorial regiane burger, roberto paes e paola gil de almeida
Todos os direitos reservados. Nenhuma parte desta obra pode ser reproduzida ou transmitida
por quaisquer meios (eletrônico ou mecânico, incluindo fotocópia e gravação) ou arquivada em
qualquer sistema ou banco de dados sem permissão escrita da Editora. Copyright seses, 2016.
isbn: 978-85-5548-334-9
Prefácio 5
Sejam bem-vindos a esta disciplina. A programação das rotinas que são exe-
cutadas do lado servidor em um sistema web é uma tarefa que exige conheci-
mento de diversas tecnologias e métodos de programação, assim como conhe-
cimento de arquiteturas de desenvolvimento, interação com bancos de dados e
engenharia de software. Nesta disciplina serão abordadas as tecnologias neces-
sárias para se desenvolver a base dos sistemas web, a aplicação do lado servidor.
As rotinas mais importantes e vitais de um sistema devem seguir uma ar-
quitetura de desenvolvimento que garanta manutenibilidade, organização, de-
sempenho e produtividade e aliado às tecnologias, o padrão de arquitetura de
desenvolvimento web mais aceito e utilizado também é apresentado neste livro.
A grande maioria das tecnologias, linguagens e padrões apresentados aqui
são baseados na linguagem de programação Java, a mais popular entre os de-
senvolvedores de sistemas de informação complexos para web. Juntamente
com a linguagem e os padrões e tecnologias adotados para o desenvolvimen-
to web, boas práticas e inovações são também abordadas no decorrer do livro,
trazendo a aquisição de um conhecimento essencial, aprofundado e atualiza-
do para que você, aluno, possa ter uma experiência de aprendizado completa
quanto ao desenvolvimento de sistemas para a plataforma web.
Como objetivos a serem alcançados por esta disciplina, pode-se citar o
aprendizado de tecnologias importantes para o desenvolvedor, assim como
uma visão prática da programação, permitindo a você aluno iniciar no desen-
volvimento de sistemas para a web.
Bons estudos!
5
1
A Criação de
Aplicativos para
WEB
1. A criação de aplicativos para web
Neste primeiro capítulo são abordados os temas iniciais necessários para que
se possa progredir nesta disciplina de programação para o lado servidor dos
sistemas web.
Pela base tecnológica abordada neste livro ser a linguagem Java, este capí-
tulo inicia com uma revisão de sua sintaxe (criação de classes, manipulação de
objetos, estruturas, palavras reservadas etc.). Esta revisão é importante, pois o
conhecimento acerca da linguagem é utilizado no decorrer do livro.
Uma visão geral do ambiente servidor no qual a aplicação será pro-
cessada também é apresentado, assim como uma parte muito impor-
tante para a prática do desenvolvimento de software: as IDEs (Integrated
Development Environment, que em português significa Ambiente de
Desenvolvimento Integrado).
Uma visão mais prática e detalhada é feita na IDE NetBeans, a qual é utili-
zada no decorrer deste livro para apresentação de exemplos e estudos de caso.
Inicia-se agora uma busca por um conhecimento fascinante!
Bons estudos!
OBJETIVOS
Este capítulo trará ao aluno os conhecimentos necessários para adentrar no mundo da pro-
gramação do lado servidor em sistemas web baseados na tecnologia Java, muito difundida
no mercado.
Ao final deste primeiro capítulo, o aluno:
• Estará apto a programar na linguagem Java;
• Conhecerá o ambiente do servidor e os principais softwares utilizados;
• Saberá do que se tratam e como as IDEs podem auxiliar no desenvolvimento de software,
inclusive para a web;
• Conhecerá a IDE NetBeans, uma das mais utilizadas e poderosas do mercado; e
• Aprenderá a iniciar projetos de sistemas web utilizando o NetBeans.
8• capítulo 1
1.1 A sintaxe da linguagem Java
capítulo 1 •9
TIPO BITS VALORES
-9223372036854775808
long 64 a
+9223372036854775807
float 32 10-38 a 10+38
double 64 10-308 a 10+308
Tabela 1.1 – Tipos primitivos do Java seguidos do número de bits que ocupam em memória
e os valores que podem ser assumidos por cada tipo.
Os tipos abstratos, em Java, são definidos por classes. Algumas classes são
nativas da linguagem e muito utilizadas, como:
• Integer: números inteiros;
• Double: números reais;
• String: Cadeias de caracteres (texto);
• Entre muitas outras.
10 • capítulo 1
Um exemplo do uso de variáveis primitivas em Java é dado na listagem 1.1,
que possui o código-fonte e a saída de sua execução logo abaixo.
SAÍDA:
35
42
4.0
14
capítulo 1 • 11
O código-fonte referente a criação da classe apresentada na figura 1.1, de
forma simples, é exibido na listagem 1.2.
String nome;
int idade;
String documento;
ESTRUTURA DESCRIÇÃO
Igual: retorna verdadeiro (true) se os dois lados da comparação
==
forem iguais.
Diferente: retorna true se os dois lados da comparação forem
!=
diferentes.
! Negação: Altera o estado de true para false e vice-versa.
Maior: retorna true se o lado esquerdo da comparação for maior
>
que o direito.
12 • capítulo 1
ESTRUTURA DESCRIÇÃO
Maior ou igual: retorna true se o lado esquerdo da comparação
>=
for maior ou igual ao direito.
Menor: retorna true se o lado esquerdo da comparação for
<
menor que o direito.
Menor ou igual: retorna true se o lado esquerdo da comparação
<=
for menor ou igual ao direito.
&& E: retorna true apenas se os dois lados forem verdadeiros.
|| OU: retorna true se ao menos um dos lados forem verdadeiros.
String.equals Retorna true se os textos comparados forem exatamente iguais.
Retorna true se os textos comparados forem iguais ignorando
String.equalsIgnoreCase
maiúsculas e minúsculas.
Tabela 1.2 – Operadores utilizados para comparações.
boolean comparacao1;
boolean comparacao2;
comparacao1 = texto1.equals(texto2);
comparacao2 = texto1.equalsIgnoreCase(texto2);
System.out.println(comparacao1);
System.out.println(comparacao2);
capítulo 1 • 13
SAÍDA (para cada estrutura):
false
true
true
true
false
true
false
false
true
ESTRUTURA DESCRIÇÃO
Define todos os parâmetros logo no início
da estrutura, como a inicialização da variável
for de contagem, a condição de parada e o
incremento/decremento a ser efetuado em
cada iteração.
Define o critério de parada, mas a inicializa-
while ção da variável e o incremento são definidos
em local definido pelo programador.
Parecido com o while, mas checa se o crité-
do, while rio de parada foi satisfeito após a execução
da iteração.
Tabela 1.3 – Estruturas de repetição utilizadas no Java.
A listagem 1.4 traz um exemplo de uso de cada uma das estruturas exibidas
na tabela 1.3, assim como o resultado (saída) da execução do código.
14 • capítulo 1
public static void main(String []args) {
// for contando de 1 a 10
for(int i=0; i<10; i++) {
System.out.println(i+1);
}
// while contando de 1 a 10
int j = 1;
while(j<=10) {
System.out.println(j);
j++;
}
capítulo 1 • 15
CONCEITO
As APIs (Application Programming Interfaces) são como bibliotecas de código que podem
ser reutilizados em diversas aplicações. É comum encontrar uma API que resolva ou facilite
a resolução de um problema específico sem ter que desenvolver código complexo para isto.
if(true) {
System.out.println("Verdadeiro!");
}
SAÍDA:
Pode dirigir
Verdadeiro!
16 • capítulo 1
O uso do else é opcional e o código entre as chaves após o else é executa-
do sempre que a condição dentro dos parênteses do if retorna falso. É possível
também aninhar as estruturas condicionais if uma na outra utilizando: else if
(condição).
Apesar desta revisão da sintaxe do Java ser básica, mais conceitos de progra-
mação e da linguagem Java vão sendo explicados aos poucos durante este livro.
Apesar de existirem uma infinidade de soluções deste tipo para uso com a
internet, como o foco desta disciplina é ensinar a programação do lado servidor
de sistemas web, aqui são apresentados mais detalhadamente dois dos princi-
pais softwares utilizados para este fim, em se tratando de tecnologias baseadas
na linguagem Java:
• Apache Tomcat; • Glassfish.
capítulo 1 • 17
O Glassfish é um servidor de aplicação, trazendo mais recursos como
EJB (Enterprise JavaBeans), além de também suportar os recursos básicos
suportados pelo Tomcat.
A aplicação em Java para web, quando compilada, gera um pacote WAR
(Web application ARchive) contendo toda a aplicação desenvolvida. Este paco-
te é transferido para o servidor (em local específico no Tomcat ou Glassfish),
que fazem a implantação do projeto e disponibilizam seu uso (CAELUM, 2016).
Neste livro é utilizado um ambiente de desenvolvimento que possui integra-
ção tanto com o Glassfish quanto com o Tomcat, o que facilita muito a implan-
tação, depuração e testes dos aplicativos.
Neste livro, a IDE utilizada é o NetBeans na versão 8.1 completa. Este IDE
possui muitos recursos nativos para desenvolvimento de sistemas e no decorrer
18 • capítulo 1
dos capítulos serão apresentados aqueles pertinentes ao desenvolvimento de
sistemas web.
Para a utilização deste IDE é necessário baixa-lo no sítio oficial: http://www.
netbeans.org, é gratuito. A figura 1.2 exibe a tela de download do IDE indicando
a versão utilizada neste livro.
capítulo 1 • 19
É importante salientar alguns botões do IDE NetBeans que são utilizados
cotidianamente. A figura 1.4 exibe os botões do menu numerados, o que cada
um faz é explicado na sequência.
Apesar de possuir muitos recursos, que podem ser utilizados para o desen-
volvimento de uma gama de aplicações de diferentes plataformas, o objetivo é
apresentar o NetBeans para uso no desenvolvimento de aplicações web, o que
é feito a seguir.
20 • capítulo 1
Figura 1.5 – Janela de seleção de tipo de projeto a ser criado no NetBeans.
Figura 1.6 – Janela de definição do nome e localização do projeto a ser criado no NetBeans.
capítulo 1 • 21
A próxima etapa da criação é exibida na figura 1.6. Nesta etapa é necessário
definir um nome para o projeto, além da localização dos arquivos no computa-
dor (pasta do projeto). Neste primeiro projeto pode ser colocado o nome Teste.
Em localização do projeto, escolher uma pasta na qual seus projetos web serão
alocados. Em pasta do projeto é exibido o caminho completo do projeto que
está sendo criado. Após estas definições, clicar em Próximo.
Na terceira janela de criação de projeto (figura 1.7) são definidas as proprie-
dades de servidor, como qual servidor será utilizado pelo NetBeans para a exe-
cução do projeto localmente e qual a versão do Java EE.
CURIOSIDADE
Utilizar uma versão mais nova do JEE possibilitará a utilização de outros recursos, que não
modificarão de forma significativa o desenvolvimento dos exemplos contidos neste livro.
Figura 1.7 – Janela de definição de dados sobre o servidor e versão do JEE referentes ao
projeto a ser criado no NetBeans.
22 • capítulo 1
Finalizando a criação do novo projeto, uma estrutura pré-definida e padro-
nizada é criada pelo NetBeans, tornando mais fácil a organização do código e
dos arquivos de configuração. Esta estrutura pode ser conferida na divisão da
esquerda do IDE, a figura 1.8 apresenta a estrutura criada.
Na estrutura, cada item tem uma função bem definida, são ela:
• Páginas web: neste local são armazenadas as páginas do sistema (arqui-
vos jsp). Alguns arquivos de configuração XML também ficam nesta pasta (web.
xml e context.xml);
• Pacotes de códigos-fonte: local onde as classes Java são organizadas.
Estas classes incluem também os Servlets;
• Bibliotecas: aqui são adicionadas bibliotecas e APIs que podem ser utili-
zadas no desenvolvimento do projeto;
• Arquivos de configuração: como o próprio nome diz, local onde são con-
centrados arquivos de configuração do projeto.
CURIOSIDADE
A estrutura do projeto exibida nesta seção é nativa do IDE NetBeans, porém, ao utilizar uma
ferramenta de automatização de compilação como o Maven, o NetBeans passa a utilizar a
estrutura padronizada pela ferramenta em questão.
Mais detalhes sobre os arquivos e definições dos projetos web são apresen-
tados no decorrer do livro, assim que forem surgindo as necessidades.
capítulo 1 • 23
ATIVIDADES
01. Analise o código-fonte abaixo e escreva a sua saída.
02. Cite três vantagens de se utilizar um IDE como o NetBeans para o desenvolvimento de
sistemas web.
REFLEXÃO
A preparação para o aprendizado em desenvolvimento de aplicações web está feita. Uma
revisão da linguagem de programação aplicada na disciplina, a explanação do ambiente ser-
vidor, informações sobre o ambiente de desenvolvimento a ser utilizado e sobre a criação de
um projeto “vazio” pronto para iniciar os trabalhos de programação foram passados neste
24 • capítulo 1
capítulo, conhecimento suficiente para prosseguir com os estudos e começar a desenvolver
sistemas para web. O primeiro capítulo serve também como referência e o mesmo deve ser
consultado sempre que necessário.
LEITURA
Para o aprendizado de programação em Java, o livro da série Use a Cabeça escrito por Kathy
Sierra e Bert Bates é altamente recomendado por seu caráter didático e bem-humorado.
SIERRA, Kathy; BATES, Bert. Use a Cabeça! Java. 2. ed. Rio de Janeiro: Alta Books,
2010. (Use a Cabeça!).
REFERÊNCIAS BIBLIOGRÁFICAS
ASCENCIO, Ana Fernanda Gomes; ARAÚJO, Graziela Santos de. Estruturas de Dados: algoritmos,
análise da complexidade e implementações em JAVA e C/C++. São Paulo: Pearson Prentice Hall,
2010.
BOOCH, Grady; RUMBAUGH, James; JACOBSON, Ivar. UML: Guia do Usuário. 2. ed. Rio de Janeiro:
Campus, 2005.
CAELUM. Java e Orientação Objetos. 2016. Disponível em: <https://www.caelum.com.br/download/
caelum-java-objetos-fj11.pdf>. Acesso em: 01 mar. 2016.
DEITEL, Paul; DEITEL, Harvey. Java: Como Programar. 8. ed. São Paulo: Pearson, 2010.
NETBEANS. Netbeans IDE. Disponível em: <https://netbeans.org/>. Acesso em: 18 mar. 2016.
SIERRA, Kathy; BATES, Bert. Use a Cabeça! Java. 2. ed. Rio de Janeiro: Alta Books, 2010. (Use a
Cabeça!).
ZAMBON, Giulio; SEKLER, Michael. Beginning JSP, JSF, Tomcat Web Development: From Novice
to Professional. United States Of America: Apress, 2007.
capítulo 1 • 25
26 • capítulo 1
2
Tecnologias de
Sistemas e Bancos
de Dados
2. Tecnologias de Sistemas e Bancos de
Dados
OBJETIVOS
Ao final deste capítulo, o aluno poderá trabalhar com interfaces web em Java utilizan-
do servlets e JSPs, criando e manipulando bancos de dados (Java DB) diretamente do
IDE NetBeans.
28 • capítulo 2
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Descrição";
}
}
capítulo 2 • 29
Ao observar o código do servlet na Listagem 6 pode-se atentar para diversas
particularidades, como:
• A importação de bibliotecas utilizadas para o processamento
das requisições;
• A herança (extends) entre a classe criada (servlet) e a classe HttpServlet;
• O método processRequest que faz o processamento do servlet em questão;
• A criação de um PrinterWriter chamado out que é utilizado para impres-
são de valores quando o processamento do servlet é efetuado;
• O método doGet que é disparado quando a URL do servlet é acessada;
• O método doPost que é disparado quando uma requisição POST é efetua-
da por meio de um formulário, por exemplo;
• O método getServletInfo que retorna uma descrição do servlet.
…
PrintWriter out = response.getWriter();
try {
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Teste</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Este é um teste!!!</h1>");
out.println("<h2>Servlet Rodando: Tomcat</h2>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
...
30 • capítulo 2
Saída:
<!DOCTYPE html>
<html>
<head>
<title>Servlet Teste</title>
</head>
<body>
<h1>Este é um teste!!!</h1>
<h2>Servlet Rodando: Tomcat</h2>
</body>
</html>
capítulo 2 • 31
<servlet>
<servlet-name>Dados</servlet-name>
<servlet-class>Dados</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Dados</servlet-name>
<url-pattern>/Dados</url-pattern>
</servlet-mapping>
As JavaServer Pages (JSPs) são uma extensão dos servlet (DEITEL; DEITEL,
2010). Esta extensão facilita o desenvolvimento de interfaces para sistemas web
programados em Java, misturando a programação em linguagem Java com as
tags HTML/XHTML.
Esta mistura é feita da seguinte forma:
• O código HTML é escrito livremente no arquivo JSP;
• O código Java é escrito dentro de marcadores: <% código aqui %>;
• Existem tags próprias do JSP para facilitar acesso a alguns recursos;
• Classes Java que forem utilizadas nas páginas devem ser devidamen-
te importadas.
32 • capítulo 2
<%@page contentType="text/html"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Título do JSP</title>
</head>
<body>
<h2>Contar até 10:</h2>
<% for(int i=0; i<10; i++) { %>
<p><% out.print(i+1); %></p>
<% } %>
</body>
</html>
Saída:
<!DOCTYPE html>
<html>
<head>
<title>Título do JSP</title>
</head>
<body>
<h2>Contar até 10:</h2>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
</body>
</html>
capítulo 2 • 33
Ao observar o código JSP da listagem 2.4, nota-se os marcadores <% e %>
atuando dentro do código HTML. O código que é colocado dentro destes mar-
cadores é Java. Neste exemplo, uma estrutura de repetição é utilizada para re-
petir dez vezes uma linha de código HTML, esta técnica é muito utilizada para
preenchimento de dados tabulares, onde se repete a linha enquanto existirem
dados a serem exibidos.
Facilita-se muito a criação de páginas dinâmicas para a internet utilizan-
do JSP ao invés de servlet. Porém, os servlet são muito utilizados na camada
de controle do software, explicada em momento oportuno (BASHAM; SIERRA;
BATES, 2010).
Para o desenvolvimento de páginas dinâmicas é necessário que se leia parâ-
metros advindos de formulários, este tema é abordado a seguir.
Tanto servlet quanto JSPs têm o poder de receber parâmetros advindos de for-
mulários ou até mesmo de outras formas. Nesta seção são apresentados os
métodos que são utilizados para o recebimento dos parâmetros advindos de
formulários web e que serão posteriormente processados.
O formulário utilizado nos exemplos é apresentado na listagem 2.5.
34 • capítulo 2
PrintWriter out = response.getWriter();
try {
String nome;
String idade;
nome = request.getParameter("nome");
idade = request.getParameter("idade");
CURIOSIDADE
O método getParameter sempre retorna uma String. Caso seja necessário utilizar outro
tipo de dado, como números e datas, é necessário que seja feita uma conversão (CAELUM,
2016).
capítulo 2 • 35
<%
String nome;
String idade;
nome = request.getParameter("nome");
idade = request.getParameter("idade");
%>
<%@page contentType="text/html"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Dados</title>
</head>
<body>
<p>Nome: <%=nome%></p>
<p>Idade: <%=idade%></p>
</body>
</html>
LEITURA
O JSP permite o uso de tags próprias que livram o programador de utilizar código Java na
página em diversas ocasiões, tornando-a mais natural. Uma boa explicação de uso das ta-
glibs (bibliotecas de tags) é dada na apostila de Java para Desenvolvimento Web da Caelum,
disponível gratuitamente no endereço:
https://www.caelum.com.br/apostila-java-web/
36 • capítulo 2
Mais detalhes e recursos dos JSPs e servlets são apresentados conforme ne-
cessidade durante os exemplos práticos do livro. Na próxima seção inicia-se o
aprendizado do uso de bancos de dados nas aplicações web.
CURIOSIDADE
Em muitas aplicações é possível que se necessite a troca do sistema gerenciador de banco
de dados em algum momento. Ao utilizar a JDBC, esta troca é feita de uma maneira mais
simples, pois o tratamento entre a aplicação e os diversos bancos de dados que a JDBC
suporta é praticamente o mesmo.
capítulo 2 • 37
Figura 2.2 – Tela de escolha de biblioteca para adicionar à projeto.
Um SGBD muito utilizado para aplicações web é o MySQL. Para se fazer uma
conexão é necessário apenas que a biblioteca do driver seja inserida no projeto
em questão. Uma classe é utilizada para fazer a conexão com o banco de dados
e então as APIs de manipulação dos dados podem ser utilizadas para fazer as
operações SQL da aplicação para o SGBD.
38 • capítulo 2
Inicializaremos criando um novo projeto chamado: “DBTeste”. Seguir as ins-
truções dadas no primeiro capítulo sobre como criar um projeto web no NetBeans,
mas neste caso, o servidor a ser escolhido para rodar a aplicação será o Glassfish.
Após a criação do projeto, a estrutura deste deve ser como a exibida na figura 2.3.
capítulo 2 • 39
Deve-se checar também se a configuração está correta. A figura 2.5 exibe
a janela que aparece ao clicar com o botão direito em “Java DB” e selecionar
“Propriedades...”.
40 • capítulo 2
O resultado da inicialização do serviço pode ser observado na aba inferior
“Saída”, onde deve-se conter algo como o resultado apresentado na listagem 2.8.
capítulo 2 • 41
Nos campos de usuário e senha, utilizar “nbuser”, usuário padrão criado
pelo NetBeans. O nome do banco de dados pode ser “clientes”, pois se trata de
um cadastro de informações de clientes neste exemplo.
Nota-se que, após criado, o banco de dados aparece aninhado à Java DB na
aba Serviços, como exibido na figura 2.8. O nó de conexão também é criado,
logo abaixo de “Drivers”.
42 • capítulo 2
Figura 2.9 – Conectado ao banco de dados.
Para este exemplo será criada uma tabela de clientes com os seguintes dados:
• Documento: um campo texto utilizado como chave primária da tabela,
identificando unicamente os clientes;
• Nome: um campo texto que armazenará o nome do cliente;
• Endereço: um campo texto que armazenará o endereço do cliente;
• Telefone: um campo texto que armazenará o telefone do cliente;.
capítulo 2 • 43
Figura 2.10 – Conectado ao banco de dados.
Uma janela (figura 2.11) é exibida sobre a tabela a ser criada. Inicialmente,
sem nenhuma coluna, mas isto pode ser resolvido clicando no botão
“Adicionar coluna”.
Ao clicar em “Adicionar coluna”, uma nova janela é aberta. Nesta janela, são
definidas as propriedades de uma coluna a ser inserida na tabela, como nome
da coluna, tipo de dado, tamanho e restrições.
44 • capítulo 2
No caso da inserção da coluna “documento”, que é a chave primária da tabe-
la, os dados são exibidos na figura 2.12.
Após criada a tabela, a aba “Serviços” é exibida conforme figura 2.14, onde
pode-se observar a tabela “cliente” e suas colunas devidamente aninhadas.
capítulo 2 • 45
Figura 2.14 – Tabela “cliente” e suas colunas na aba “Serviços”.
46 • capítulo 2
Para a execução do comando deve-se abrir a janela de comandos SQL para
o banco de dados. Esta janela abre-se ao clicar com o botão direito na tabela e
selecionar “Executar comando...”.
O resultado da execução do comando aparece na saída e na figura 2.15 po-
de-se observar a janela de comando sendo utilizada para inserir dois registros
(duas linhas) na tabela “cliente”.
capítulo 2 • 47
Figura 2.16 – Consulta de dados de tabelas Java DB com NetBeans.
Ainda é possível executar consultas mais elaboradas por meio dos coman-
dos SQL, além de fazer alterações na tabela e executar outros comandos como
UPDATE e DELETE (NETBEANS, 2016).
ATIVIDADES
01. Qual tipo de biblioteca é imprescindível para um projeto web do NetBeans ter a capaci-
dade de se comunicar com determinado sistema gerenciador de banco de dados (SGBD)?
02. Qual a diferença de se criar uma página web utilizando um servlet e um JSP?
03. Um servlet que processa requisições HTTP deve ser filho (herdar) de qual classe Java?
04. Qual a aba do NetBeans utilizada para gerenciamento de servidores de bancos de dados?
48 • capítulo 2
REFLEXÃO
Os servlets e as JSPs são amplamente utilizados em desenvolvimento de sistemas web com
Java e, por este motivo, foram apresentadas neste capítulo de forma prática.
Quase a totalidade dos sistemas web fazem uso de persistência de dados de alguma
forma, a mais utilizada é o uso de sistemas gerenciadores de bacos de dados (SGBDs).
Para facilitar o desenvolvimento e o uso destes sistemas integrando-os de forma prática,
uma explicação em forma de tutorial de como manipular o banco de dados por meio do IDE
NetBeans foi apresentada neste capítulo, capacitando o aluno a construir de forma dinâmica
os sistemas para internet.
A manipulação dos dados por meio da aplicação é explicada mais à frente no livro, tam-
bém por meio de exemplos práticos.
LEITURA
O livro da série Use a Cabeça sobre servlets e JSP é muito completo e didático para progra-
madores que desejam se aprofundar em desenvolvimento web com Java. Leitura indispen-
sável para pessoas que desejam prestar provas de certificação na área.
BASHAM, Bryan; SIERRA, Kathy; BATES, Bert. Use a cabeça! Servlets & JSP. Rio de
Janeiro: Alta Books, 2010. (Use a cabeça!).
REFERÊNCIAS BIBLIOGRÁFICAS
BASHAM, Bryan; SIERRA, Kathy; BATES, Bert. Use a cabeça! Servlets & JSP. Rio de Janeiro: Alta
Books, 2010. (Use a cabeça!).
CAELUM. Java para desenvolvimento web. Disponível em: <https://www.caelum.com.br/apostila-
java-web/>. Acesso em: 13 mar. 2016.
DEITEL, Paul; DEITEL, Harvey. Java: Como Programar. 8. ed. São Paulo: Pearson, 2010.
NETBEANS. Trabalhando com o Banco de Dados Java DB (Derby). Disponível em: <https://
netbeans.org/kb/docs/ide/java-db_pt_BR.html>. Acesso em: 13 mar. 2016.
ORACLE. JDBC Overview. Disponível em: <http://www.oracle.com/technetwork/java/
overview-141217.html>. Acesso em: 21 mar. 2016.
capítulo 2 • 49
50 • capítulo 2
3
Sessões e
o Modelo MVC
3. Sessões e o modelo MVC
No início deste capítulo é apresentada a tecnologia de sessões. Trata-se de um
mecanismo muito utilizado em diversos tipos de aplicação. Um exemplo do
uso deste recurso também é apresentado e trata-se de gerenciamento de login
em sistemas web, uma das funcionalidades mais utilizadas em sistemas que
requerem controle de acesso de usuários.
Após as sessões, o modelo MVC é o tema deste capítulo. Apresentado de forma teó-
rica e prática, inclusive com um exemplo prático de como as camadas se comuni-
cam em um padrão de estrutura de projeto, este tema é imprescindível para um
bom desenvolvimento de sistema para internet, em outras palavras, para desen-
volver sistemas organizados, funcionais e que sejam fáceis de se dar manutenção.
OBJETIVOS
Ao final deste capítulo, o aluno poderá:
• Trabalhar com sessões em sistemas web;
• Implementar controle de acesso de usuários;
• Desenvolver sistemas que seguem um padrão de desenvolvimento;
• Desenvolver sistemas que seguem o padrão MVC.
52 • capítulo 3
Ao iniciar uma sessão, é configurado um tempo de inatividade máximo para
que, se o usuário se mantiver inativo (não trocar dados com o servidor) durante
o tempo configurado, a sessão é automaticamente invalidada.
Existe também um método que pode ser acionado sempre que o programa-
dor desejar que a sessão seja invalidade, como por exemplo, a ação do botão
“sair” nos sistemas, que invalida a sessão no momento em que são clicados.
A sessão é mantida mesmo com a navegação para diferentes páginas, desde
que no mesmo sistema web. Algumas aplicações comuns de sessão em siste-
mas de internet são:
• Carrinhos de compras;
• Gerenciamento de perfil de usuário;
• Controle de acesso a funcionalidades;
• Controle de acesso a dados;
• Persistência de dados informados em formulários de mais de uma página.
CURIOSIDADE
Login é o nome dado a parte de um sistema que checa um nome de usuário e uma senha
para dar acesso a quem está navegando. O nome login também é dado algumas vezes ape-
nas ao nome de usuário utilizado para entrar em um sistema.
O nome de usuário ou login geralmente é um código único ou um e-mail.
capítulo 3 • 53
Observando a figura 3.1, conclui-se o passo-a-passo do exemplo:
• Usuário acessa a página “login.jsp”, que possui um formulário com dois
campos: login e senha.
• Ao enviar os dados de login e senha, um servlet chamado “Verifica” irá
recebe os dados e checa se o usuário teria a permissão para acesso à página
“sistema.jsp”.
• Se o usuário tiver acesso, o servlet grava os dados do usuário na sessão,
indicando que este tem acesso e o redireciona para a página “sistema.jsp”.
• Se o usuário não tiver permissão, o servlet o redireciona novamente para
a página login.jsp com uma variável sendo passada por GET indicando que o
usuário digitado não tem permissão.
• Quando o usuário é redirecionado novamente para a página “login.jsp”,
uma mensagem é exibida conforme a variável enviada pelo servlet;
• Quando o usuário é redirecionado para a página “sistema.jsp”, uma men-
sagem de boas-vindas é exibida caso a sessão ainda esteja válida, isto serve para
evitar acessos indevidos diretamente pelo endereço da página “sistema.jsp”.
<h1>Sistema de Login</h1>
<form method="post" action="Verifica">
Login:
<input type="text" name="login"/>
Senha:
<input type="password" name="senha"/>
<br/>
<input type="submit" value="Entrar"/>
</form>
54 • capítulo 3
//MARCAÇÃO 1
String login = request.getParameter("login");
String senha = request.getParameter("senha");
//MARCAÇÃO 2
HttpSession sessao = request.getSession();
//MARCAÇÃO 3
if(login.equals("joao") && senha.equals("aabb")) {
//MARCAÇÃO 4
sessao.setAttribute("permissao", "sim");
sessao.setAttribute("usuario", login);
//MARCAÇÃO 5
response.sendRedirect("sistema.jsp");
} else {
//MARCAÇÃO 6
sessao.invalidate();
//MARCAÇÃO 7
response.sendRedirect("login.jsp?permissao=nao");
Listagem 3.2 – Servlet “Verifica” checando a permissão do usuário para acesso ao sistema.
capítulo 3 • 55
“nao”, para que este parâmetro possa ser checado na JSP e possa emitir um
alerta ao usuário que a permissão não foi concedida.
<%
<%
//MARCAÇÃO 1
String p = (String)
session.getAttribute("permissao");
String login = (String)
session.getAttribute("login");
//MARCAÇÃO 2
if(p.equals("sim")) {
%>
<%@page contentType="text/html"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Sistema Restrito</title>
</head>
<body>
<p>Acesso ao sistema concedido para:
<!-- MARCAÇÃO 3 -->
<%=login%>
</p>
</body>
</html>
<%
} else {
//MARCAÇÃO 4
response.sendRedirect("login.jsp?permissao=nao");
}
%>
Listagem 3.3 – Página “sistema.jsp” exibindo dados ao usuário com permissão de acesso.
56 • capítulo 3
As marcações feitas no código da listagem 3.3 significam:
• Marcação 1: atribuindo os valores dos atributos da sessão em variáveis do
tipo String;
• Marcação 2: verificando se o valor atribuído para “permissão” é igual a
“sim” e se for, a página é exibida;
• Marcação 3: Exibindo o login do usuário que obteve a permissão para
acesso à página;
• Marcação 4: Redirecionando o usuário para a página de login novamente,
caso o valor do atributo de permissão da sessão não seja igual a “sim”.
Analisando o código da listagem 3.3, observa-se que nas páginas JSP a va-
riável de sessão (chamada session) não precisa ser instanciada, isto é feito de
forma automática e transparente, diferentemente dos servlets.
Após a execução deste exemplo é possível estendê-lo para diversas outras
funcionalidades que necessitem de sessão para seu funcionamento.
capítulo 3 • 57
A grande diferença entre as duas, segundo Javapoint (2016) versões é que
no MVC I os controles eram feitos por páginas JSP e ficavam espalhados por
estas, descentralizados. No modelo MVC II existe uma camada implementada
via servlet que faz a conexão entre as páginas JSP e as classes Java do modelo
(lógica de negócios).
O servlet implementado no modelo MVC II chamado utiliza-se do padrão
de projeto front controller (ECKSTEIN, 2007), que é um único servlet que fil-
tra requisições e responde com redirecionamento entre as diferentes páginas
(MEDEIROS, 2016).
A figura 3.2 exibe o esquema MVC básico e suas partes.
CURIOSIDADE
O modelo MVC é implementado em diversos frameworks de desenvolvimento web com Java,
como:
• Spring MVC;
• JSF;
• Struts.
58 • capítulo 3
Figura 3.3 – Modelo MVC II, adaptado de Javapoint (2016).
Como vantagens de se utilizar MVC II, citadas por Javapoint (2016), têm-se:
• Maior facilidade de manutenção;
• Controle de navegação centralizado;
• Maior facilidade de crescimento do sistema;
• Maior facilidade para execução de testes;
• Melhor separação entre diferentes conceitos.
Nesta seção uma aplicação web MVC é criada partindo da estaca zero em um
passo-a-passo bem simples de ser seguindo. Primeiramente, um novo projeto
web é criado no NetBeans, seguindo os passos explicados no capítulo 1. Os da-
dos para criação do projeto são exibidos na tabela 3.1, dados que não constem
na tabela não necessitam ser alterados.
capítulo 3 • 59
NOME DO PROJETO WEBMVC
Servidor Glassfish
Versão do Java EE Java EE 5
Tabela 3.1 – Dados para criação do projeto web com MVC.
Para cada tipo de classe é criado um pacote diferente. O padrão para a cria-
ção de pacotes de código-fonte em Java é utilizar o domínio da empresa desen-
volvedora ou dona do software ao contrário, isto facilita a organização das clas-
ses e posterior busca, além de evitar conflitos de classes com nomes iguais.
60 • capítulo 3
Para os pacotes a serem criados neste exemplo, suponha que a empresa de-
senvolvedora se chama Aluno S/A e o domínio desta empresa é alunosa.com.br.
Deste modo, o nome do pacote a ser criado para a camada de modelo da aplica-
ção é exibido na figura 3.5. Para adicionar pacotes, clicar com o botão direito na
pasta de código-fonte, selecionar “Novo” e depois “Pacote Java”.
capítulo 3 • 61
Figura 3.6 – Estrutura do projeto com os pacotes de código-fonte criados.
Para a criação de classes nas camadas modelo e DAO, clicar com o botão
direito no pacote em questão e selecionar “Novo” e depois “Classe Java”. Para
a criação de servlets na camada controle, selecionar “Novo” e depois “Servlet”.
Neste exemplo será feito um cadastro de clientes simples, mas sem detalhes
da persistência de dados, que é tema do capítulo 4.
Inicialmente, é essencial a criação do modelo do sistema, que são as classes
que modelam a lógica da aplicação. Neste sistema, a lógica é dada pelo diagra-
ma de classes apresentado na figura 3.7.
62 • capítulo 3
Na figura 3.8 é exibida a tela de criação da classe e a estrutura do projeto
com a camada de modelo selecionada.
package br.com.alunosa.modelo;
capítulo 3 • 63
}
<%@page contentType="text/html"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
64 • capítulo 3
<html>
<head>
<title>Cadastrar Cliente</title>
</head>
<body>
<h1>Cadastrar Cliente</h1>
<form method="post" action="SalvarCliente">
<label>Documento: </label>
<input type="text" name="documento"/>
<br/>
<label>Nome: </label>
<input type="text" name="nome"/>
<br/>
<label>Endereço: </label>
<input type="text" name="endereco"/>
<br/>
<label>Telefone: </label>
<input type="text" name="telefone"/>
<br/>
<input type="submit" value="Salvar"/>
</form>
</body>
</html>
capítulo 3 • 65
Como pode-se observar na Listagem 19, a ação do formulário envia os dados
via POST para o servlet “SalvarCliente”. Antes da criação do servlet, é necessário
criar a classe DAO para o cliente.
Os DAOs são tema para o próximo capítulo, portanto, criar a classe
“ClienteDAO” e deixá-la vazia para que possamos ver a atuação do modelo MVC
no projeto, mas sem detalhar a persistência dos dados. O código da classe DAO
é exibido na listagem 3.6.
package br.com.alunosa.dao;
import br.com.alunosa.modelo.Cliente;
// MARCAÇÃO 1
package br.com.alunosa.controle;
// MARCAÇÃO 2
import br.com.alunosa.dao.ClienteDAO;
import br.com.alunosa.modelo.Cliente;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
66 • capítulo 3
import javax.servlet.http.HttpServletResponse;
response.setContentType
("text/html;charset=UTF-8");
try (PrintWriter out =
response.getWriter()) {
// MARCAÇÃO 3
String documento =
request.getParameter("documento");
String nome =
request.getParameter("nome");
String endereco =
request.getParameter("endereco");
String telefone =
request.getParameter("telefone");
// MARCAÇÃO 4
Cliente cliente = new Cliente();
// MARCAÇÃO 5
cliente.setDocumento(documento);
cliente.setNome(nome);
cliente.setEndereco(endereco);
cliente.setTelefone(telefone);
// MARCAÇÃO 6
ClienteDAO dao = new ClienteDAO();
// MARCAÇÃO 7
dao.salvar(cliente);
// MARCAÇÃO 8
capítulo 3 • 67
response.sendRedirect("index.jsp");
}
}
…
}
Este exemplo apresentado aqui de forma didática e simples utiliza uma es-
trutura de projeto compatível com MVC e que é muito utilizada em desenvolvi-
mento de sistemas web.
ATIVIDADES
01. Sobre o gerenciamento de sessões com Java, explique o porquê de se utilizar um tempo
máximo de inatividade para que a sessão continue válida.
02. Sobre o desenvolvimento de sistemas utilizando o modelo MVC, cite algumas vantagens
de se separar a visão da lógica de negócio do sistema.
68 • capítulo 3
REFLEXÃO
Com os conhecimentos adquiridos neste capítulo é possível o desenvolvimento de sistemas
que seguem os padrões e técnicas adotados pelo mercado. Foi vista a utilização de sessões
para gerenciamento de login de usuários em um sistema web, embora a utilização deste
recurso vá muito além do exemplo dado, podendo ser utilizado em diversas soluções para
sistemas na internet. O modelo MVC, adotado como padrão para o desenvolvimento de apli-
cações na web, faz parte do dia-a-dia do programador do lado servidor em sistemas web e o
conhecimento de como é feita a separação de um sistema em camadas é imprescindível para
qualquer desenvolvedor que siga modelos e padrões adotados pelo mercado.
LEITURA
Um tutorial bem didático sobre o porquê do surgimento e também sobre desenvolvimento de
aplicações com MVC II é disponibilizado pela Oracle. Escrito por Burns (2014), fica dispo-
nível online e além de conter detalhes de implementação, alguns conceitos são muito bem
explicados neste texto.
BURNS, Ed. Why Another MVC? 2014. Disponível em: <http://www.oracle.com/tech-
network/articles/java/mvc-2280472.html>. Acesso em: 15 mar. 2016.
REFERÊNCIAS BIBLIOGRÁFICAS
BASHAM, Bryan; SIERRA, Kathy; BATES, Bert. Use a cabeça! Servlets & JSP. Rio de Janeiro: Alta
Books, 2010. (Use a cabeça!).
BURNS, Ed. Why Another MVC? 2014. Disponível em: <http://www.oracle.com/technetwork/
articles/java/mvc-2280472.html>. Acesso em: 15 mar. 2016.
ECKSTEIN, Robert. Java SE Application Design With MVC. 2007. Disponível em: <http://www.
oracle.com/technetwork/articles/javase/index-142890.html>. Acesso em: 15 mar. 2016.
JAVAPOINT. Model 1 and Model 2 (MVC) Architecture. Disponível em: <http://www.javatpoint.com/
model-1-and-model-2-mvc-architecture>. Acesso em: 18 mar. 2016.
MEDEIROS, Higor. Padrões de Projetos: Introdução aos Padrões Front Controller e Command.
Disponível em: <http://www.devmedia.com.br/padroes-de-projetos-introducao-aos-padroes-front-
controller-e-command/30644>. Acesso em: 15 mar. 2016.
capítulo 3 • 69
70 • capítulo 3
4
Modelagem
Comportamental e
JPA
4. Modelagem comportamental e JPA
A linguagem Java é muito robusta e cheia de recursos. Dois importantes são
apresentados neste capítulo: tipos genéricos e anotações. Estes recursos são
utilizados para modelar o comportamento do código-fonte para que se possa
tornar o desenvolvimento mais produtivo e organizado.
A JPA é uma API de persistência que pode trabalhar com diversos sistemas
de ORM, que por sua vez são compatíveis com diversos SGBDs relacionais. Isto
torna o desenvolvimento do sistema mais generalizado, não necessitando de
grandes alterações no código caso haja uma troca de tecnologia de persistên-
cia de dados, além de facilitar e muito a configuração e o mapeamento entre o
mundo orientado a objeto e o mundo relacional dos bancos de dados.
OBJETIVOS
Neste capítulo o aluno conhecerá o que são e como utilizar os tipos genéricos em listas e
conhecerá também as anotações e como utilizá-las em classes, métodos e atributos.
O tema ORM também é abordado, passando ao aluno conceitos necessários para que se
possa, posteriormente, utilizar na prática a JPA com um estudo de caso.
De acordo com Deitel e Deitel (2010) a maior motivação para a definição de classes
e métodos genéricos em Java é a grande variação de tipos ao se executar métodos e a
sobrecarga utilizando diferentes métodos para executar exatamente a mesma ope-
ração, mas em tipos diferentes, principalmente em se tratando de listas e vetores.
Existem também as coleções genéricas, que são listas implementadas para
trabalhar com qualquer tipo de objeto, livrando o programador da implemen-
tação de listas específicas para certos tipos de objetos que são trabalhados no
sistema (DEITEL; DEITEL, 2010).
Geralmente, para listas em aplicações Java utiliza-se a interface “List”, que
possui diversas implementações. Cada implementação gerencia a lista de um
modo diferente, completamente transparente para o usuário, mas os métodos
possuem o mesmo nome e são genéricos, em outras palavras, podem manipu-
lar qualquer tipo de objeto.
72 • capítulo 4
A utilização destas listas é apresentada em um programa na listagem 4.1.
// MARCAÇÃO 1
List<String> lista;
// MARCAÇÃO 2
lista = new ArrayList<>();
// MARCAÇÃO 3
lista.add("Olá ");
lista.add("Mundo!");
// MARCAÇÃO 4
for(String s:lista)
System.out.print(s);
}
Saída:
Olá Mundo!
capítulo 4 • 73
Os tipos genéricos são muito utilizados por APIs e é necessário que se sai-
ba como utilizá-los devido a alguns retornos de métodos de manipulação de
bancos de dados serem genéricos. No decorrer dos demais exemplos diferentes
utilizações de tipos genéricos são apresentadas.
@Override
public void imprimirDocumentacao() {
System.out.println(this.cpf);
}
}
74 • capítulo 4
documentação. Para informar ao compilador que se trata de um método que
está sobrescrevendo outro já existente, é utilizada a anotação “@Override”.
CURIOSIDADE
É possível criar suas próprias anotações. Para isto, é necessário algum conhecimento da API
Reflection e de anotações Java. A real necessidade de se criar anotações também é fator
importante para se investir tempo nesta solução.
CURIOSIDADE
Em desenvolvimento de software, existem os requisitos funcionais e não funcionais.
Os requisitos funcionais são aqueles que fazem parte da sua aplicação, como um cadas-
tro de clientes, a geração de um relatório, entre outros.
Os requisitos não funcionais fazem parte da estrutura utilizada para o desenvolvimento,
como o acesso ao banco de dados, o gerenciamento das sessões, gerenciamento de requi-
sições HTTP, entre outros.
capítulo 4 • 75
• JavaServer Faces (JSF);
• Enterprise Java Beans (EJB);
• Java Persistence API (JPA);
• Java Message Service (JMS);
• Java Management Extensions (JMX);.
76 • capítulo 4
O mapeamento é feito para as classes do modelo do projeto e, se correta-
mente mapeadas, a manipulação dos dados fica transparente para o desenvol-
vedor (FARIA; NORMANDES JUNIOR, 2015).
Um diagrama do funcionamento dos ORMs é exibido na figura 4.1.
capítulo 4 • 77
• Alchemy;
• ADO.NET;
• OJB;
• NHibernate;
• Django.
O mapeamento no uso dos ORMs é parte fundamental, pois é este que garante
o bom funcionamento do sistema. Se uma camada de modelo de um sistema é
incorretamente mapeada, o sistema não funcionará de acordo.
O JPA é utilizado para fazer este mapeamento de forma generalizada para
diversos ORMs que suportam a especificação. Deste modo, seria simples ini-
ciar um projeto utilizando Hibernate e trocar o sistema de ORM para outro,
pois as anotações, que são parte vital da configuração do sistema, continuarão
em pleno funcionamento.
ATENÇÃO
É comum desenvolvedores inexperientes acreditarem que não é necessário conhecimento
em sistemas de bancos de dados para se utilizar ORM. Na verdade, o conhecimento deve ser
profundo, pois se trata de um mapeamento que não é trivial de ser realizado.
78 • capítulo 4
O JPA utiliza-se de anotações nas classes para que se identifique qual o
comportamento desejado para os atributos em relação ao banco de dados
da aplicação.
Algumas das anotações mais utilizadas do JPA são:
• @Entity: Define que uma classe é uma entidade (tabela);
• @Id: Define que um atributo identifica unicamente um registro na enti-
dade (chave primária);
• @Column: Identifica um atributo como sendo uma coluna na entidade;
• @Transient: Identifica que um atributo não é persistido em banco
de dados.
capítulo 4 • 79
@Entity
@Table(name = "registro_carros")
public class Carro implements Serializable {
@Id
private String placa;
@Column(name = "ano_fabricacao")
private int ano;
80 • capítulo 4
O mapeamento de relacionamentos vem acrescido de anotações como @
JoinTable ou @JoinColumn, que determinam propriedades sobre a chave es-
trangeira utilizada no relacionamento. Geralmente se faz a anotação em am-
bos os lados do relacionamento, como exemplificado nas listagens 4.4 e 4.5.
A figura 4.3 exibe o modelo das entidades “Funcionário” e “Setor” relacionadas.
@Entity
public class Funcionario implements Serializable {
@Id
private int codigo;
@Temporal(TemporalType.DATE)
@Column(name = "data_contrato")
private Date dataContrato;
@ManyToOne
@JoinColumn(name = "Setor_id")
private Setor setor;
Nota-se que na listagem 4.4 o atributo do tipo “Date” deve ser anotado de
modo diferente, inclusive informando qual o tipo de dado que será manipulado.
Na junção feita pelo relacionamento, é indicado que podem existir muitos
funcionários para um só setor, portanto, a coluna utilizada para isto é a chave
estrangeira “Setor_id”.
capítulo 4 • 81
@Entity
public class Setor implements Serializable {
@Id
private int id;
@OneToMany(mappedBy = "setor",
targetEntity = Funcionario.class)
private List<Funcionario> funcionarios;
CURIOSIDADE
Para a utilização de chaves primárias compostas a complexidade do mapeamento pode
aumentar, sendo necessária a utilização de uma classe apenas para implementar a cha-
ve primária.
Nota-se também que as classes, para serem utilizadas com ORM devem im-
plementar a interface “Serializable”, que permite a transmissão de objetos des-
construindo e reconstruindo os dados em diferentes locais.
A seguir é apresentada a continuação do exemplo de cadastro de clientes
apresentado no capítulo anterior, mas com o desenvolvimento da camada
de persistência.
82 • capítulo 4
4.6 JPA na prática
package br.com.alunosa.modelo;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Cliente implements Serializable {
@Id
private String documento;
private String nome;
private String endereco;
private String telefone;
capítulo 4 • 83
}
84 • capítulo 4
Figura 4.4 – Janela de seleção para criação da unidade de persistência.
Após feita a seleção, clicar em “Avançar” e outra tela irá aparecer (figura 4.5).
Nesta nova tela são definidos:
• O nome da unidade de persistência (entenda-se como uma conexão com
um banco de dados);
• A biblioteca ORM que será utilizada;
• A origem dos dados (a conexão com o banco de dados propriamente dita);
• Se utilizará transações em nível de aplicação;
• Se a tabela será gerada automaticamente seguindo a anotação efetuada.
capítulo 4 • 85
Figura 4.5 – Janela de criação da unidade de persistência e seus dados.
86 • capítulo 4
Figura 4.6 – Bibliotecas do Hibernate no projeto web.
O próximo passo deste exemplo é programar a classe DAO para que a persis-
tência do objeto ocorra no banco de dados. O primeiro método a ser programa-
do é o “salvar”.
O código-fonte do método “salvar” é exibido na listagem 4.7.
package br.com.alunosa.dao;
import br.com.alunosa.modelo.Cliente;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceException;
// MARCAÇÃO 1
EntityManagerFactory factory =
Persistence.createEntityManagerFactory("banco");
// MARCAÇÃO 2
EntityManager em = factory.createEntityManager();
capítulo 4 • 87
try {
// MARCAÇÃO 3
em.getTransaction().begin();
// MARCAÇÃO 4
em.persist(c);
// MARCAÇÃO 5
em.getTransaction().commit();
// MARCAÇÃO 6
em.close();
factory.close();
return true;
} catch (PersistenceException e) {
// MARCAÇÃO 7
e.getMessage();
em.close();
factory.close();
return false;
}
}
}
88 • capítulo 4
• Marcação 5: Executa um commit gravando de vez o objeto no banco;
• Marcação 6: Fecha o gerenciador de entidades e a fábrica de gerenciado-
res, após o método retorna verdadeiro;
• Marcação 7: Código que é executado caso ocorra um erro na persistência
do objeto, após retorna falso.
em.close();
factory.close();
return c;
…
LEITURA
Uma breve explicação sobre JPQL é dada por Sakurai (2011) em um artigo disponível
na internet.
capítulo 4 • 89
public List<Cliente> consultarLista() {
…
Query q = em.createQuery
("SELECT c FROM Cliente AS c");
List<Cliente> clientes = q.getResultList();
em.close();
factory.close();
return clientes;
…
ATIVIDADES
01. Quanto ao reuso de software, explique o porquê de se desenvolver e utilizar lis-
tas genéricas.
02. Antigamente o mapeamento era feito em arquivos XML, hoje em dia são utilizadas ano-
tações. Cite algumas vantagens de se utilizar a abordagem contemporânea.
03. Apesar de parecida com a linguagem SQL, a linguagem utilizada no JPA é outra. Qual é
esta linguagem e o que significa sua sigla?
REFLEXÃO
Neste capítulo foram abordados temas importantes para o desenvolvimento de sistemas
web, pois são técnicas e ferramentas muito utilizadas no mercado. Estima-se que 99% das
aplicações de grande porte em Java, hoje em dia, sejam desenvolvidas utilizando a JPA, pois
90 • capítulo 4
se trata de um recurso indispensável para aumento da produtividade e torna a manutenção
do código menos trabalhosa.
A abordagem prática utilizada no capítulo dá um início muito importante ao aluno, que é a
transição do conceito para o uso de recursos em tecnologia, pois muitas vezes esta transição
não é feita de forma clara, prejudicando a correta aplicação dos conceitos em sistemas.
LEITURA
O livro de faria e Normandes Junior (2015) possui uma abordagem completa do uso do JPA
e é uma ótima referência para que se possa criar consultas e comandos em JPQL. Altamente
recomendado para quem quer seguir no desenvolvimento web utilizando a JPA.
FARIA, Thiago; NORMANDES JUNIOR,. JPA e Hibernate. [s.i]: Algaworks, 2015. 176 p.
REFERÊNCIAS BIBLIOGRÁFICAS
CAELUM. Java para desenvolvimento web. Disponível em: <https://www.caelum.com.br/apostila-
java-web/>. Acesso em: 13 mar. 2016.
DEITEL, Paul; DEITEL, Harvey. Java: Como Programar. 8. ed. São Paulo: Pearson, 2010.
FARIA, Thiago; NORMANDES JUNIOR,. JPA e Hibernate. [s.i]: Algaworks, 2015. 176 p.
LANHELLAS, Ronaldo. Como criar Anotações em Java. 2015. Disponível em: <http://www.
devmedia.com.br/como-criar-anotacoes-em-java/32461>. Acesso em: 17 mar. 2016.
SAKURAI, Rafael Guimarães. JPA - Examinar a linguagem de consulta do Java Persistence API
(JPQL). 2011. Disponível em: <http://www.universidadejava.com.br/materiais/jpa-jpql/>. Acesso em:
15 mar. 2016.
capítulo 4 • 91
92 • capítulo 4
5
Objetos
Distribuídos, MDB e
Web Services
5. Objetos distribuídos, MDB e Web Services
Este é o último capítulo deste livro e aborda tecnologias mais avançadas para o
desenvolvimento de sistemas. Estas tecnologias são utilizadas em paradigmas
próprios de desenvolvimento de software e não são aplicáveis a todos os tipos
de sistemas a serem desenvolvidos.
O foco principal deste capítulo é a troca de mensagens entre aplicações ou
mesmo dentro da mesma aplicação. Para isto, uma breve explicação de tecno-
logias como MDB, JMS e EJB é dada no início.
O tema web services toma conta de grande parte do capítulo por se tratar
de uma tecnologia imprescindível para o desenvolvimento no lado servidor de
sistemas web, além de amplamente utilizada no mercado.
Uma introdução dos conceitos que cercam o mundo dos serviços web é
acompanhada de exemplos práticos de criação e consumo destes serviços no
lado servidor da aplicação.
A aplicação prática destes conceitos é essencial pois se tratam de conceitos que
não são fáceis de se utilizar na prática, embora o conceito não seja tão complexo.
Muitos serviços web são consumidos pelo lado cliente das aplicações, in-
clusive utilizando-se de tecnologias como AJAX, jQuery, entre outras, mas isto é
abordado na disciplina de programação cliente em sistemas web.
OBJETIVOS
Ao final deste capítulo o aluno conhecerá as tecnologias necessárias para se desenvolver
sistemas corporativos além de aprender a desenvolver e consumir web services, que são
parte essencial no desenvolvimento de sistemas web.
94 • capítulo 5
De acordo com Panda et al. (2014) o EJB serve como modelo para criação de
componentes de software que abstraem diversos problemas comuns em desen-
volvimento do lado servidor das aplicações.
O uso de EJB é encorajado para o desenvolvimento de aplicações distribuídas
por uma série de motivos, alguns deles, de acordo com Panda et al. (2014), são:
• Facilidade de uso;
• Muitas soluções já estão prontas e completas;
• Padrão aberto do Java EE;
• Suporte amplo de diversas entidades;
• Suporte robusto a clustering, balanceamento de carga e controle e trata-
mento de erros;
• Performance e escalabilidade.
Os session beans são invocados por um cliente para executar operações como
a checagem de dados sobre cartão de crédito de um usuário (PANDA et al., 2014).
As session beans podem ser de dois tipos, de acordo com Sierra e Bates (2003):
• Stateful;
• Stateless.
LEITURA
O livro da série use a cabeça sobre EJB, escrito por Sierra e Bates (2003), traz uma abor-
dagem didática sobre o uso de EJBs, oferecendo também exemplos práticos. Sua leitura é
altamente recomendada para quem pretende desenvolver sistemas corporativos utilizando a
tecnologia Java.
capítulo 5 • 95
Para a configuração de EJBs são utilizadas anotações, assim como em mui-
tas outras tecnologias baseadas na linguagem Java. Um exemplo básico de EJB
é apresentado na listagem 5.1.
import javax.ejb.Stateless;
@Stateless
public class OlaUsuarioBean implements OlaUsuario {
public String FalarOla(String nome) {
return “Olá ” + nome + “!”;
}
}
No exemplo da listagem 5.1 um EJA é criado para falar olá a um usuário cujo
nome é parâmetro do método, observe que este EJB é stateless, portanto não
guarda seu estado dentre as chamadas.
A figura 5.1, adaptada de Panda et al. (2014), demonstra como é simples se
construir um EJB, que tornará o objeto em questão distribuído para clientes
na rede.
Figura 5.1 – Esquema simples para a criação de um EJB, adaptado de Panda et al. (2014).
96 • capítulo 5
CONCEITO
Em termos simples, processamento assíncrono não deixa o sistema ou o usuário esperando
uma tarefa terminar para que se continue operando, a tarefa geralmente é executada em
outro thread. Um exemplo de processamento assíncrono é AJAX, abordado na disciplina de
programação cliente para sistemas web.
Uma analogia feita por Panda et al. (2014) diz que o JMS é para mensagens
como o JDBC é para o banco de dados, sendo uma alternativa generalizada para
acesso a outras APIs específicas.
O conteúdo de uma mensagem JMS é apresentado na figura 5.2.
Figura 5.2 – Conteúdo de uma mensagem JMS, adaptado de Panda et al. (2014).
capítulo 5 • 97
LEITURA
O livro de Panda et al. (2014) traz exemplos práticos de uso de MDB, com códigos de sim-
ples entendimento.
CURIOSIDADE
Além do XML, o uso de JSON (JavaScript Simple Object Notation) também é comum em
web services, por se tratar de uma linguagem de descrição de objetos que também é inde-
pendente de plataforma.
98 • capítulo 5
CURIOSIDADE
Uma arquitetura também muito utilizada para implementação de serviços web é a REST
(Representational State Transfer), que não é um padrão mas utiliza-se de padrões de desen-
volvimento web (DEITEL; DEITEL, 2010).
Tabela 5.1 – Dados para criação do projeto web para criação de web service.
capítulo 5 • 99
deve-se selecionar no lado esquerdo “Web Services” e após, no lado direito,
“Web Service”. Depois de selecionado, clicar em “Próximo”.
Figura 5.3 – janela de seleção para criação de web service no projeto web com NetBeans.
100 • capítulo 5
O web service, neste momento, encontra-se criado no projeto. A figura 5.5
exibe a estrutura do projeto logo após a criação do web service.
Figura 5.5 – Estrutura do projeto WSTeste logo após a criação do web service.
// Marcação 1
package br.com.alunosa;
// Marcação 2
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
// Marcação 3
@WebService(serviceName = "ImprimirFrase")
capítulo 5 • 101
public class ImprimirFrase {
// Marcação 4
@WebMethod(operationName = "hello")
//Marcação 5
public String hello(@WebParam(name = "name") String txt) {
// Marcação 6
return "Hello " + txt + " !";
}
}
102 • capítulo 5
Agora analisemos o web service criado para a aplicação WSTeste. Para aces-
sar o web service, clicar no botão “Executar Projeto” e o navegador abrirá a pági-
na inicial (index.jsp) criada automaticamente pelo NetBeans.
A partir da raiz do projeto, colocar o nome do web service para que se possa
acessar as informações. Se a configuração foi deixada a padrão, o endereço de
acesso é: http://localhost:8080/WSTeste/ImprimirFrase.
O resultado do acesso às informações do web service devem ser semelhan-
tes às da figura 5.6.
Figura 5.6 – Estrutura do projeto WSTeste logo após a criação do web service.
capítulo 5 • 103
Figura 5.7 – Estrutura do projeto WSTeste logo após a criação do web service.
104 • capítulo 5
ATENÇÃO
Como a utilização de web services cresceu muito nos últimos anos, é necessária uma aten-
ção especial em métodos utilizados que garantam a segurança na utilização destes recursos
(NAGAPPAN; SKOCZYLAS; SRIGANESH, 2003).
O web service foi criado e pode ser acessado remotamente, isto já foi verificado
anteriormente. Porém, como utilizar a funcionalidade que é servida por ele é
tema desta seção.
Para criarmos um cliente para o web service, devemos clicar com o botão
direito no projeto, clicar em “Novo” e depois em “Outro”. A janela da figura 5.8
irá aparecer e então são selecionados na esquerda “Web Services” e na direita
“Cliente para web service”.
Figura 5.8 – Janela de seleção para criação de um cliente para web service.
capítulo 5 • 105
Após a seleção, clicar em “Próximo”. A tela mudará para uma semelhante à
da figura 5.9. Deixar selecionado em “Projeto” e clicar em “Procurar...”
Figura 5.9 – Tela de criação do cliente para web service sem os dados.
Quando o botão “Procurar...” é clicado, uma nova janela aparece (figura 5.9).
Nesta janela deve ser selecionado o web service do projeto para o qual quer se
criar um cliente.
Figura 5.10 – janela de seleção do web service para o qual se quer criar o cliente.
106 • capítulo 5
Após a seleção do web service, clicar em “OK”. Automaticamente o endereço
da descrição do web service (WSDL) é atribuído. Pode-se verificar na figura 5.11
as propriedades necessárias para a criação do cliente para o web service. Não se
pode esquecer de selecionar um pacote diferente daquele criado anteriormen-
te para evitar conflitos. Ao final, clicar em “Finalizar”.
Figura 5.11 – Tela de criação do cliente para web service com os dados preenchidos.
capítulo 5 • 107
Figura 5.12 – Estrutura do projeto após a criação do cliente para o web service
“ImprimirFrase”.
Neste momento o cliente para consumo do web service está criado, agora é
só utilizar o recurso programado. Neste exemplo, o recurso é consumido pela
própria aplicação por meio de uma página JSP.
Deve-se excluir a página “index.html” caso tenha sido automaticamente
criada pelo NetBeans e posteriormente criar uma página chamada “index.jsp”
na raiz da pasta “Páginas Web”.
A página JSP foi escolhida para consumir o web service, pois assim é pos-
sível mostrar o seu resultado na página, verificando se o seu funcionamento
está correto.
108 • capítulo 5
O código da página JSP utilizada para consumir o web service e exibir o seu
resultado é apresentado na listagem 5.13.
Listagem 5.4 – Código completo da página JSP (index.jsp) que consome o web service e
exibe o resultado.
capítulo 5 • 109
A explicação do código da listagem 5.4 por meio de suas marcações é:
• Marcação 1: neste trecho de código ocorre a importação das classes que
serão utilizadas para o consumo do web service;
• Marcação 2: esta linha de comando instancia um serviço da classe
“ImprimirFrase_Service”, que posteriormente é utilizado para retornar a porta
de conexão para que o web service seja consumido;
• Marcação 3: neste comando o serviço retorna uma porta de conexão com
o web service para que a interface “ImprimirFrase” possa chamar o método
“hello” que aceita chamada remota;
• Marcação 4: aqui o método “hello” é invocado e o parâmetro é passado
para que seja processado pelo web service e gere uma resposta que é atribuída
a uma variável do tipo String chamada “frase”;
• Marcação 5: neste momento o resultado do web service é apresentado ao
usuário que acessou a página JSP.
Figura 5.13 – Resultado do consumo do web service com o parâmetro “João Paulo” exibido
para o usuário por meio de uma página JSP.
110 • capítulo 5
Com este exemplo é encerrado o tema de web services e também este livro.
Lembre-se que é importante executar os exemplos apresentados e se possível
a partir deles construir aplicações cada vez mais complexas, o que é um ótimo
método de aprendizado, além de se adquirir experiência com o desenvolvimen-
to de sistemas web.
CURIOSIDADE
Muitos sistemas web disponibilizam serviços para que sejam consumidos por aplica-
ções que rodam em dispositivos móveis, deste modo, as funcionalidades não precisam
ser redesenvolvidas.
ATIVIDADES
01. Qual o componente utilizado para a criação de objetos distribuídos em sistemas corpo-
rativos utilizando a tecnologia Java?
03. O NetBeans facilita o desenvolvimento de web services, assim como o consumo, inclu-
sive gerando o arquivo WDSL do web service construído. Qual o nome do repositório no qual
pode-se armazenar descrições de web services (WSDL) a fim de disponibilizá-lo para uso?
REFLEXÃO
Caro aluno,
Chegamos ao fim desta agradável disciplina. Eu digo agradável, pois par a maioria das
pessoas é muito mais interessante estudar algo concreto e que se pode utilizar diretamente
no trabalho ou no dia-a-dia, e este é o caso da programação para servidor em sistemas web.
Neste último capítulo foram abordados alguns temas mais avançados e muito interes-
santes, destaco entre eles os web services, que são uma realidade no desenvolvimento de
sistemas para web, inclusive muitos sistemas são desenvolvidos inteiramente em cima de
serviços, seguindo a arquitetura SOA (Service Oriented Architecture).
capítulo 5 • 111
Espero que o aproveitamento dos conceitos e práticas apresentados neste livro tenham
sido satisfatórios e principalmente, tenham incentivado o constante estudo que é necessário
para quem vai atuar na área de desenvolvimento de sistemas, pois bibliotecas, tecnologias e
procedimentos estão em constante atualização, e esta atualização é rápida!
LEITURA
Para complementar os estudos deste capítulo e de muitos outros, o livro de Deitel e Deitel
(2010) intitulado “Java: Como Programar” serve de referência para o desenvolvimento de
aplicações em Java. Mesmo sem ser focado em desenvolvimento para a internet, seu vasto
conteúdo (incluindo web services) oferece uma grande fonte de consulta para desenvolve-
dores Java.
DEITEL, Paul; DEITEL, Harvey. Java: Como Programar. 8. ed. São Paulo: Pearson, 2010.
Outra recomendação, para quem quer se aprofundar no tema EJB, é o livro da série Use
a Cabeça! Intitulado EJB e escrito por Sierra e Bates (2003) traz uma abordagem didática
para o uso desta tecnologia. Ainda não existe uma versão em português, mas para quem
entende um pouco de inglês vale a pena a leitura.
SIERRA, Kathy; BATES, Bert. Head First EJB. [s.i.]: O'reilly, 2003. 734 p.
REFERÊNCIAS BIBLIOGRÁFICAS
DEITEL, Paul; DEITEL, Harvey. Java: Como Programar. 8. ed. São Paulo: Pearson, 2010.
NAGAPPAN, Ramesh; SKOCZYLAS, Robert; SRIGANESH, Rima Patel. Developing Java Web
Services. Indianapolis: John Wiley & Sons, 2003. 758 p.
ORACLE. The Java EE 6 Tutorial. Disponível em: <http://docs.oracle.com/javaee/6/tutorial/doc/
gipko.html>. Acesso em: 16 mar. 2016.
PANDA, Debu et al. EJB 3 in action. 2. ed. Shelter Island: Manning, 2014.
SHKLAR, Leon; ROSEN, Richard. Web Application Architecture: Principles, Protocols and Practices.
Chichester: John Wiley & Sons, 2003.
SIERRA, Kathy; BATES, Bert. Head First EJB. [s.i.]: O'reilly, 2003. 734 p.
112 • capítulo 5
ANOTAÇÕES
capítulo 5 • 113
ANOTAÇÕES
114 • capítulo 5
ANOTAÇÕES
capítulo 5 • 115
ANOTAÇÕES
116 • capítulo 5
ANOTAÇÕES
capítulo 5 • 117
ANOTAÇÕES
118 • capítulo 5
ANOTAÇÕES
capítulo 5 • 119
ANOTAÇÕES
120 • capítulo 5