UNIDADE II – Sistemas Cadastrais com acesso a Banco de...

61
DESENVOLVIMENTO DE SISTEMAS WEB Luiz Leão – [email protected] http://www.luizleao.com UNIDADE II – Sistemas Cadastrais com acesso a Banco de Dados

Transcript of UNIDADE II – Sistemas Cadastrais com acesso a Banco de...

DESENVOLVIMENTO DE SISTEMAS WEB

Luiz Leão – [email protected] http://www.luizleao.com

UNIDADE II – Sistemas Cadastrais com acesso a Banco de Dados

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Conteúdo Programático

• Middleware JDBC • Uso do NetBeans para gerência do banco JavaDB • Modelo MVC I e MVC II • Introdução aos Padrões de Desenvolvimento • Aplicativo Web MVC II com Front Control / View Control • Gerenciamento de Sessão e Login

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Middleware ou mediador, no campo da computação distribuída, é um programa de computador que faz a mediação entre software e demais aplicações.

Middleware

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Devido a pluralidade de banco de dados e seus provedores de acesso (drives de conexão), a SUN criou uma API chamada JDBC (java Data Base Connectivity) cujo o objetivo é fornecer uma ponte entre a camada do cliente, o driver do fabricante e a fonte de dados.

• Uma interface entre a linguagem Java e outra linguagem que todos os bancos de dados suportem.

• A linguagem foi o SQL (Structured Query Language).

Banco de dados : Fundamentos

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• java.sql.Connection: Representa uma conexão com um banco de dados

• java.sql.DriverManager: Gerencia drivers JDBC usados pela • Aplicação

• javax.sql.DataSource: Abrange os detalhes de como obter uma conexão para o banco de dados

• java.sql.Statement: Fornece métodos para o desenvolvedor executar instruções SQL

• java.sql.ResultSet: Representa o resultado de uma instrução SQL de Pesquisa

JDBC

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Permite que um desenvolvedor recupere um objeto Connection que pode ser usado para executar instruções em bancos de dados.

• O Driver JDBC deve estar registrado com o DriverManager

• Usar o método getConnection em DriverManager

java.sql.DriverManager

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Uma interface definida na API JDBC desde a versão 2 de sua especificação

• É o modo recomendado para um desenvolvedor obter um objeto Connection

• Recuperar o objeto Connection • Chamar o método getConnection() em uma instância de

DataSource

• Obter uma instância de DataSource

javax.sql.DataSource

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

● Objetos da classe java.sql.Connection representam conexões atuais para o banco de dados

● Uma vez de posse deste objeto, criamos um objeto da classe Statement, que usamos para executar consultas SQL

– ExecuteQuery: Tomada em comandos SELECT, retornando o resultado de operações como um objeto ResultSet

– ExecuteUpdate: Tomada em comandos INSERT, UPDATE ou DELETE, retornando o número de colunas afetadas como um tipo int

java.sql.Connection / java.sql.Statement

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

● Resultados de uma consulta no banco de dados

● Um objeto ResultSet pode ser visualizado como uma tabela

● A informação é recuperada uma coluna por vez

● O objeto ResultSet mantém a coluna corrente

● Para percorrer as linhas da tabela em ResultSet, usamos o método next()

java.sql.ResultSet

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

● Este é um passo muito importante que frequentemente é negligenciado após ter sido completada

● Deve ser feita explicitamente e é uma responsabilidade do programador

● Sem executar tal liberação, os recursos tomados pela operação não podem ser usadas no futuro

● Para aplicações muito grandes, isto rapidamente resulta na perda de conexões disponíveis

Liberando Recursos do Sistema

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

● Executada chamando o método close() disponíveis em cada objeto das classes Connection, Statement, e ResultSet

– Existem uma ordem específica envolvida

– O método close está definido para lançar uma SQLException

● Erros comuns dos desenvolvedores: colocar simplesmente os métodos dentro do corpo do programa

● Somente recorrer a condições de bem sucedidas

● O código deve ser colocado dentro de uma cláusula finally

Liberando Recursos do Sistema

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Criando um Projeto

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Criamos a classe de conexão com o banco de dados.

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Transforme a classe em ABSTRACT e crie o método getMyDBConnection

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Click na lâmpada e em Adicionar import para java.sql.Connection

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• java.sql.Connection é uma interface de conexão com o banco de dados.

• Podemos ler: a Interface Connection está na pasta sql, que está na pasta java.

Observação

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Vamos precisar do driver de conexão. Para isso click em serviços, drives com o botão direito e PERSONALIZAR.Selecione o nome do driver: com.mysql.jdbc.Driver

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Digite as linhas utilizando o driver recuperado.

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Adicione a cláusula abaixo:

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Crie a classe UsersDao

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Nova classe Usersdao

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Outra classe - User

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Classe User

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Selecione o item marcado e ENTER.

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

Marque o primeiro item e todos os outros serão selecionados – criaremos os métodos GETs e SETs.

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Ao clicar em OK automaticamente criará o código com os métodos gets e sets.

• Vamos ver o código da classe DAO!

Classe User

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

package projetoDSI.dao;

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.LinkedList; import java.util.List;

public class UsersDao extends DBConnection{ Connection cx;

public UsersDao() throws SQLException, ClassNotFoundException { this.cx = getMyDBConnection(); }

public UsersDao(Connection cx){ this.cx = cx; }

Classe UsersDao

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

public User getUser(String nome) throws SQLException{ PreparedStatement pst = null; ResultSet rs = null; try{ pst = cx.prepareStatement("select * from users where login = ?"); pst.setString(1, nome); rs = pst.executeQuery(); if(rs.next()){ User usr = getUserFromSQL(rs); return usr; } } finally{ pst.close(); rs.close(); } return null; }

Classe UsersDao

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

public boolean isValidUserAndPassword(String username, String password) throws SQLException{ PreparedStatement pst = null; ResultSet rs = null; try{ pst = cx.prepareStatement("select * from users where login = ? and password = ?"); pst.setString(1, username); pst.setString(2, password); rs = pst.executeQuery(); if(rs.next()){ return true; } } finally{ pst.close(); rs.close(); } return false; }

Classe UsersDao

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

public List<User> getListOfUsers() throws SQLException{ List<User> returned = new LinkedList<User>(); Statement st = null; ResultSet rs = null; try{ st = cx.createStatement(); rs = st.executeQuery("select * from users"); while(rs.next()){ returned.add(getUserFromSQL(rs)); } } finally{ st.close(); rs.close(); } return returned; }

Classe UsersDao

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

private User getUserFromSQL(ResultSet rs) throws SQLException { User returned = new User();

returned.setId_user(rs.getInt("id_user")); returned.setLogin(rs.getString("login")); returned.setPassword(rs.getString("password")); returned.setAddress(rs.getString("address"));

return returned; } }

Classe UsersDao

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

<h2 align="center">Login - PROJETO EXEMPLO DSI</h2> <form action="LoginServlet"> <table border="0" align="center" width ="60%"> <tr bgcolor="lightblue"> <td>Username: <input type="text" name ="login" size="20" /></td> <td>Password: <input type="password" name ="password" size="20" /></td> </tr> <tr> <td><br /></td> </tr> <tr> <td align="center" colspan="2"><input type="submit" value="Login" /></td> </tr> </table> </form>

Página Index

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

EX. SERVLET

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Middleware JDBC; • Banco de dados na linguagem Java; • Uso do NetBeans para gerência do banco • Servlet para listagem de dados provenientes do banco

Resumindo

Session e Cookie

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Um dos fatos sobre a programação para a web é que o protocolo HTTP é stateless, ou seja, não guarda estados, não podem existir conexões persistentes entre o browser do cliente e o servidor web.

Internet sem memória

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Existem basicamente três técnicas de manutenção de estado do cliente da web: utilizando sessões, utilizando cookies e propagação de parâmetros (que quase não é usada)

Métodos de manutenção do estado

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• A técnica conhecida como session track, ou uso de sessões é uma técnica que mantém o estado do cliente em diversas situações.

• Muito utilizada em lojas virtuais nos carrinhos de compras, utilizadas também para criação de login e senha e outros.

Sessão de usuário

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Páginas JSP utilizam objetos de sessão que são parte da classe HTTPSession.

• Tais objetos também são chamados de pseudo-sessions ou simplesmente sessions e podem ser utilizados para armazenar informações entre requisições ao servidor.

Sessão de usuário

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

<%@page contentType="text/html" pageEncoding="UTF-8"%><!DOCTYPE html><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page - Session</title> </head> <body> <form method ="post" action ="exSessionRes.jsp"> Digite o seu nome: <br /> <input type="test" name="txt_username" size="20" /> <input type="submit" value="Enviar" /> </form> </body></html>

Exemplo - exSession.jsp

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

<html> <% String name = request.getParameter("txt_username");

session.setAttribute("session_name", name); %> <body> <a href = "exSessionMostrar.jsp">Mostrar</a><br />Oi <%= session.getAttribute("session_name") %>.

Esta pagina salva o nome do usuario em uma session e o coloca em um link <br /> </body></html>

Código JSP - exSessionRes.jsp

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

<html><body> Oi <%= session.getAttribute("session_name") %>.</body></html>

Página Mostrar em JSP - exSessionMostrar.jsp

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• São pequenos textos de informação de no máximo 4kb.

• Um servidor web envia-os a um browser e grava-os no computador do cliente por um determinado tempo, e são acessados quando um cliente visita o mesmo site que os criou.

Cookies

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Com o uso de cookies é possível obter uma série de informações sobre o cliente no instante de acesso ao site.

• Identificação imediata de preferência de usuários, tais como: formato de telas, produtos preferidos na última compra e principalmente nome de usuário de senha.

• Identificação de usuários durante compras em uma loja virtual: com o uso de sessions que ficam responsáveis por guardar os itens do carrinho de compras, bem como o identificador o usuário.

Prós e Contras

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

<html><body> <form method ="post" action="exCookieRes.jsp"> Digite um login: <input type="text" name="username" /><br /> Digite a senha: <input type="text" name="password" /><br /> <input type="submit" value="Enviar dados" /> </form> </body></html>

Exemplo

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

<%@page language="java" import="java.util.*" %><% String username= request.getParameter("username"); String password= request.getParameter("password"); if(null == username) username=""; if(null == password) password=""; Cookie cookieName = new Cookie("c_username", username); Cookie cookieSenha = new Cookie("c_password", password); response.addCookie(cookieName); response.addCookie(cookieSenha); %><html> <body> <p><a href="exCookieMostrar.jsp">Clique aqui para ver os cookies</a></p> </body></html>

Exemplo - exCookie.jsp

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

<%@page language="java" %>

<% Cookie cookies[] = request.getCookies(); if (null != cookies){ for (int i = 0; i < cookies.length; i++){ Cookie cookie = cookies[i]; out.println(“Nome do Cookie:" + cookie.getName() + "<br />"); out.println(“Valor do Cookie:" + cookie.getValue() + "<br />"); } } else{ out.println("Não há cookies"); } %>

Exemplo - exCookieMostrar.jsp

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• O padrão MVC (2) é uma arquitetura popular para o desenho de aplicações web complexas e modulares. Nessa arquitetura existem três camadas:

• Camada de Modelo: • Ficam as classes que modelam dados e a lógica de negócios.

• Camada de Controle: • Normalmente utilizada para filtros, redirecionando páginas JSP a serem

acessadas e validações de dados. • Pode ser implementada com servlets, beans ou EJBs.

• Camada de Visão: • Onde estão os JSPs e as páginas HTML responsáveis pelas interfaces

de interação do usuário no navegador.

Padrão MVC

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

<html> <head> <title>MVC e Singleton</title> </head> <body> <h1>Cadastro de Contatos com MVC</h1> <form action="ContatoControl" method="post" /> Entre com o nome<br /> <input type="text" name="txt_nome" /><br /> Entre com o email<br /> <input type="text" name="txt_email" /><br /> <input type="submit" name="btn_ok" value="OK" id="ok" /> </form> </body></html>

Camada de Visão

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

package br.estacio.control;

import br.estacio.model.ContatoDAO;import br.estacio.model.Contato;import java.io.IOException;import java.io.PrintWriter;import java.sql.SQLException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

Camada Controller

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

@WebServlet(urlPatterns = {"/ContatoControl"})public class ContatoControl extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException, ClassNotFoundException { String nome = request.getParameter("txt_nome"); String email = request.getParameter("txt_email"); if(nome.equals("") || email.equals("")){ response.sendRedirect("index.jsp"); } else { try{ Contato contato = new Contato(nome, email); ContatoDAO.getInstance().save(contato); response.sendRedirect("contato_sucesso.jsp"); } catch(SQLException ex){ response.sendRedirect("contato_erro.jsp"); } } }}

Camada Controller

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

package br.estacio.model;

import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;import br.estacio.model.Contato;

public class ContatoDAO{ private static ContatoDAO instance_singleton = new ContatoDAO(); public static ContatoDAO getInstance(){ return instance_singleton; }

Padrão DAO

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

public void save(Contato contato) throws SQLException, ClassNotFoundException{ Connection conn = null; Statement st = null; try{ conn = DBConnection.getInstance().getConnection(); st = conn.createStatement(); st.execute("insert into contato (nome, email) values('" + contato.getNome() + "', '" + contato.getEmail() + "')"); } catch(SQLException e){ throw e; }

Padrão DAO

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

finally { try{ if(st!=null) st.close(); if(conn!=null) conn.close(); } catch(SQLException e){

} } } }

Padrão DAO

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

package persistence;

import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;

public class DBConnection { //conexao MySQL final private String driver = "com.mysql.jdbc.Driver"; final private String url = "jdbc:mysql://localhost/db_padroes"; final private String usuario = "root"; final private String senha = "root";

Camada de Persistência

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

private static DBConnection instance_singleton = new DBConnection(); public static DBConnection getInstance(){ return instance_singleton; } // para ninguem poder instanciar(criar objetos) colocar o construtor privado private DBConnection(){ } public Connection getConnection() throws SQLException, ClassNotFoundException{ Class.forName(driver); return DriverManager.getConnection(url,usuario,senha); } }

Camada de Persistência

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

package model;

public class Contato {

public Contato() { }

public Contato(String nome, String email) { this.nome = nome; this.email = email; }

Camada Model

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

private String nome; private String email; public String getEmail() { return email; }

public void setEmail(String email) { this.email = email; }

public String getNome() { return nome; }

public void setNome(String nome) { this.nome = nome; } }

Camada Model

UNIDADE I – Criação de Aplicativos Web

DESENVOLVIMENTO DE SISTEMAS WEB

• Sessões, cookies • Padrão MVC (2)

Resumindo