Você está na página 1de 74

JSP e bancos de dados:

MVC e Javabeans
JSP e bancos de dados: MVC e
Javabeans

Tecnologia em Análise e Desenvolvimento de


Sistemas
4º Semestre
Aplicações para Web
Prof. Cid R. Andrade
Visão Geral
MVC

Imagem de Fabio Potencier, encontrada em


<http://www.symfony-
project.org/jobeet/1_2/Propel/en/04>
Caso de aplicação
Criar banco de dados

Caso a aba de serviços não esteja visível, habilite-a


no menu “Janelas”
Nome do banco e usuário
Resultado da criação
Conectar ao banco de dados
Criar tabela
Estrutura da tabela
Selecionar novo projeto
Categoria de projeto
Nome do Projeto
Modelo
Modelo: Diagrama de Classes
Criar nova classe

Caso a aba de projetos não esteja visível, habilite-a


no menu “Janelas”
Classe Conexao – Pacote model

public class Conexao {

private static final String DRIVER =


"org.apache.derby.jdbc.ClientDriver";
// Observe o nome de seu banco de dados
private static final String BDURL =
"jdbc:derby://localhost:1527/Agenda";
// Observe o nome e a senha do usuário
private static final String USUARIO = "admin";
private static final String SENHA = "adminadmin";
Classe Conexao – Pacote model

public static Connection obterConexao() throws


Exception {
Connection conexao = null;
try {
Class.forName(DRIVER);
conexao =
DriverManager.getConnection(BDURL, USUARIO,
SENHA);
return conexao;
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
throw new Exception(cnfe.getMessage());
} catch (SQLException sqle) {
sqle.printStackTrace();
throw new Exception(sqle.getMessage());
}
}
}
Corrigir importações e Formatar

Após copiar o código dos slides anteriores, selecione


as opções “Corrigir importações” e “Formatar” do
menu “Código-fonte”.
ATENÇÃO: Este procedimento deve ser repetido
após a cópia de todo o código, em cada arquivo
Classe Contato – pacote model

public class Contato implements Serializable {

protected long id;


protected String prenome;
protected String sobrenome;
protected Date nascimento;
protected String telefone;
protected String mensagem = new String("");
private DateFormat df =
DateFormat.getDateInstance(DateFormat.MEDIUM
);
Classe Contato – pacote model

public Contato() {
}

public Contato(long id, String prenome, String


sobrenome,
Date nascimento, String telefone) {
this.id = id;
this.prenome = prenome;
this.sobrenome = sobrenome;
this.nascimento = nascimento;
this.telefone = telefone;
}
Classe Contato – pacote model

public boolean valido() {


setMensagem("");
Date agora = new Date();
if (getNascimento() == null) {
setMensagem("Data de nascimento não foi informada");
return false;
} else if (getNascimento().getTime() > agora.getTime()) {
setMensagem("Data de nascimento ainda não ocorreu");
return false;
} else if (getPrenome().equalsIgnoreCase("")) {
setMensagem("Nome não foi informado");
return false;
} else if (getSobrenome().equalsIgnoreCase("")) {
setMensagem("Sobrenome não foi informado");
return false;
} else if (getTelefone().equalsIgnoreCase("")) {
setMensagem("Telefone não informado");
return false;
}
return true;
}
}
Inserir código

Clique com o botão direito do mouse entre os dois


sinal de fechamento de chaves ( '}' ) e selecione a
opção “Inserir código”
Métodos de acesso – Getters e
Setters
Selecionar campos
Inserir método

Após inserir este código faça a correção de


importações e formatação do código-fonte
Classe ContatoDAOImp – Pacote
model

public class ContatoDAOImp implements DAO {

private Connection c;

public ContatoDAOImp() throws Exception {


try {
c = Conexao.obterConexao();
} catch (Exception e) {
e.printStackTrace();
throw new Exception(e.getMessage());
}
}
Classe ContatoDAOImp – Pacote
model

public void salvar(Contato contato) throws Exception {


PreparedStatement ps = null;
Connection cn = null;
if (contato == null) {
throw new Exception("Contato não pode ser nulo");
}
try {
String sql = "Insert into App.Amigos ("
+ "IDAmigo, PNome, SNome, Nascimento, Telefone) "
+ "values (?, ?, ?, ?, ?)";
cn = c;
ps = cn.prepareStatement(sql);
ps.setLong(1, novoID());
ps.setString(2, contato.getPrenome());
ps.setString(3, contato.getSobrenome());
ps.setDate(
4, new java.sql.Date(contato.getNascimento().getTime()));
ps.setString(5, contato.getTelefone());
ps.executeUpdate();
} catch (SQLException sqle) {
sqle.printStackTrace();
throw new Exception(sqle.getMessage());
} finally {
if (ps != null) {
ps.close();
}
}
}
Classe ContatoDAOImp – Pacote
model

public void excluir(Contato contato) throws Exception {


PreparedStatement ps = null;
Connection cn = null;
if (contato == null) {
throw new Exception("Contato não pode ser nulo");
}
try {
String sql = "Delete from App.Amigos where IDAmigo = ?";
cn = c;
ps = cn.prepareStatement(sql);
ps.setLong(1, contato.getId());
ps.executeUpdate();
} catch (SQLException sqle) {
sqle.printStackTrace();
throw new Exception(sqle.getMessage());
} finally {
if (ps != null) {
ps.close();
}
}
}
Classe ContatoDAOImp – Pacote
model

public void atualizar(Contato contato) throws Exception {


PreparedStatement ps = null;
Connection cn = null;
if (contato == null) {
throw new Exception("Contato não pode ser nulo");
}
try {
String sql = "Update App.Amigos "
+ "set PNome = ?, SNome = ?, "
+ "Nascimento = ?, Telefone = ? "
+ "where IDAmigo = ?";
cn = c;
ps = cn.prepareStatement(sql);
ps.setString(1, contato.getPrenome());
ps.setString(2, contato.getSobrenome());
ps.setDate(
3, new java.sql.Date(contato.getNascimento().getTime()));
ps.setString(4, contato.getTelefone());
ps.setLong(5, contato.getId());
ps.executeUpdate();
} catch (SQLException sqle) {
sqle.printStackTrace();
throw new Exception(sqle.getMessage());
} finally {
if (ps != null) {
ps.close();
}
}
}
Classe ContatoDAOImp – Pacote
model

public List<Contato> todosContatos() throws Exception {


PreparedStatement ps = null;
Connection cn = null;
ResultSet rs = null;
List<Contato> contatos = new ArrayList<Contato>();
try {
String sql = "Select * From App.Amigos order by PNome, SNome";
cn = c;
ps = cn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
long idContato = rs.getLong("IDAmigo");
String pNome = rs.getString("PNome");
String sNome = rs.getString("SNome");
Date nascimento = rs.getDate("Nascimento");
String telefone = rs.getString("Telefone");
contatos.add(new Contato(
idContato, pNome, sNome, nascimento, telefone));
}
return contatos;
} catch (SQLException sqle) {
sqle.printStackTrace();
throw new Exception(sqle.getMessage());
} finally {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
}
}
Classe ContatoDAOImp – Pacote
model

public Contato contato(long id) throws Exception {


PreparedStatement ps = null;
Connection cn = null;
ResultSet rs = null;
try {
String sql = "Select * From App.Amigs Where IDAmigo = ?";
cn = c;
ps = cn.prepareStatement(sql);
ps.setLong(1, id);
rs = ps.executeQuery();
if (!rs.next()) {
throw new Exception("Não foi encontrado "
+ "amigo com identificação " + id);
}
String pNome = rs.getString("PNome");
String sNome = rs.getString("SNome");
Date nascimento = rs.getDate("Nascimento");
String telefone = rs.getString("Telefone");
return new Contato(id, pNome, sNome, nascimento, telefone);
} catch (SQLException sqle) {
sqle.printStackTrace();
throw new Exception(sqle.getMessage());
}
}
Classe ContatoDAOImp – Pacote
model

private long novoID() throws Exception {


PreparedStatement ps = null;
Connection cn = null;
ResultSet rs = null;
cn = c;
try {
ps = cn.prepareStatement("Select max(IDAmigo) From App.Amigos");
rs = ps.executeQuery();
rs.next();
long proxId = rs.getLong(1) + 1;
return proxId;
} catch (SQLException sqle) {
sqle.printStackTrace();
throw new Exception(sqle.getMessage());
} finally {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
}
}
}
Extrair interface

Após corrigir importações e formatar o código-fonte,


extrair interface
Extrair interface
Controle
Controle: Diagrama de Classes
Criar novo Servlet
Servlet Controle – Pacote
controller

Inserir o seguinte método ao Servlet:

private Date strToDate(String dataStr) throws Exception {


if (dataStr == null) {
return null;
}
if (dataStr.equalsIgnoreCase("")) {
return null;
}
Date dataF = null;
try {
DateFormat df =
DateFormat.getDateInstance(DateFormat.MEDIUM);
dataF = df.parse(dataStr);
return dataF;
} catch (ParseException pe) {
pe.printStackTrace();
throw new Exception(pe.getMessage());
}
}
Servlet Controle – Pacote
controller

Alterar o método processRequest da seguinte forma:

protected void processRequest(HttpServletRequest


request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
String acao = request.getParameter("acao");

if (acao == null) {
acao = "basica";
}

DAO dao;
Contato contato = new Contato();
Servlet Controle – Pacote
controller

if (acao != null || !acao.equalsIgnoreCase("basica")) {


String id = request.getParameter("id");
try {
if (id != null) {
contato.setId(Long.parseLong(id));
}

contato.setPrenome(request.getParameter("prenome"));
contato.setSobrenome(request.getParameter("sobrenom
e"));
contato.setNascimento(strToDate(
request.getParameter("nascimento")));
contato.setTelefone(request.getParameter("telefone"));
} catch (Exception e) {
e.printStackTrace();
}
}
Servlet Controle – Pacote
controller

RequestDispatcher rd = null;
try {
dao = new ContatoDAOImp();

if (acao.equalsIgnoreCase("insere")) {
if (contato.valido()) {
dao.salvar(contato);
acao = "basica";
} else {
acao = "erro";
contato.setMensagem("Erro ao inserir:\n"
+ contato.getMensagem());
HttpSession sessao = request.getSession(true);
sessao.setAttribute("contato", contato);
}
} else if (acao.equalsIgnoreCase("exc")) {
dao.excluir(contato);
acao = "basica";
} else if (acao.equalsIgnoreCase("update")) {
if (contato.valido()) {
dao.atualizar(contato);
acao = "basica";
} else {
acao = "erro";
contato.setMensagem("Erro ao atualizar:\n"
+ contato.getMensagem());
HttpSession sessao = request.getSession(true);
sessao.setAttribute("contato", contato);
}
}
Servlet Controle – Pacote
controller

if (acao.equalsIgnoreCase("basica")) {
List<Contato> contatos = dao.todosContatos();
request.setAttribute("contatos", contatos);
if (contatos.size() > 0) {
rd = request.getRequestDispatcher("/listagem.jsp");
} else {
rd = request.getRequestDispatcher("/insercao.jsp");
}
} else if (acao.equalsIgnoreCase("atu")) {
contato = dao.contato(contato.getId());
HttpSession sessao = request.getSession(true);
sessao.setAttribute("contato", contato);
rd = request.getRequestDispatcher("/atualizar.jsp");
} else if (acao.equalsIgnoreCase("erro")) {
rd = request.getRequestDispatcher("/erro.jsp");
} else {
rd = request.getRequestDispatcher("/index.jsp");
}

rd.forward(request, response);
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}

}
Visão
Abrir arquivo index.jsp

ATENÇÃO: Basta abrir o arquivo, pois o index.jsp foi criado no


momento da criação do projeto

Conteúdo do arquivo:

<%@page contentType="text/html" pageEncoding="UTF-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Amigos</title>
</head>
<body>
<h1>Acesso ao aplicativo</h1>
<a href="Controle">Iniciar aplicativo</a>
</body>
</html>
Adicionar outro tipo de arquivo
Escolher tipo de arquivo
Crie form.inc e procure a pasta
Selecionar pasta web

Conteúdo de form.inc

<form name="Contato" action="Controle" method="POST">


<label for="prenome">Nome: </label>
<input type="text" name="prenome" value="" size="15"
maxlength="15"
class="entrada" />
<br><label for="sobrenome">Sobrenome: </label>
<input type="text" name="sobrenome" value="" size="30"
maxlength="30"
class="entrada" />
<br><label for="nascimento">Nascimento: </label>
<input type="text" name="nascimento" value="" size="10"
maxlength="10"
class="entrada" />
<br><label for="telefone">Telefone: </label>
<input type="text" name="telefone" value="" size="10"
maxlength="10"
class="entrada"
title="Apenas algarismos, incluindo c&oacute;digo de área" />
<br>
<input type="hidden" name="acao" value="insere">
<input type="submit" value="Inserir" />
</form>
Adicionar outro tipo de arquivo
novamente
Selecione Folha de Estilo em
Cascata (CSS)
Inserir estilo.css na pasta web

label {width:150px;text-
align:right;display:block;float:left;}
.entrada {left:180px;padding:4px 2px;margin:2px 0
10px 5px;}
table {border-collapse:collapse;}
Inserir arquivo JSP
Inserir o arquivo insercao.jsp

<%@page contentType="text/html" pageEncoding="UTF-


8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Amigos</title>
<link rel="stylesheet" type="text/css" href="estilo.css">
</head>
<body>
<h1>Novo Amigo</h1>
<h3>Não há amigos no banco de dados</h3>
<div id="form">
<jsp:directive.include file="form.inc" />
</div>
</body>
</html>
Inserir o arquivo listagem.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>


<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="cache-control" content="no-cache">
<title>Amigos</title>
<link rel="stylesheet" type="text/css" href="estilo.css">
<script type="text/javascript" src="http://www.google.com/jsapi">
</script>
<script type="text/javascript">
google.load("jquery", "1.3.2");
google.setOnLoadCallback(function(){
$("#form").hide();
$("#inclusao").click(function(){
$("#form").slideDown("slow");
$(this).hide("slow");
});
});
</script>
</head>
Inserir o arquivo listagem.jsp

<body>
<h1>Listagem de amigos</h1>
<div id="listagem">
<table border="1" cellspacing="2" cellpadding="4">
<thead>
<th>Nome</th><th>Sobrenome</th>
<th>Nascimento</th><th>Telefone</th>
<th>Ações</th>
</thead>
<tbody>
<c:forEach var="amigos" items="${requestScope.contatos}">
<tr>
<td>${amigos.prenome}</td><td>${amigos.sobrenome}</td>
<td><f:formatDate value="${amigos.nascimento}" type="DATE"
pattern="dd/MM/yyyy"
/></td>
<td>${amigos.telefone}</td>
<td><a href="Controle?acao=exc&id=${amigos.id}">Excluir</a>&nbsp;
<a href="Controle?acao=atu&id=${amigos.id}">Alterar</a>
</td>
</tr>
</c:forEach>
</tbody></table>
</div>
<p><a id="inclusao">Incluir amigo</a></p>
<div id="form"><jsp:directive.include file="form.inc" /></div>
</body></html>
Inserir o arquivo atualizar.jsp

<%@page contentType="text/html"
pageEncoding="UTF-8"%>
<jsp:useBean id="contato" scope="session"
class="model.Contato" />
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8">
<title>Amigos</title>
</head>
Inserir o arquivo atualizar.jsp

<body>
<h1>Atualizar</h1>
<form name="Contato" action="Controle" method="POST">
<label for="prenome">Nome: </label>
<input type="text" name="prenome" value="${contato.prenome}"
size="15" maxlength="15" class="entrada" />
<br><label for="sobrenome">Sobrenome: </label>
<input type="text" name="sobrenome" value="${contato.sobrenome}"
size="30" maxlength="30" class="entrada" />
<br><label for="nascimento">Nascimento: </label>
<input type="text" name="nascimento" value="$
{contato.nascimentoString}" size="10" maxlength="10" class="entrada" />
<br><label for="telefone">Telefone: </label>
<input type="text" name="telefone" value="${contato.telefone}"
size="10" maxlength="10" class="entrada"
title="Apenas algarismos, incluindo c&oacute;digo de área" />
<br>
<input type="hidden" name="acao" value="update">
<input type="hidden" name="id" value="${contato.id}">
<input type="submit" value="Inserir" />
</form>
</body>
</html>
Inserir arquivo erro.jsp

<%@page contentType="text/html" pageEncoding="UTF-


8"%>
<jsp:useBean id="contato" scope="session"
class="model.Contato" />
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>Amigos</title>
</head>
<body>
<h1>Erro</h1>
<h4>${contato.mensagem}</h4>
<a href="Controle">Voltar ao aplicativo</a>
</body>
</html>
Executar
Tela inicial
Formulário de inserção
Listagem
Listagem e formulário
Erro
Alteração
JSP e bancos de dados:
MVC e Javabeans

Obrigado pela atenção