Criando um aplicação simples com JAVA e MySQL usando NetBeans Parte III
Criando um aplicação simples com JAVA e MySQL usando NetBeans Parte III
Contato: jose.goncalo.santos@gmail.com
De posse de todas essas ferramentas, vamos testar o nosso servidor web para
verificar se está tudo funcionando corretamente . Para tanto, siga os passos
abaixo:
Passo 2 – Dentro da pasta “webapps” crie uma pasta chamada teste (este será
o seu site).
Passo 3 – Dentro do seu site (teste), crie a pasta WEB-INF (tem que ser em
maiúscula, do jeito que está escrito aqui).
Obs.: Toda vez que você colocar uma classe (.class) novo no seu site, é
necessário recarregá-lo (reload).
Agora que temos certeza de que o nosso servidor está funcionando, vamos
criar o nosso banco de dados. Neste banco colocaremos apenas duas tabelas,
por questões didáticas. Se você não tem familiaridade com banco de dados,
aconselho fazer um curso, recomendo o curso da pusivus
(http://www.pusivus.com.br).
Crie um banco chamado tutorial e crie as tabelas abaixo (você pode rodar o
script apresentado em azul, logo abaixo do código das tabelas):
/*!40101 SET
@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET
@OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET
@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Create schema tutorial
--
--
-- Table structure for table `tutorial`.`carro`
--
--
-- Dumping data for table `tutorial`.`carro`
--
--
-- Table structure for table `tutorial`.`proprietario`
--
--
-- Dumping data for table `tutorial`.`proprietario`
--
Se você ainda não baixou o conector (driver) do MySQL, faça agora, acesse:
http://dev.mysql.com/downloads/connector/j/
Obs.: neste tutorial o projeto para a criação das classes será separado do
projeto web, tudo por uma questão de escolha.
Para esta etapa é necessário que você já tenha o netbeans instalado na sua
máquina.
Primeiro passo: Acesse o netbeans (iniciar->netbeans->netbeans 6.x.x). Você
verá uma janela semelhante à apresentada na figura abaixo.
Segundo passo: criar um novo projeto. Para isso, click no ícone mostrado na
figura abaixo.
8. Criando o pacote
Primeiro passo: click com o botão direito do mouse sobre a pasta “Bibliotecas”
e selecione a opção “Adcionar JAR/pasta”. Quando aparecer uma nova janela,
navegue por ela até localizar o conector, conforme mostra a figura abaixo.
Pronto! Você agora tem um pacote para trabalhar e já tem o conector para o
banco de dados, conforme mostra a figura abaixo.
Primeiro passo: criação da classe Conexao. Para isso, click com o botão direito
sobre o pacote criado anteriormente, quando uma nova janela aparecer (figura
abaixo), coloque o nome Conexao e click em finalizar.
import java.sql.*;
try {
Agora precisamos registrar o driver, ou seja, precisamos dizer para o Java que
esse é o driver que iremos usar para as conexões.
Class.forName("com.mysql.jdbc.Driver").newInstance();
Obs.: Não pode haver espaço algum entre esses componentes do parâmetro.
Bom, já que temos a nossa String de conexão montada, vamos fazer a nossa
conexão e passar o valor para a nossa variável criada no início do método.
con = DriverManager.getConnection(url);
Se a conexão for realizada com sucesso, podemos avisar usuário que essa foi
estabelecida.
System.out.println("Conexão aberta.");
Como nós abrimos um bloco try, devemos ter pelo menos um catch ou
finally para finaliza-lo, no nosso caso teremos 3 catchs, um para
SQLException (exceções que podem ocorrer durante a conexão com o
banco), outra para ClassNotFoundException (exceção que pode ocorrer
durante o processo de registro do driver) e outra para Exception (exceções
quaisquer que possam ocorrer).
} catch (SQLException e) {
System.out.println(e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
}
return con;
try {
con.close();
Depois da conexão fechada vamos dar um aviso ao usuário de que essa
(conexão) foi fechada.
System.out.println("Conexão fechada.");
Como nós abrimos um bloco try, devemos ter pelo menos um catch ou
finally para finaliza-lo, no nosso caso teremos 2 catchs, um para
SQLException (exceções que podem ocorrer durante a conexão com o
banco) e outra para Exception (exceções quaisquer que possam ocorrer).
} catch (SQLException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
}
Segundo passo: criação da classe CarroBean. Para isso, click com o botão
direito sobre o pacote criado anteriormente, quando uma nova janela aparecer
(figura abaixo), coloque o nome CarroBean e click em finalizar.
Terceiro passo: Criação da classe CarroDAO. Para isso, click com o botão
direito sobre o pacote criado anteriormente, quando uma nova janela aparecer
(figura abaixo), coloque o nome CarroDAO e click em finalizar.
import java.sql.*;
import java.util.*;
Vamos criar agora o construtor da classe que receberá como argumento uma
conexão e a passará ao nosso atributo con.
Podemos, então criar os métodos get e set para o nosso atributo con.
Bom, agora que temos a nossa classe base, podemos criar os métodos CRUD.
Começaremos com o método de inserção (inserir).
Vamos criar a assinatura do método, que tem como retorno uma String para
avisar ao usuário se tudo ocorreu bem ou se deu algum erro.
Ainda dentro do método (inserir), vamos abrir um bloco try colocar o código
para enviar dados para o banco. Esse tratamento de exceção é necessário
porque pode ocorrer a seguinte exceção: SQLException.
try {
Agora precisamos preparar o nosso comando para enviar ao banco. Para isso
usaremos a interface PreparedStatement.
PreparedStatement ps = getCon().prepareStatement(sql);
ps.setString(1, carro.getPlaca());
ps.setInt(2, carro.getCodigo());
ps.setString(3, carro.getCor());
ps.setString(4, carro.getDescricao());
Feito isso vamos efetivar a inserção no banco, para isso podemos usar o
método execute (retorna um boolean ) ou executeUpdate (retorna um
inteiro com o número de linhas afetadas pela operação), vamos usar o
segundo.
if (ps.executeUpdate() > 0) {
return "Inserido com sucesso.";
} else {
return "Erro ao inserir";
}
Como nós abrimos um bloco try, devemos ter pelo menos um catch ou
finally para finalizá-lo, no nosso caso teremos 1 catch para
SQLException (exceções que podem ocorrer durante a conexão com o
banco).
} catch (SQLException e) {
return e.getMessage();
}
ps.setInt(1, carro.getCodigo());
ps.setString(2, carro.getCor());
ps.setString(3, carro.getDescricao());
ps.setString(4, carro.getPlaca());
if (ps.executeUpdate() > 0) {
return "Alterado com sucesso.";
} else {
return "Erro ao alterar";
}
} catch (SQLException e) {
return e.getMessage();
}
}
try {
PreparedStatement ps =
getCon().prepareStatement(sql);
ps.setString(1, carro.getPlaca());
if (ps.executeUpdate() > 0) {
return "Excluído com sucesso.";
} else {
return "Erro ao excluir";
}
} catch (SQLException e) {
return e.getMessage();
}
}
Precisamos criar um método que retorne uma coleção de objetos, pois ele irá
ao banco e trará todos os dados que se encontram na tabela carro. Para isso
usaremos uma implementação da interface List, a ArrayList. A escolha por
Como vamos listar todas as linhas da tabela, a nossa String SQL fica bem
simples.
Vamos criar uma lista de carros para armazenar os objetos carros que
retornarão da nossa consulta.
try {
PreparedStatement ps =
getCon().prepareStatement(sql);
ResultSet rs = ps.executeQuery();
Um objeto ResultSet tem acesso ao método next que permite percorrer todos
os dados nele contido. Porém, se a consulta não retornar dados e tentarmos
usá-lo, pode ocorrer uma exceção, por isso é necessário fazer essa verificação
antes.
if (rs != null) {
while (rs.next()) {
CarroBean cb = new CarroBean();
cb.setPlaca(rs.getString(1));
cb.setCodigo(rs.getInt(2));
cb.setCor(rs.getString(3));
cb.setDescricao(rs.getString(4));
listaCarro.add(cb);
}
return listaCarro;
package br.com.tutorial;
import java.sql.*;
import java.util.List;
pb.setNome("Maria");
pb.setCidade("Brasília");*/
//Testando Exclusão
//Testando pesquisa
List<ProprietarioBean> lp = pd.listarTodos();
for(ProprietarioBean p : lp){
System.out.println("Codigo: "+p.getCodigo());
System.out.println("Nome: "+p.getNome());
System.out.println("Cidade: "+p.getCidade());
}
}
}
package br.com.tutorial;
package br.com.tutorial;
import java.sql.*;
import java.util.*;
try {
PreparedStatement ps =
getCon().prepareStatement(sql);
ps.setString(1, proprietario.getNome());
ps.setString(2, proprietario.getCidade());
if (ps.executeUpdate() > 0) {
return "Inserido com sucesso.";
} else {
return "Erro ao inserir";
}
} catch (SQLException e) {
return e.getMessage();
}
}
try {
PreparedStatement ps =
getCon().prepareStatement(sql);
ps.setString(1, proprietario.getNome());
ps.setString(2, proprietario.getCidade());
ps.setInt(3, proprietario.getCodigo());
if (ps.executeUpdate() > 0) {
return "Alterado com sucesso.";
} else {
return "Erro ao alterar";
}
} catch (SQLException e) {
return e.getMessage();
}
}
try {
PreparedStatement ps =
getCon().prepareStatement(sql);
ps.setInt(1, proprietario.getCodigo());
if (ps.executeUpdate() > 0) {
return "Excluído com sucesso.";
} else {
return "Erro ao excluir";
}
} catch (SQLException e) {
return e.getMessage();
}
}
ResultSet rs = ps.executeQuery();
if (rs != null) {
while (rs.next()) {
ProprietarioBean pb = new
ProprietarioBean();
pb.setCodigo(rs.getInt(1));
pb.setNome(rs.getString(2));
pb.setCidade(rs.getString(3));
listaCarro.add(pb);
}
return listaCarro;
} else {
return null;
}
} catch (SQLException e) {
return null;
}
}
public Connection getCon() {
return con;
}
package br.com.tutorial;
import java.sql.*;
import java.util.*;
try {
PreparedStatement ps =
getCon().prepareStatement(sql);
ps.setString(1, carro.getPlaca());
ps.setInt(2, carro.getCodigo());
ps.setString(3, carro.getCor());
ps.setString(4, carro.getDescricao());
if (ps.executeUpdate() > 0) {
return "Inserido com sucesso.";
} else {
return "Erro ao inserir";
}
} catch (SQLException e) {
return e.getMessage();
}
}
try {
PreparedStatement ps =
getCon().prepareStatement(sql);
ps.setInt(1, carro.getCodigo());
ps.setString(2, carro.getCor());
ps.setString(3, carro.getDescricao());
ps.setString(4, carro.getPlaca());
try {
PreparedStatement ps =
getCon().prepareStatement(sql);
ps.setString(1, carro.getPlaca());
if (ps.executeUpdate() > 0) {
return "Excluído com sucesso.";
} else {
return "Erro ao excluir";
}
} catch (SQLException e) {
return e.getMessage();
}
}
ResultSet rs = ps.executeQuery();
if (rs != null) {
while (rs.next()) {
CarroBean cb = new CarroBean();
cb.setPlaca(rs.getString(1));
cb.setCodigo(rs.getInt(2));
cb.setCor(rs.getString(3));
cb.setDescricao(rs.getString(4));
listaCarro.add(cb);
}
} catch (SQLException e) {
return null;
}
}
package br.com.tutorial;
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "";
url += "jdbc:mysql://127.0.0.1/tutorial?";
url += "user=root&password=123";
con = DriverManager.getConnection(url);
System.out.println("Conexão aberta.");
} catch (SQLException e) {
System.out.println(e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
}
return con;
}
Com isso temos todas as classes necessárias, só nos resta fazer um teste para
ver se estão funcionando realmente. Para verificar se as classes estão
executando corretamente, crie uma classe chamada Teste e faça um teste de
todas as operações.
Pode parecer estranho, mas já tive que fazer manutenção em sistemas (em
uso em empresa de grande porte) feitos de forma muito mais amadora do que
o que estamos fazendo aqui. Bom, chega de conversa, vamos em frente.
Para criação do projeto web siga as orientações abaixo. Não rode o projeto
diretamente no netbeans, use o browser, como é mostrado neste tutorial.
Segundo passo: quando a nova janela aparecer, selecione o tomcat que estiver
instalado na sua máquina, figura abaixo. Click em próximo (next).
Até o momento temos nossas classes e nosso projeto web, o que precisamos
agora é fazer com que eles se conheçam. Por padrão o tomcat procura nossos
recursos (.class) em uma pasta chamada classes, que fica dentro da pasta
WEB-INF (que deve estar na raiz do nosso projeto), pois bem, como você
observa na figura acima, existe uma pasta WEB-INF, porém, ela não está na
raiz do projeto, por isso, precisamos criar tal pasta para colocarmos nossos
recursos nela. Siga os passos abaixo para executar esta tarefa.
Terceiro passo: copie a pasta classes para dentro da pasta WEB-INF (criada
no passo anterior), que se encontra na pasta build (C:\tutorial\tutorial\build) do
projeto criado no tópico 7 deste tutorial, veja figura abaixo.
Obs.:
1 - o netbeans cria uma pasta chamada src para guardar os arquivos .java e
outra chamada build para guardar os arquivos .class. Porém, a pasta bluid só é
criada quando compilamos e rodamos uma classe no nosso projeto. Por isso, é
importante que você crie a classe Teste (com o método main) para testar as
classes, pois além de, com o teste, termos certeza de que as nossas classes
estão funcionando direito, criamos, de fato, as nossas ".class", que são as que
nos interessa. Veja nas duas figuras a seguir, os nossos arquivos.
Finalmente, estamos prontos para criar a interface web para nossas classes.
Vamos criar quatro páginas web, duas para o formulário de entrada de dados
de proprietário e carro e duas para executar as operações CRUD1.
Primeiro passo: com o botão direito do mouse sobre a pasta "Páginas Web"
click em novo -> JSP, a figura abaixo irá aparecer. Coloque o nome de
proprietario e click em finalizar.
1
CRUD signifca Create (criar) Retrieve (recuperar) Update (atualizar) Delete (excluir). Basicamente
corresponde a Insert, Select , Update e Delete no banco.
Essa é a forma de fazer a importação dos pacotes para uma página JSP. Não
se preocupe com os erros apontados pelo netbeans, pois ele não sabe onde
está o nosso pacote, mas o tomcat sabe, pois contamos só para e é isso que
nos interessa.
<%
//Criando um objeto de conexão
Connection con = Conexao.abrirConexao();
//Exibindo o objeto no browser
out.print(con);
//Fechando a conexão
Conexao.fecharConexao(con);
%>
Nota: os comandos JSP devem ser colocados dentro de scriptlets (<% %>). Os
demais elementos são mostrados na tabela abaixo. Reforço que este não é um
curso de JSP e sim um tutorial usando tal linguagem, portanto, não explicarei
detalhe da linguagem.
Elementos do JSP
As páginas JSPs podem conter uma série de elementos, dos quais merecem
destaques:
Segundo passo: agora vamos cria o formulário propriamente dito. Para isso,
você pode usar os recursos visuais do netbeans, selecione o meu janela ->
paleta ou Ctrl+Shift+8, com isso surgirá a paleta com os componentes
conforme mostra a figura abaixo.
Terceiro passo: monte seu formulário como mostra a figura abaixo e o código a
seguir.
<body>
<script language="javascript">
//Função para limpar os campos do formulário
function limpar(){
with(document.form1){
codigo.value = '';
nome.value = '';
cidade.value = '';
}
}
</script>
<%
//Criação das variáveis para receber os dados
para preencher o formulário após a pesquisa
//Para cada parâmetro passado é feito um teste
para verificar se esse veio nulo, se veio nulo,
//é atribuído valor em branco.
String codigo =
((request.getParameter("codigo") != null) ?
(request.getParameter("codigo")) : "0");
String nome = ((request.getParameter("nome")
!= null) ? (request.getParameter("nome")) : "");
String cidade =
((request.getParameter("cidade") != null) ?
(request.getParameter("cidade")) : "");
%>
b) Na segunda parte (<% %>) temos os comandos jsp para teste e atribuição de
valores. Para passarmos valores de um formulário a outro, precisamos usar o
método getParameter que retorna uma String, por isso temos que
trabalhar sempre com variáveis do tipo String. Mas, como faremos para
mandar um valor inteiro ou em ponto flutuante para o banco? Devemos
converter a String para o tipo desejado.
Como se pode notar, o uso do operador ternário torna nosso código mais
compacto. Porém, se você não se sente à vontade com ele, pode usar a outra
maneira de fazer os testes. Cabe a mesma explicação para as linhas
seguintes, exceto pelo fato de colocarmos vazio (porque correspondem a uma
campo String em nossa classe) em vez de zero, quando o parâmetro vem
nulo.
Em relação aos botões, quatro deles tem o mesmo nome, pois é necessário
para garantirmos que apenas um componente submeterá o formulário. O que
diferencia um do outro é o seu valor, por exemplo, quando o usuário clica em
"Excluir", saberemos a sua intenção devido ao valor do botão, ou seja, um
botão com mesmo nome pode ter valores diferentes.
<%@page import="br.com.tutorial.*,java.sql.*,java.util.*"
%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Operações no banco de dados</title>
</head>
<body>
<%
//Criação das variáveis para receber os dados
para preencher o formulário após a pesquisa
//Para cada parâmetro passado é feito um teste
para verificar se esse veio nulo, se veio nulo,
//é atribuído valor em branco.
String codigo =
((request.getParameter("codigo") != null) ?
(request.getParameter("codigo")) : "0");
pb.setNome(nome);
pb.setCidade(cidade);
<%
int x = 1;
String cor = "#FFFFFF";
for (ProprietarioBean p : lp) {
if (x % 2 == 0) {
cor = "#999999";
} else {
cor = "#FFFFFF";
}
%>
<tr bgcolor="<%=cor%>">
<td><a
href="proprietario.jsp?codigo=<%=p.getCodigo()%>&nome=<%=p.
getNome()%>&cidade=<%=p.getCidade()%>"><%=p.getCodigo()%></
a></td>
<td><%=p.getNome()%></td>
<td><%=p.getCidade()%></td>
</tr>
<% x++;
}%>
<%}
Conexao.fecharConexao(con);
%>
</body>
</html>
Vamos fazer uma análise dos pontos mais importantes desse código. Na linha
abaixo estamos importando todos os pacotes necessário para executarmos as
operações. Note que precisamos importar 3 pacotes, o que contém as nossas
classes, o que contém as classes para comandos SQL e o que contém as
if(!codigo.equals("")){
pb.setCodigo(Integer.parseInt(codigo));
}else{
pb.setCodigo(0);
}
pb.setNome(nome);
pb.setCidade(cidade);
No trecho abaixo criamos uma tabela com borda zero e criamos o cabeçalho
dela (um linha com 3 colunas) com os valores que não serão repetidos. As
demais linhas serão inseridas dinamicamente dependendo da quantidade de
linhas que virão do banco.
<table border="0">
<tr bgcolor="#f2f2f2">
<td>
Código
</td>
<td>
Nome
</td>
<td>
Cidade
</td>
</tr>
List<ProprietarioBean> lp = pd.listarTodos();
int x = 1;
String cor = "#FFFFFF";
for (ProprietarioBean p : lp) {
if (x % 2 == 0) {
cor = "#999999";
} else {
<tr bgcolor="<%=cor%>">
<td><a
href="proprietario.jsp?codigo=<%=p.getCodigo()%>&nome=<%=p.getNome()%>
&cidade=<%=p.getCidade()%>"><%=p.getCodigo()%></a></td>
<td><%=p.getNome()%></td>
<td><%=p.getCidade()%></td>
</tr>
<% x++;
}%>
<%}%>
Bom, agora vamos ver esse código em ação, faremos uma inclusão, uma
alteração e uma exclusão e, é claro que teremos que fazer pesquisa para
executas as operações de alteração e exclusão.
<tr>
<td>Proprietário</td>
<td>
<%
List<ProprietarioBean> listap = pd.listarTodos();
%>
<select name="codigo">
<option value="<%=codigo%>"><%=nome%></option>
<%
for(ProprietarioBean pb : listap){
%>
<option value="<%=pb.getCodigo()%>"><%=pb.getNome()%></option>
<%}%>
</select>
</td>
</tr>
<%@page import="br.com.tutorial.*,java.sql.*,java.util.*"
%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Operações no banco de dados</title>
</head>
<body>
<%
//Criação das variáveis para receber os dados
para preencher o formulário após a pesquisa
//Para cada parâmetro passado é feito um teste
para verificar se esse veio nulo, se veio nulo,
//é atribuído valor em branco.
String codigo =
((request.getParameter("codigo") != null) ?
(request.getParameter("codigo")) : "0");
String placa = ((request.getParameter("placa")
!= null) ? (request.getParameter("placa")) : "");
cb.setPlaca(placa);
cb.setCor(cor);
cb.setDescricao(descricao);
<%
int x = 1;
String corLinha = "#FFFFFF";
for (CarroBean c : lc) {
if (x % 2 == 0) {
corLinha = "#999999";
} else {
corLinha = "#FFFFFF";
}
%>
<tr bgcolor="<%=corLinha%>">
<td><a
href="carro.jsp?codigo=<%=c.getCodigo()%>&cor=<%=c.getCor()
%>&descricao=<%=c.getDescricao()%>&placa=<%=c.getPlaca()%>"
><%=c.getPlaca()%></a></td>
<td><%=c.getCor()%></td>
<td><%=c.getDescricao()%></td>
</tr>
<% x++;
}%>
<%}
Conexao.fecharConexao(con);
%>
</body>
</html>