Baixe o app para aproveitar ainda mais
Prévia do material em texto
Benefrancis do Nascimento SISTEMA WEB 1 Neste material mostrarei passo a passo o desenvolvimento de uma aplicação web utilizando programação orientada a objeto com Java em conjunto com o framework para mapeamento objeto relacional Hibernate. É indicado para estudantes e profissionais que queiram aprender Java para web, porém que procuram desenvolver softwares mais próximos do que o mercado atualmente exige. Neste material desenvolveremos um sistema para controlar um petshop contendo diversas operações que interagem com banco de dados. SISTEMA WEB Desenvolva passo a passo um sistema web utilizando Java, Hibernate e JSP. Benefrancis do Nascimento Benefrancis do Nascimento SISTEMA WEB 2 Nota do Autor O material que o leitor tem em mãos, dirigido basicamente, mas não exlusivamente, a alunos de graduação e pós graduação em cursos de Ciencia da Computação e correlatos, tem como preocupação fundamental iniciá‐lo no desenvolvimento de aplicações Java, utilizando Hibernate em ambiente Web. O objetivo aqui é desenvolver passo a passo um sistema em Java que interage com banco de dados realcional utilizando o framework de mapeamento objeto relacional Hibernate. Este sistema, futuramente, será encaminhado a testes de desempenho e segurança para que, em seguida, possa ser evoluído. Dessa forma, convido você a participar deste projeto que, com certeza, contribuirá com os seus estudos e futuramente você será capaz de repassar este conhecimento para outras pessoas. Não indico a utilização do código fonte deste material para desenvolvimento de sistema comercial, pois aspectos de segurança nesta obra não foram abordados. Desta forma, não me responsabilizo por qualquer dano que possa causar a quem quer que seja. Criticas e sugestões, com objetivo de alimentar o processo de melhoria contínua de minhas obras, são bem vindas. O contato deverá ser estabelecido pelos meios abaixo. e‐mail: benefrancis@gmail.com twitter: @Benefrancis Skype: Benefrancis.com Desejo a todos muito sucesso. Benefrancis do Nascimento Benefrancis do Nascimento SISTEMA WEB 3 Aos meus alunos do curso de Pós‐graduação em Desenvolvimento de Sistemas para Web da Faculdade Anhanguera – Campinas. Benefrancis do Nascimento SISTEMA WEB 4 Nota do Autor ............................................................................................................................ 2 Configurando o ambiente ............................................................................................................. 8 Acessando o Mysql .................................................................................................................... 9 Criando o banco de dados do sistema ...................................................................................... 9 Criando uma aplicação Java para web no Netbeans .............................................................. 10 Criando os pacotes da nossa aplicação ................................................................................... 17 Criando as classes da camada de controle .................................................................................. 18 A Classe Pessoa ....................................................................................................................... 19 Métodos da classe pessoa que interagem com o banco de dados ......................................... 21 Mapeando a Classe Pessoa ..................................................................................................... 22 A Classe PF ............................................................................................................................... 27 Mapeando a Classe PF ............................................................................................................. 27 A Classe PJ ............................................................................................................................... 28 Mapeando a Classe PJ ............................................................................................................. 29 A Classe Telefone .................................................................................................................... 30 Métodos da classe Telefone que interagem com o banco de dados ...................................... 30 Mapeando a Classe Telefone .................................................................................................. 31 A classe Endereco .................................................................................................................... 35 Métodos da classe Endereco que interagem com o banco de dados ..................................... 35 Mapeando a classe Endereco .................................................................................................. 36 A classe DocReceita ................................................................................................................. 40 Mapeando a classe DocReceita ............................................................................................... 40 A classe CPF ............................................................................................................................. 43 A classe CNPJ ........................................................................................................................... 44 A classe Animal ........................................................................................................................ 47 Benefrancis do Nascimento SISTEMA WEB 5 Métodos da classe Animal que interagem com o banco de dados ......................................... 47 Mapeando a classe Animal ...................................................................................................... 48 Informando ao Hibernate quais os atributos da classe animal que serão persistidos ........... 51 A classe Cachorro .................................................................................................................... 53 A classe Gato ........................................................................................................................... 54 A classe abstrata Servico ......................................................................................................... 55 Métodos da classe Servico que interagem com o banco de dados ........................................ 55 Mapeando a Classe Servico ..................................................................................................... 57 Informando ao Hibernate quais os atributos da classe Servico que serão persistidos ........... 58 A classe Banho ......................................................................................................................... 60 A classe Consulta ..................................................................................................................... 61 A classe Tosa ........................................................................................................................... 62 A classe Vacina ........................................................................................................................ 62 Utilizando o Hibernate para criar as tabelas no banco de dados ............................................... 63 Atualizando o arquivo hibernate.cfg.xml ................................................................................ 64 Criando uma conexão com o hibernate .................................................................................. 65 Criando uma classe para testar o funcionamento do Hibernate ............................................66 Programando as classes DAO ...................................................................................................... 68 Introdução ............................................................................................................................... 69 Implementado os métodos da classe PessoaDAO .................................................................. 69 Implementado os métodos da classe AnimalDAO .................................................................. 76 Implementado os métodos da classe ServicoDAO .................................................................. 82 Implementado os métodos da classe TelefoneDAO ............................................................... 89 Implementado os métodos da classe EnderecoDAO .............................................................. 95 Testando os métodos das classes do pacote DAO .................................................................... 101 Salvando pessoa, telefone, endereço, animais e serviços. ................................................... 102 Benefrancis do Nascimento SISTEMA WEB 6 Criando as páginas JSP .............................................................................................................. 106 Mapa do site .......................................................................................................................... 107 Criando diretórios necessários .............................................................................................. 107 Iniciando a programação das páginas JSP ............................................................................. 109 Importando as classes necessárias ........................................................................................ 109 Codificando arquivos do diretório geral ................................................................................... 115 Codificando arquivos do diretório cadastros ............................................................................ 120 Codificando arquivos do diretório serviços ............................................................................... 155 Codificando arquivos do diretório consultas ............................................................................ 173 Considerações finais .................................................................................................................. 265 Benefrancis do Nascimento SISTEMA WEB 7 Figura 1 ‐ Diagrama de classes do pacote controle Benefrancis do Nascimento SISTEMA WEB 8 Configurando o ambiente Benefrancis do Nascimento SISTEMA WEB 9 Acessando o Mysql Iniciaremos a configuração do nosso ambiente de desenvolvimento, conectando com o Mysql. Para isso utilizaremos o HeidiSQL1. Conectamos com o usuário root em nossa máquina local. Figura 2 ‐ Conectando o Heidi SQL Criando o banco de dados do sistema Criaremos agora o nosso database. Para isso, clique com o botão da direita do mouse no Treeview root@127.0.0.1; abrirá um menu suspenso no qual você deverá acessar a opção Create New / Database. A tela representad na imagem abaixo será aberta. Preencha os dados conforme a imagem abaixo. 1 Disponível em: http://www.heidisql.com/ Benefrancis do Nascimento SISTEMA WEB 10 Figura 3 ‐ Criando o banco de dados com o nome estimacao Criando uma aplicação Java para web no Netbeans Criaremos agora uma aplicação java para web no ide Netbeans2. Acesse o menu Arquivo / Novo projeto. A configuração do projeto segue quatro passos que descreverei nas imagens a seguir. 2 Disponível em: http://netbeans.org/ Benefrancis do Nascimento SISTEMA WEB 11 Figura 4 ‐ Criando uma aplicação Java para web no Netbeans [1 º Passo ] O primeiro passo consiste na escolha do projeto. No nosso caso a categoria do projeto será java Web e o projeto será Aplicação web. Benefrancis do Nascimento SISTEMA WEB 12 Figura 5 ‐ Criando uma aplicação Java para web no Netbeans [2 º Passo ] No segundo passo demos um nome para o projeto. O nome escolhido foi Estimacao. Figura 6 ‐ Criando uma aplicação Java para web no Netbeans [3 º Passo ] Benefrancis do Nascimento SISTEMA WEB 13 No terceiro passo deveremos escolher o servidor – container para a nossa aplicação. Escolha o Apache Tomcat. Para a versão do java EE você deverá escolher a 5 ou superior. O caminho do projeto será sugerido pelo Netbeans. Aceite a sugestão. Figura 7 ‐ Criando uma aplicação Java para web no Netbeans [4 º Passo ] O quarto passo será dividido em duas etapas. A primeira é escolher os frameworks que desejaremos trabalhar em nossa aplicação. Escolha somente o Hibernate 3.x.x. Para conexão com banco de dados o hibernate trabalha com dialeto, desta maneira ele saberá tratar as particularidades do banco de dados escolhido. Configuraremos uma nova conexão com banco de dados. A segunda etapa é apresentada na imagem abaixo: Benefrancis do Nascimento SISTEMA WEB 14 Figura 8 ‐ Segunda etapa do 4º passo da configuração do projeto Java para web A imagem acima mostra como deverá ser configurada a conexão com o banco de dados. Preencha conforme a imagem, porém você deverá saber qual o usuário e senha do seu banco de dados Mysql. Após o preenchimento clique em ok para aparecer a tela de finalização da configuração do projeto (imagem a seguir). Benefrancis do Nascimento SISTEMA WEB 15 Figura 9 ‐ Tela de finalização da configuração do projeto O seu projeto já está configurado para trabalhar com java para web utilizando o framework Hibernate. O Netbeans exibirá a estrutura de diretórios conforme imagem a seguir, porém para visualizar o conteúdo do arquivo hibernate.cfg.xml, você deverá clicar na aba XML do referido arquivo. Benefrancis do Nascimento SISTEMA WEB 16 Figura 10 ‐ o conteúdo do arquivo hibernate.cfg.xml criado pelo ide Netbeans Figura 11 ‐ Alteramos o arquivo hibernate.cfg.xml Realizamos a primeira alteração no arquivo hibernate.cfg.xml com o objetivo de que: 1º. Exiba no console os comandos sql; Benefrancis do Nascimento SISTEMA WEB 17 2º. Que os comandos sql sejam formatados; 3º. Informando o tamanho do pool de conexões permitidas; 4º. E, por fim, que o hibernate tenha permissão de criar tabelas na nossa base de dados. Falta apenas informar neste arquivo quais serão as classes da nossa aplicação que serão mapeadas para persistirem no banco de dados, mas informaremos após a criação, codificação e mapeamento das mesmas. Criando os pacotes da nossa aplicação A nossa aplicação terá três camadas, porém apenas dois pacotes, pois a camada de apresentação será composta pelas páginas web que já possuem diretório em nosso projeto. Veja imagem abaixo. Figura 12 ‐ Criando Pacotes: controle e modelo – A camada de visão será no diretório Páginas Web Cabe informar que apenas o arquivo hibernate.cfg.xml deverá permanecer no pacote padrão. Benefrancis do Nascimento SISTEMA WEB 18 Criando as classes da camada de controle Benefrancis do Nascimento SISTEMA WEB 19 A Classe Pessoa Figura 13 ‐ Atributos da Classe abstrata Pessoa. No momento da criação dos atributos o Netbeans sugere a criação das classes. Por exemplo, ao digitar public Collection<Telefone> telefone o Netbeans sugere a criação da classe telefone. Aconselho que criem imediatamente conforme o Netbeans vai sugerindo, porém depois façam as devidasalterações visto que, por exemplo, ao digitar public DocReceita docReceita ele sugere a criação de uma classe, mas conforme nosso diagrama UML, DocReceita é uma interface. Altere. Benefrancis do Nascimento SISTEMA WEB 20 Figura 14 ‐ Diretório após a criação das classes do pacote modelo Neste momento criei as classes DAO – Data Access Object ‐ Classes responsáveis pela camada de persistência na minha aplicação, mas sem nenhum código neste momento (apenas para podermos referenciá‐las nos métodos salvar, alterar, excluir e consultar nas classes do pacote controle). Criaremos também uma classe para testar o funcionamento do Hibernate (detalharei estas classes mais adiante). Benefrancis do Nascimento SISTEMA WEB 21 Métodos da classe pessoa que interagem com o banco de dados A seguir os métodos autenticar, existe, salvar, consultar, alterar e excluir da classe Pessoa. Quando estiver incluindo os métodos abaixo na classe Pessoa o Netbeans irá sugerir a criação dos métodos na classe PessoaDAO. Aceite a sugestão. public Autenticavel autenticar(String usuario, String senha) { return PessoaDAO.autenticar(usuario, senha); } public boolean existe(String email) { return PessoaDAO.existe(email); } public boolean existe(DocReceita documento) { return PessoaDAO.existe(documento); } static public boolean salvar(Pessoa p) { return PessoaDAO.salvar(p); } static public ArrayList<Pessoa> consultar() { return PessoaDAO.consultar(); } static public Pessoa consultar(int idPessoa) { return PessoaDAO.consultar(idPessoa); Benefrancis do Nascimento SISTEMA WEB 22 } static public Collection<Pessoa> consultar(String nome) { return PessoaDAO.consultar(nome); } static public boolean alterar(Pessoa p) { return PessoaDAO.alterar(p); } static public boolean excluir(Pessoa p) { return PessoaDAO.excluir(p); } Mapeando a Classe Pessoa Iniciaremos o mapeamento Objeto Relacional da classe pessoa Informando que a Classe Pessoa dará origem a objetos que serão persistidos Precisamos informar ao Hibernate que a classe pessoa dará origem a objetos que serão persistidos em banco de dados. Para isso utilizamos a seguinte anotação: @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "tipo") Benefrancis do Nascimento SISTEMA WEB 23 As anotações acima deverão ser inseridas antes do nome da classe. Veja imagem abaixo: Figura 15 ‐ Informando ao Hibernate que a Classe Pessoa será persistida e a estratégia de Herança utilizada Ao digitar as anotações o Netbeans sugere algumas importações, você deverá escolher as importações conforme as linhas que vão de 5 a 8 na imagem acima. Informando ao Hibernate qual será o id da tabela O Netbeans ira sugerir a criação do id para hierarquia da classe, para criar o id – que será o id da tabela no banco de dados; insira o código abaixo antes do atributo idPessoa. Será necessário alterar de public para private o atributo idPessoa. Não deixe de fazer as importações sugeridas pelo Netbeans, porém selecione sempre as que começam com javax.persistence @Id @GeneratedValue(strategy = GenerationType.AUTO) private int idPessoa; Benefrancis do Nascimento SISTEMA WEB 24 Informando ao Hibernate quais os atributos da classe pessoa que serão persistidos Necessitamos informar ao Hibernate quais atributos serão persistidos no banco de dados. Para isso deverão incluir as anotações conforme imagem abaixo: Benefrancis do Nascimento SISTEMA WEB 25 Benefrancis do Nascimento SISTEMA WEB 26 Figura 16 ‐ Atributos da classe pessoa que serão persistidos Encapsulando atributos da classe Pessoa Para encapsular os campos da classe Pessoa acesse o menú refatorar / encapsular campos. A tela abaixo será aberta. Selecione todos os campos e clique em refatorar. Figura 17 ‐ Encapsulando campos da classe Pessoa Criando métodos construtores para a classe Pessoa Para criar métodos construtores para a classe telefone coloque o cursor em qualquer parte do código fonte da classe Pessoa, sugiro que seja logo depois dos atributos, de o comando [ control + espaço ]; abrirá o menú suspenso conforme a imagem abaixo. Clique em cima do método com o nome da classe (o mesmo que selecionei na imagem). Repita a operação agora selecionando o método sem atributos. Benefrancis do Nascimento SISTEMA WEB 27 Figura 18 ‐ Criando método construtor para a classe Pessoa Verifiquem em nosso diagrama de classes que Pessoa é classe ansestral das classes PF e PJ (Pessoa Física e Pessoa Jurídica respectivamente). Criaremos abaixo essas classes: A Classe PF Iniciaremos a construção da classe que representará as Pessoas Físicas. Figura 19 ‐ A classe PF A classe PF herda os métodos e atributos da classe Pessoa, por este motivo o mapeamento desta classe é mais simples: bastará informar a estratégia de herança. Veja abaixo: Mapeando a Classe PF Iniciaremos o mapeamento Objeto Relacional da classe PF. Informando que a Classe PF dará origem a objetos que serão persistidos Precisamos informar ao Hibernate que a classe PF dará origem a objetos que serão Benefrancis do Nascimento SISTEMA WEB 28 persistidos em banco de dados e que os objetos do tipo PF em nosso banco de dados possui identificador 1. Este é o valor que identifica que, dentre as classes filhas de Pessoa, o número 1 será usado para PF. Veja a anotação: @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorValue("1") As anotações acima deverão ser inseridas antes do nome da classe. Veja imagem abaixo: Figura 20 ‐ Informando ao Hibernate que a Classe PF será persistida, a estratégia de Herança e o valor que a identifica entre as classes que são filhas da classe Pessoa A Classe PJ Iniciaremos a construção da classe que representará as Pessoas Jurídicas. Figura 21 ‐ A classe PJ Benefrancis do Nascimento SISTEMA WEB 29 A classe PJ, assim como a classe PF, herda os métodos e atributos da classe Pessoa, por este motivo o mapeamento desta classe é semelhante ao da classe PF. Assim como PF, bastará informar a estratégia de herança. Veja abaixo: Mapeando a Classe PJ Iniciaremos o mapeamento Objeto Relacional da classe PJ. Informando que a Classe PJ dará origem a objetos que serão persistidos Precisamos informar ao Hibernate que a classe PJ dará origem a objetos que serão persistidos em banco de dados e que os objetos do tipo PJ em nosso banco de dados possui identificador "2". Este é o valor que identifica que, dentre as classes filhas de Pessoa, o número "2" será usado para PJ. Veja a anotação: @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorValue("2") As anotações acima deverão ser inseridas antes do nome da classe. Veja imagem abaixo: Figura 22 ‐ Informando ao Hibernate que a Classe PJ será persistida, a estratégia de Herança e o valor que a identifica entre as classes que são filhas da classe Pessoa Benefrancis do Nascimento SISTEMA WEB 30 A Classe Telefone Figura 23 ‐ Atributos da Classe Telefone Métodos da classe Telefone que interagem com o banco de dados Incluiremos os métodos salvar, consultar, alterar e excluir na classe Telefone. Esses métodos serão a ligação entre a classe Telefone e a classe telefoneDAO. Abaixo mostramos os métodos da classe Telefone. Obs: Quando estiver inserindo os métodos abaixo, o Netbeans irá sugerir a criaçãodos métodos na Classe TelefoneDAO. Aceite a sugestão. public static boolean salvar(Telefone t) { return TelefoneDAO.salvar(t); } public static boolean salvar(Pessoa p) { return TelefoneDAO.salvar(p); } public static Telefone consultar(int idTelefone) { return TelefoneDAO.consultar(idTelefone); Benefrancis do Nascimento SISTEMA WEB 31 } public static Collection<Telefone> consultar(Pessoa p) { return TelefoneDAO.consultar(p); } public static boolean alterar(Telefone t) { return TelefoneDAO.alterar(t); } public static boolean excluir(Telefone t) { return TelefoneDAO.excluir(t); } public static boolean excluir(Pessoa p) { return TelefoneDAO.excluir(p); } Mapeando a Classe Telefone Iniciaremos o mapeamento objeto relacional da classe Telefone. Informando que a classe Telefone dará origem a objetos que serão persistidos Para informar que a classe telefone dará origem a objetos que serão persistidos em banco de dados, basta apenas incluir a anotação @Entity antes do nome da classe. Benefrancis do Nascimento SISTEMA WEB 32 Informando ao Hibernate qual será o Id da tabela telefone Para criar o id – que será o id da tabela no banco de dados; insira o código abaixo antes do atributo idTelefone. Não deixe de fazer as importações sugeridas pelo Netbeans, porém selecione sempre as que começam com javax.persistence. Figura 24 ‐ Informando ao Hibernate qual será o Id da tabela telefone Informando ao Hibernate quais os atributos da classe Telefone que serão persistidos Benefrancis do Nascimento SISTEMA WEB 33 Figura 25 ‐ Atributos da classe Telefone que serão persistidos Encapsule os atributos da classe Telefone Para encapsular os campos da classe telefone acesse o menú refatorar / encapsular campos. A tela abaixo será aberta. Selecione todos os campos e clique em refatorar. Benefrancis do Nascimento SISTEMA WEB 34 Figura 26 ‐ Encapsulando os atributos da classe Telefone Crie métodos construtores para a classe Telefone Para criar os métodos construtores da classe telefone coloque o cursor em qualquer parte do código fonte da classe telefone, sugiro que seja logo depois dos atributos, de o comando [ control + espaço ]; abrirá o menú suspenso conforme a imagem abaixo. Clique em cima do método com o nome da classe (o mesmo que selecionei na imagem). Repita a operação agora selecionando o método sem atributos. Figura 27 ‐ Criando método construtor para a classe Telefone Benefrancis do Nascimento SISTEMA WEB 35 A classe Endereco Figura 28 ‐ Atributos da classe Endereco Métodos da classe Endereco que interagem com o banco de dados Incluiremos os métodos salvar, consultar, alterar e excluir na classe Endereco. Esses métodos serão a ligação entre a classe Endereco e a classe EnderecoDAO. Abaixo mostramos os métodos da classe Endereco. Obs: Quando estiver inserindo os métodos abaixo, o Netbeans irá sugerir a criação dos métodos na Classe EnderecoDAO. Aceite a sugestão. public static boolean salvar(Endereco e) { return EnderecoDAO.salvar(e); } Benefrancis do Nascimento SISTEMA WEB 36 public static boolean salvar(Pessoa p) { return EnderecoDAO.salvar(p); } public static Endereco consultar(int idEndereco) { return EnderecoDAO.consultar(idEndereco); } public static ArrayList<Endereco> consultar(Pessoa p) { return EnderecoDAO.consultar(p); } public static boolean alterar(Endereco e) { return EnderecoDAO.alterar(e); } public static boolean excluir(Endereco e) { return EnderecoDAO.excluir(e); } public static boolean excluir(Pessoa p) { return EnderecoDAO.excluir(p); } Mapeando a classe Endereco Iniciaremos o mapeamento objeto relacional da classe Endereco. Benefrancis do Nascimento SISTEMA WEB 37 Informando que a classe Endereco dará origem a objetos que serão persistidos Para informar que a classe Endereco dará origem a objetos que serão persistidos em banco de dados, basta apenas incluir a anotação @Entity antes do nome da classe. Informando ao Hibernate qual será o Id da tabela endereco Para criar o id – que será o id da tabela no banco de dados; insira o código abaixo antes do atributo idEndereco. Não deixe de fazer as importações sugeridas pelo Netbeans, porém selecione sempre as que começam com javax.persistence. Figura 29 ‐ Informando ao Hibernate qual será o Id da tabela endereço Informando ao Hibernate quais os atributos da classe Endereco que serão persistidos Benefrancis do Nascimento SISTEMA WEB 38 Figura 30 ‐ Os atributos da classe Endereco que serão persistidos Benefrancis do Nascimento SISTEMA WEB 39 Encapsule os atributos da classe Endereco Para encapsular os campos da classe endereco acesse o menú refatorar / encapsular campos. A tela abaixo será aberta. Selecione todos os campos e clique em refatorar. Figura 31 ‐ Encapsulando campos da classe endereço Crie métodos construtores para a classe Endereco Para criar métodos construtores para a classe endereço, coloque o cursor em qualquer parte do código fonte da classe Endereco, sugiro que seja logo depois dos atributos, de o comando [ control + espaço ]; abrirá o menú suspenso conforme a imagem abaixo. Clique em cima do método com o nome da classe (o mesmo que selecionei na imagem). Repita a operação agora selecionando o método sem atributos. Benefrancis do Nascimento SISTEMA WEB 40 Figura 32 ‐ Métodos construtores para a classe Endereco A classe DocReceita Codificaremos agora a classe DocReceita. Figura 33 ‐ A interface DocReceita Mapeando a classe DocReceita Iniciaremos o mapeamento objeto relacional da classe DocReceita. Benefrancis do Nascimento SISTEMA WEB 41 Informando que a classe DocReceita dará origem a objetos que serão persistidos Para informar que a classe DocReceita dará origem a objetos que serão persistidos em banco de dados, basta apenas incluir a anotação @Entity antes do nome da classe, porém docReceita será a classe mãe de CPF e CNPJ, desta forma será necessário informar qual a estratégia de herança que utilizaremos. @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "tipo") Informando ao Hibernate quais os atributos da classe DocReceita que serão persistidos Benefrancis do Nascimento SISTEMA WEB 42 Figure 1 ‐ Atributos da classe DocReceita que serão persistidos Benefrancis do Nascimento SISTEMA WEB 43 A classe CPF Codificaremos agora a classe CPF. Esta classe implementa a Interface DocReceita. Portanto deverá possuir o método validar e getNumero. Figura 34 ‐ A classe CPF O método que validará o CPF Abaixo apresento o método utilizado para calcular o dígito de um CPF. Na imagem acima ele está oculto, para melhor visualização. Benefrancis do Nascimento SISTEMA WEB 44 Figura 35 ‐ Método utilizado para calcular o dígito de um CPF. Deve estar dentro da classe CPF A classe CNPJ A classe CNPJ, assim como a classe CPF implementa a interface DocReceita, portanto também deverá possuir os métodos validar e getnumero. Benefrancis do Nascimento SISTEMA WEB 45 Figura 36 ‐ A classe CNPJ O método que validará o CNPJ Abaixo apresento o método utilizado para calcular o dígito de um CNPJ. Na imagem acima ele está oculto, para melhor visualização. Benefrancis do NascimentoSISTEMA WEB 46 Figura 37 ‐ Método utilizado para calcular o dígito de um CNPJ. Deve estar dentro da classe CNPJ. Benefrancis do Nascimento SISTEMA WEB 47 A classe Animal Iniciaremos a codificação da classe abstrata Animal. Figura 38 ‐ A classe Abstrata Animal Métodos da classe Animal que interagem com o banco de dados Incluiremos os métodos salvar, consultar, alterar e excluir na classe Animal. Esses métodos serão a ligação entre a classe Animal e a classe animalDAO. Abaixo mostramos os métodos da classe Animal. Obs: Quando estiver inserindo os métodos abaixo, o Netbeans irá sugerir a criação dos métodos na Classe AnimalDAO. Aceite a sugestão. public static boolean salvar(Animal a) { return AnimalDAO.salvar(a); } public static boolean salvar(Pessoa p) { Benefrancis do Nascimento SISTEMA WEB 48 return AnimalDAO.salvar(p); } public static Animal consultar(int idAnimal) { return AnimalDAO.consultar(idAnimal); } public static Collection<Animal> consultar() { return AnimalDAO.consultar(); } public static Collection<Animal> consultar(Pessoa p) { return AnimalDAO.consultar(p); } public static boolean alterar(Animal a) { return AnimalDAO.alterar(a); } public static boolean excluir(Animal a) { return AnimalDAO.excluir(a); } public static boolean excluir(Pessoa p) { return AnimalDAO.excluir(p); } Mapeando a classe Animal Iniciaremos o mapeamento objeto relacional da classe Animal. Benefrancis do Nascimento SISTEMA WEB 49 Informando que a classe Animal dará origem a objetos que serão persistidos Precisamos informar ao Hibernate que a classe Animal dará origem a objetos que serão persistidos em banco de dados e qual será a estratégia para hierarquia. Para isso utilizamos as seguintes anotações: @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "tipo") As anotações acima deverão ser inseridas antes do nome da classe. Veja imagem abaixo: Figura 39 ‐ informar ao Hibernate que a classe Animal dará origem a objetos que serão persistidos em banco de dados e qual será a estratégia para hierarquia Benefrancis do Nascimento SISTEMA WEB 50 Informando ao Hibernate qual será o Id da tabela animal O Netbeans ira sugerir a criação do id para hierarquia da classe, para criar o id – que será o id da tabela no banco de dados; insira o código abaixo antes do atributo idAnimal. Não deixe de fazer as importações sugeridas pelo Netbeans, porém selecione sempre as que começam com javax.persistence @Id @GeneratedValue(strategy = GenerationType.AUTO) private int idAnimal; Figura 40 ‐ A criação do id para hierarquia da classe Benefrancis do Nascimento SISTEMA WEB 51 Informando ao Hibernate quais os atributos da classe animal que serão persistidos Figura 41 ‐ Os atributos da classe animal que serão persistidos Benefrancis do Nascimento SISTEMA WEB 52 Encapsule os atributos da classe Animal Para encapsular os campos da classe animal acesse o menú refatorar / encapsular campos. A tela abaixo será aberta. Selecione todos os campos e clique em refatorar. Figura 42 ‐ Encapsulando campos da classe Animal Crie métodos construtores para a classe Animal Para criar métodos construtores para a classe Animal, coloque o cursor em qualquer parte do código fonte da classe Animal, sugiro que seja logo depois dos atributos, de o comando [ control + espaço ]; abrirá o menú suspenso conforme a imagem abaixo. Clique em cima do método com o nome da classe (o mesmo que selecionei na imagem). Repita a operação agora selecionando o método sem atributos. Figura 43 ‐ Métodos construtores para a classe Animal Benefrancis do Nascimento SISTEMA WEB 53 A classe Cachorro Exibimos abaixo a classe Cachorro já com as devidas anotações e o método construtor. Figura 44 ‐ A classe Cachorro já com as devidas anotações e o método construtor. Benefrancis do Nascimento SISTEMA WEB 54 A classe Gato Exibimos abaixo a classe Gato já com as devidas anotações e o método construtor. Figura 45 ‐ A classe Gato já com as devidas anotações e o método construtor Benefrancis do Nascimento SISTEMA WEB 55 A classe abstrata Servico Iniciaremos a codificação da classe abstrata Servico. Figura 46 ‐ A classe abstrata serviço Métodos da classe Servico que interagem com o banco de dados A seguir os métodos salvar, consultar, alterar e excluir da classe Servico. Quando estiver incluindo os métodos abaixo na classe Servico o Netbeans irá sugerir a criação dos métodos na classe ServicoDAO. Aceite a sugestão. Benefrancis do Nascimento SISTEMA WEB 56 public static boolean salvar(Servico s) { return ServicoDAO.salvar(s); } public static boolean salvar(Animal a) { return ServicoDAO.salvar(a); } public static Servico consultar(int idServico) { return ServicoDAO.consultar(idServico); } public static Collection<Servico> consultar(Animal a) { return ServicoDAO.consultar(a); } public static Collection<Servico> consultar() { return ServicoDAO.consultar(); } public static boolean alterar(Servico s) { return ServicoDAO.alterar(s); } public static boolean excluir(Servico s) { return ServicoDAO.excluir(s); } public static boolean excluir(Animal a) { return ServicoDAO.excluir(a); } Benefrancis do Nascimento SISTEMA WEB 57 Mapeando a Classe Servico Iniciaremos o mapeamento objeto relacional da classe abstrata Servico. Informando que a classe Servico dará origem a objetos que serão persistidos Precisamos informar ao Hibernate que a classe Servico dará origem a objetos que serão persistidos em banco de dados. Para isso utilizamos a seguinte anotação: @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "tipo") As anotações acima deverão ser inseridas antes do nome da classe. Veja imagem abaixo: Figura 47 ‐ A classe Servico dará origem a objetos que serão persistidos em banco de dados Benefrancis do Nascimento SISTEMA WEB 58 Informando ao Hibernate quais os atributos da classe Servico que serão persistidos As constantes não serão mapeadas. Figura 48 ‐ Informando ao Hibernate quais os atributos da classe Servico que serão persistidos Benefrancis do Nascimento SISTEMA WEB 59 Encapsule os atributos da classe Servico Para encapsular os campos da classe Servico acesse o menú refatorar / encapsular campos. A tela abaixo será aberta. Selecione todos os campos e clique em refatorar. Figura 49 ‐ Encapsulando campos da classe Servico Crie métodos construtores para a classe Servico Para criar métodos construtores para a classe Servico, coloque o cursor em qualquer parte do código fonte da classe Servico, sugiro que seja logo depois dos atributos, de o comando [ control + espaço ]; abrirá o menú suspenso conforme a imagem abaixo. Clique em cima do método com o nome da classe (o mesmo que selecionei na imagem). Repita a operação agora selecionando o método sem atributos. Benefrancis do Nascimento SISTEMA WEB 60 Figura 50 ‐ Métodos construtores para a classe Servico A classe Banho Abaixo o código e anotações da classe Banho Figure 2 ‐ A classe Banho Benefrancis do Nascimento SISTEMA WEB 61 A classe Consulta Abaixo o código e anotaçõesda classe Consulta Figure 3 ‐ A classe consulta Benefrancis do Nascimento SISTEMA WEB 62 A classe Tosa Abaixo o código e anotações da classe Tosa A classe Vacina Abaixo o código e anotações da classe Vacina Benefrancis do Nascimento SISTEMA WEB 63 Utilizando o Hibernate para criar as tabelas no banco de dados Benefrancis do Nascimento SISTEMA WEB 64 Atualizando o arquivo hibernate.cfg.xml Neste momento atualizaremos o arquivo hibernate.cfg.xml. Deveremos incluir informação sobre as classes que foram mapeadas em nossa aplicação Java. Abra o arquivo e inclua entre as tags <session‐factory> </session‐factory> o código abaixo: <mapping class="br.com.benefrancis.controle.Pessoa" /> <mapping class="br.com.benefrancis.controle.PF" /> <mapping class="br.com.benefrancis.controle.PJ" /> <mapping class="br.com.benefrancis.controle.DocReceita" /> <mapping class="br.com.benefrancis.controle.CPF" /> <mapping class="br.com.benefrancis.controle.CNPJ" /> <mapping class="br.com.benefrancis.controle.Telefone" /> <mapping class="br.com.benefrancis.controle.Endereco" /> <mapping class="br.com.benefrancis.controle.Animal" /> <mapping class="br.com.benefrancis.controle.Cachorro" /> <mapping class="br.com.benefrancis.controle.Gato" /> <mapping class="br.com.benefrancis.controle.Servico" /> <mapping class="br.com.benefrancis.controle.Banho" /> <mapping class="br.com.benefrancis.controle.Consulta" /> <mapping class="br.com.benefrancis.controle.Tosa" /> <mapping class="br.com.benefrancis.controle.Vacina" /> Benefrancis do Nascimento SISTEMA WEB 65 Criando uma conexão com o hibernate Para obter conexões com o Hibernate criamos a classe ConexaoHibernate no pacote modelo. O código poderá ser visualizado na imagem abaixo: Figura 51 ‐ A classe ConexaoHibernate A classe ConexaoHibernate possui um bloco estático no qual por meio da variável sessionFactory capturamos as configurações inseridas no arquivo hibernate.cfg.xml. Criamos também um método estático getInstance() que retornará uma sessão. Benefrancis do Nascimento SISTEMA WEB 66 Criando uma classe para testar o funcionamento do Hibernate Criaremos a classe TestandoHibernate no pacote modelo. Esta classe será utilizada para testar o funcionamento do nosso sistema. A principio criaremos um método estático para gerar as tabelas no banco de dados. E um método main, pois neste momento poderemos executar o sistema para testar o funcionamento. Figura 52 ‐ Testando o funcionamento do Hibernate Podemos agora executrar este arquivo por meio do atalho [ shift + F6 ] . O console irá imprimir diversas informações e entre elas os comandos do SQL para criação das tabelas no banco de dados. Abaixo, segue o que foi imprimido: Benefrancis do Nascimento SISTEMA WEB 67 Figura 53 ‐ Saída do console da aplicação quando executamos o método gerarTabelas da classe TestandoHibernate Agora voltaremos para o HeidiSQL para verificar as tabelas criadas pela nossa aplicação: Figura 54 ‐ Verificando no HeidiSql as tabelas geradas Benefrancis do Nascimento SISTEMA WEB 68 Programando as classes DAO Benefrancis do Nascimento SISTEMA WEB 69 Introdução Programaremos os métodos das classes de acesso e manipulação dos dados de nossa aplicação. Quando estávamos criando os métodos salvar, consultar, alterar e excluir das classes do pacote controle, o Netbeans nos sugeria criar os métodos nas classes DAO do pacote modelo. Caso tenha aceitado conforme orientei os métodos foram criados nas respectivas classes DAO. Porém o conteúdo dos métodos lança uma exceção dizendo que o método não foi implementado. Veja a exceção abaixo: Figura 55 ‐ Exceção de método que não foi implementado Deveremos inserir o conteúdo dos métodos das classes DAO. E esta será a nossa atividade neste capitulo. Os códigos das classes DAO serão muito semelhantes aos métodos das outras classes de acesso e manipulação de dados. Vejam. Implementado os métodos da classe PessoaDAO Para persistir e manipular os dados em nossa aplicação com segurança trabalharemos com o conceito de transação. O hibernate possui o objeto Transaction para esse fim. Desta forma, em caso de erro durante o processamento a aplicação fará o rollback, mantendo assim nosso banco de dados integro. Toda comunicação nesses métodos dependerão de uma sessão com o hibernate, por esse motivo utilizaremos a variável session do tipo org.hibernate.Session. Benefrancis do Nascimento SISTEMA WEB 70 Salvar Neste método salvaremos uma pessoa no banco de dados. O método espera como parâmetro um objeto do tipo Pessoa. Poderemos enviar pessoas físicas e pessoas jurídicas, pois este é um clássico método polifórmico. Figura 56 ‐ Método salvar da classe PessoaDAO Para salvar uma pessoa no banco de dados utilizamos polimorfismo por meio de método polifórmico. Repare que no método salvar o parâmetro esperado é do tipo Pessoa, entretanto se enviarmos uma PF ou PJ as informações serão salvas corretamente nas tabelas do banco de dados. Outra técnica importante da orientação a objeto empregada nesta classe é a sobrecarga de métodos presente no método consultar (veja a assinatura dos métodos). Benefrancis do Nascimento SISTEMA WEB 71 Consultar pessoa pelo id Neste método consultaremos uma pessoa pelo id. Este método espera um inteiro como parâmetro. Retornará um objeto do tipo Pessoa. Figura 57 ‐ Consultando Pessoa pelo id Benefrancis do Nascimento SISTEMA WEB 72 Consultar Todas as pessoas Usaremos a sobrecarga de métodos para criar mais uma opção de consulta. Agora consultaremos todas as pessoas cadastradas. Figura 58 ‐ Consultando todas as pessoas cadastradas Benefrancis do Nascimento SISTEMA WEB 73 Consultar pessoa pelo nome Consultaremos pessoa pelo nome. Este método espera como parâmetro uma String e retornará uma coleção de objetos do tipo pessoa. Figura 59‐ Consultando pessoas pelo nome Benefrancis do Nascimento SISTEMA WEB 74 Alterando pessoas Agora abordaremos o método alterar. Este método recebe um objeto do tipo pessoa como parâmetro e retorna verdadeiro; se a atualização for concretizada, ou falso caso aconteça alguma exceção. Figura 60 ‐ Alterando pessoa Benefrancis do Nascimento SISTEMA WEB 75 Excluindo pessoas Codificaremos o método excluir. Este método recebe como parâmetro um objeto do tipo pessoa e retornará verdadeiro; se a transação concluir com sucesso, ou falso caso aconteça alguma exceção. Figura 61 ‐ Excluindo pessoas Benefrancis do Nascimento SISTEMA WEB 76 Implementado os métodos da classe AnimalDAO Salvar Neste método salvaremos um animal no banco de dados. O método espera como parâmetro um objeto do tipo Animal. Poderemos enviar cachorros ou gatos, pois este é um clássico método polifórmico. Figura 62 ‐ Salvando animais Benefrancis do Nascimento SISTEMA WEB 77 Salvando todos os animais de uma pessoa Criamos um método para salvar todos os animais de uma pessoa. Figura 63 ‐ Salvando todos os animais de uma pessoa Benefrancis do Nascimento SISTEMA WEB 78 Consultando animais pelo Id Codificaremos o método que consulta animal pelo id Figura 64 ‐ Consultando animais peloId Benefrancis do Nascimento SISTEMA WEB 79 Alterando animais Codificaremos o método alterar da classe animalDAO. Figura 65 ‐ Alterando animal Benefrancis do Nascimento SISTEMA WEB 80 Excluindo animal Abaixo o código do método excluir da classe AnimalDAO. Figura 66 ‐ Excluindo animal Benefrancis do Nascimento SISTEMA WEB 81 Excluindo todos os animais de uma pessoa Codificaremos um método para exclusão de todos os animais de uma pessoa. Figura 67 ‐ Excluindo todos os animais de uma pessoa Benefrancis do Nascimento SISTEMA WEB 82 Implementado os métodos da classe ServicoDAO Iniciaremos agora a codificação dos métodos da classe ServicoDAO. Salvar Abaixo o método salvar da classe ServicoDAO. Figura 68 ‐ Salvando serviços Benefrancis do Nascimento SISTEMA WEB 83 Consultando serviço pelo id Abaixo o código para consulta de serviço pelo id. Figura 69 ‐ Consultando serviço pelo id Benefrancis do Nascimento SISTEMA WEB 84 Salvando todos os serviços de um animal Codificaremos um método para salvar todos os serviços de um animal. Figura 70 ‐ Salvando todos os serviços de um animal Benefrancis do Nascimento SISTEMA WEB 85 Consultando todos os serviços de um animal Codificaremos o método que deverá retornar todos serviços realizados em um animal. Figura 71 ‐ Consultando todos serviços realizados em um animal Benefrancis do Nascimento SISTEMA WEB 86 Excluindo todos os serviços de um animal Codificaremos um método para que seja possível excluir todos os serviços de um animal. Figura 72 ‐ Excluindo todos os serviços de um animal Benefrancis do Nascimento SISTEMA WEB 87 Alterando serviço Desenvolvendo método para alterar um serviço. Figura 73 ‐ Alterando serviço Benefrancis do Nascimento SISTEMA WEB 88 Excluindo serviço Abaixo o código para exclusão de serviço Figura 74 ‐ Excluindo serviço Benefrancis do Nascimento SISTEMA WEB 89 Implementado os métodos da classe TelefoneDAO Iniciaremos agora a codificação dos métodos da classe TelefoneDAO. salvar Figura 75 ‐ Salvando um telefone Benefrancis do Nascimento SISTEMA WEB 90 Consultando telefone pelo Id Figura 76 ‐ Consultando telefone pelo id Benefrancis do Nascimento SISTEMA WEB 91 Consultando todos os telefones de uma pessoa O método abaixo prove a consulta de todos os telefones de uma pessoa. Figura 77 ‐ Consultando todos os telefones de uma pessoa Benefrancis do Nascimento SISTEMA WEB 92 Salvando todos os telefones de uma pessoa O método abaixo salva todos os telefones de uma pessoa Figura 78 ‐ Salvando todos os telefones de uma pessoa Benefrancis do Nascimento SISTEMA WEB 93 Excluindo telefone O método abaixo exclui um telefone da base de dados Figura 79 ‐ Excluindo telefone Benefrancis do Nascimento SISTEMA WEB 94 Excluindo todos os telefones de uma pessoa O código abaixo exclui todos os telefones de uma pessoa Figura 80 ‐ Excluindo todos os telefones de uma pessoa Benefrancis do Nascimento SISTEMA WEB 95 Implementado os métodos da classe EnderecoDAO Iniciaremos agora a codificação dos métodos da classe EnderecoDAO. Salvar O método abaixo salva um endereço no banco de dados Figura 81 ‐ Salvando todos os endereços de uma pessoa Benefrancis do Nascimento SISTEMA WEB 96 Consultando endereço pelo Id O método abaixo consulta endereço pelo Id. Figura 82‐ Consultando endereço pelo id Benefrancis do Nascimento SISTEMA WEB 97 Consultando todos os endereços de uma pessoa O método abaixo consulta todos os endereços de uma pessoa. Figura 83 ‐ Consultando todos os endereços de uma pessoa Benefrancis do Nascimento SISTEMA WEB 98 Alterando um endereço Abaixo codificaremos um método para alterar endereço Figura 84 ‐ Alterando um endereço Benefrancis do Nascimento SISTEMA WEB 99 Excluindo um endereço O método abaixo exclui um endereço Figura 85 ‐ Excluindo endereço Benefrancis do Nascimento SISTEMA WEB 100 Excluindo todos os endereços de uma pessoa O método abaixo exclui todos os endereços de uma pessoa. Figura 86 ‐ Excluindo todos os endereços de uma pessoa Benefrancis do Nascimento SISTEMA WEB 101 Testando os métodos das classes do pacote DAO Benefrancis do Nascimento SISTEMA WEB 102 Salvando pessoa, telefone, endereço, animais e serviços. Testaremos agora os métodos das classes do pacote DAO. Para isso incluiremos um método a classe TestandoHibernate. Neste método invocamos apenas o método salvar da classe Pessoa, porém todos os outros objetos a ela relacionados foram criados. Veja código abaixo: private static void persistindo() throws Exception { PF pf = new PF(); pf.setNome("Benefrancis do Nascimento"); pf.setEmail("benefrancis@gmail.com"); pf.setSenha("root"); DocReceita cpf = new CPF("24878891874"); pf.setDocReceita(cpf); cpf.setPessoa(pf); Endereco end = new Endereco(); end.setBairro("Jd Leni"); end.setCep("05818250"); end.setCidade("São Paulo"); end.setLogradouro("Rua faustino Allende"); end.setNumero("39"); end.setUf("SP"); end.setPessoa(pf); Benefrancis do Nascimento SISTEMA WEB 103 Collection<Endereco> e = new ArrayList<Endereco>(); e.add(end); pf.setEndereco(e); Telefone t = new Telefone(); t.setDdd(11); t.setNumero("8281‐6536"); t.setPessoa(pf); Collection<Telefone> tel = new ArrayList<Telefone>(); tel.add(t); pf.setTelefone(tel); Animal a = new Cachorro(); Date d = new Date(2000, 5, 15); a.setDataNascimento(d); a.setNome("Pluto"); a.setRaca("Vira lata"); a.setSexo('M'); a.setObservacao("Cachorro muito sem vergonha!"); a.setPessoa(pf); Servico s = new Banho(); Date diaBanho = new Date(2010, 11, 18); s.setData(diaBanho); Benefrancis do Nascimento SISTEMA WEB 104 s.setDescricao("Banho completo"); s.setValor(20.95); s.setAnimal(a); Collection<Servico> serv = new ArrayList<Servico>(); serv.add(s); a.setServico(serv); Collection<Animal> ani = new ArrayList<Animal>(); ani.add(a); pf.setAnimal(ani); pf.salvar(pf); } Verificaremos agora no HeidiSql se todos os campos das tabelas foram preenchidos corretamente. Para isso executaremos o seguinte comando: select Pessoa.*, Endereco.*, Animal.*, Servico.* from Pessoa left join Telefone on (Pessoa.idPessoa = Telefone.idPessoa) left join Endereco on (Pessoa.idPessoa = Endereco.idPessoa) left join Animal on (Pessoa.idPessoa = Animal.idPessoa) left join Servico on (Animal.idAnimal = Servico.idAnimal); Benefrancis do Nascimento SISTEMA WEB 105 Figura 87 ‐ Resultado da consulta dos dados gravados no banco de dadosBenefrancis do Nascimento SISTEMA WEB 106 Criando as páginas JSP Benefrancis do Nascimento SISTEMA WEB 107 Mapa do site O nosso sistema web deverá seguir a estrutura representada no mapa do site abaixo: Index.jsp Inicio.jsp Pessoa.jsp Registrar.jsp Animal.jsp Animal.jsp Detalhe_animal.jsp Editar_animal.jsp Excluir_animal.jsp Pessoa.jsp Detalhe_pessoa.jsp Editar_pessoa.jsp Excluir_pessoa.jsp Servico.jsp Detalhe_servico.jsp Editar_servico.jsp Excluir_servico.jsp cadastros serviços consultas Figura 88‐ Mapa do site Criando diretórios necessários Agora trabalharemos com a camada de apresentação e, desta forma será necessário criar diretórios para armazenar imagens, css, javascript e etc. Para criar um diretório no seu projeto web. Clique com o botão direito do mouse em cima da pasta Páginas web um menú suspenso aparecerá; nele selecione: Novo / Diretório. A janela abaixo será exibida. Benefrancis do Nascimento SISTEMA WEB 108 Figura 89 ‐ Criando um novo diretório acessível para a internet no seu projeto web Crie os diretórios conforme tabela abaixo: Tabela 1 – Os diretórios do nosso sistema web. Neles estão as imagem, css, javascript e etc. (Solicite para o professor pelo e‐mail: Benefrancis@gmail.com) NOME Motivo images Será o local onde guardaremos as imagens do nosso sistema web. css Onde serão inseridos os arquivos de estilo. javascript Onde estarão os arquivos Java script geral Onde estará o conteúdo html que aparecerá em todas as telas: head.jsp – onde faremos os importes necessários. topo.jsp – topo do site e o menú rodapé.jsp – rodapé do site inicio.jsp – tela de boas vindas do sistema (após autenticação) Benefrancis do Nascimento SISTEMA WEB 109 Iniciando a programação das páginas JSP Importando as classes necessárias Para se trabalhar com classes Java em páginas JSP, necessitaremos fazer o importe das classes que precisaremos utilizar. Portanto em nossa aplicação necessitaremos fazer o importe das classes do pacote controle. Para evitar esquecimento de alguma classe poderemos fazer o importe de todas as classes deste pacote. Veja como fazer na segunda linha do código na imagem abaixo: Figura 90 ‐ Importando todas as classes do pacote controle Portanto inclua a tag <%@page import="br.com.benefrancis.controle.*"%> em todas as páginas de nosso sistema web. Index.jsp O arquivo index.jsp deverá está na raiz da nossa aplicação web (diretório Páginas web). Na pagina index, ou seja, a primeira página que será aberta em nossa aplicação. Desenvolveremos uma tela onde o usuário deverá ser autenticado. A tela deverá ter um formulário. Veja a tag: <form name="FrmLogin" id="FrmLogin" method="POST" action="index.jsp"> <!—Incluir os campos do formulário aqui ‐‐> </form> Deverá possuir um campo oculto, dois campos editáveis e um botão obedecendo ao que descreve a tabela abaixo: TIPO NOME SIZE VALUE text usuario 15 password senha 15 hidden op ‐ 1 submit btn_autenticar Autenticar Benefrancis do Nascimento SISTEMA WEB 110 O design semelhante à tela da imagem a seguir: Figura 91 ‐ Layout da página index.jsp Código fonte Java da pagina index.jsp O código fonte da imagem abaixo recebe na linha 52 o valor do campo hidden e o converte para inteiro, já nas linhas 57 e 58 receberá os parâmetros sobre usuário e senha do formulário e aciona o método autenticar do objeto PF. Benefrancis do Nascimento SISTEMA WEB 111 Figura 92 ‐ Autenticando ‐ index.jsp Código fonte completo da pagina index.jsp <%@page contentType="text/html" pageEncoding="UTF‐8"%> <%@page import="br.com.benefrancis.controle.*"%> <!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>PETSHOP</title> <link rel="stylesheet" type="text/css" href="css/Estilo.css"> </head> <body> Benefrancis do Nascimento SISTEMA WEB 112 <form name="FrmLogin" id="FrmLogin" method="POST" action="index.jsp"> <table width="103%" border="0" cellpadding="0" cellspacing="0"align="center" > <tr> <td align="center" valign="middle"> <table width="750" border="0" cellspacing="0" cellpadding="0" align="center" > <tr> <td width="40%" height="500" align="center" valign="middle"> <img src="images/login.png" alt="Petshop"/> </td> <td width="60%" align="center" valign="middle"> <table border="0" > <tr> <td class="Txt">USUARIO</td> <td class="Txt"><input type="text" name="usuario" value="" size="15"/></td> </tr> <tr> <td class="Txt">SENHA</td> <td class="Txt"><input type="password" name="senha" value="" size="15" /></td> </tr> <tr> <td colspan="2"><hr size="1"><input type="hidden" name="op" value="1" /></td> </tr> <tr> Benefrancis do Nascimento SISTEMA WEB 113 <td></td> <td><input type="submit" value="Autenticar" name="btn_autenticar" /></td> </tr> <tr><td colspan="2" class="Txt"> <% String usuario = ""; String senha = ""; int op = 0; try { op = Integer.parseInt(request.getParameter("op")); } catch (Exception ex) {} try { if (op == 1) { usuario = request.getParameter("usuario"); senha = request.getParameter("senha"); Autenticavel p = new PF().autenticar(usuario, senha); if (p != null) { session.setAttribute("Usuario", p); String novaURL = "geral/inicio.jsp"; response.sendRedirect(novaURL); } else { out.print("<br>"); out.print("<center><font face='verdana' color='red' " + "size='2'>Usuario ou senha inválidos</font></center>"); out.print("<br>"); Benefrancis do Nascimento SISTEMA WEB 114 } } } catch (Exception e) {} %> </td> </tr> </table> </td> </tr> </table> </td> </tr> </table> </form> </body> </html> Benefrancis do Nascimento SISTEMA WEB 115 Codificando arquivos do diretório geral Benefrancis do Nascimento SISTEMA WEB 116 Head.jsp Abaixo o conteúdo do arquivo head.jsp Figura 93 ‐ conteúdo do arquivo head.jsp Benefrancis do Nascimento SISTEMA WEB 117 Topo.jsp Abaixo o conteúdo do arquivo topo.jsp Figura 94 ‐ Códigodo arquivo topo.jsp Rodapé.jsp Abaixo o código do arquivo rodapé.jsp Figura 95 ‐ Código do arquivo rodapé.jsp Benefrancis do Nascimento SISTEMA WEB 118 Inicio.jsp Abaixo o código do arquivo inicio.jsp. A tela de boas vindas da nossa aplicação. Figura 96 ‐ Código do arquivo inicio.jsp Benefrancis do Nascimento SISTEMA WEB 119 Layout da tela de boas vindas Abaixo a tela de boas vindas da nossa aplicação. Figura 97 ‐ A tela de boas vindas da nossa aplicação Benefrancis do Nascimento SISTEMA WEB 120 Codificando arquivos do diretório cadastros Benefrancis do Nascimento SISTEMA WEB 121 Pessoa.jsp O arquivo pessoa.jsp do diretório cadastros será a nossa tela para cadastramento de pessoas em nosso sistemas. Uma pessoa será um usuário ‐ utilizador do sistema. O sistema deverá verificar se existe uma pessoa cadastrada no sistema. Para fazer a verificação deveremos verificar, antes do cadastramento de uma pessoa, se: 1º. O e‐mail informado já está registrado no banco de dados; 2º. Se o documento da receita já está cadastrado no sistema. A tela deverá possuir um formulário. Veja a tag: <form action="pessoa.jsp" method="post" name="Formulario" > <!—Incluir os elementos do formulário aqui ‐‐> </form> Elementos do formulário Abaixo segue a lista dos elementos e suas propriedades: Tabela 2 ‐ Elementos do formulário da página para cadastramento de pessoa Índice Id Nome Tipo Valor Tamanho Tamanho máximo 0 Tipo Tipo select 1 razao razao text 50 100 2 CNPJ CNPJ text 24 18 3 Nome Nome text 50 100 4 CPF CPF text 17 14 5 email email text 50 200 6 senha senha text 50 200 7 TelDDD TelDDD text 2 2 8 Tel Tel text 12 10 Benefrancis do Nascimento SISTEMA WEB 122 9 TelCelDDD text 2 2 10 TelCel text 12 10 11 TelFaxDDD text 2 2 12 TelFax text 12 10 13 logradouro text 50 50 14 Numero text 10 10 15 Complemento text 30 50 16 Bairro text 30 50 17 Cidade text 30 50 18 uf select 19 CEP text 12 9 20 op hidden 1 21 Btn_Entrar button Cadastrar Código fonte Java do arquivo pessoa.jsp Exibiremos abaixo o código fonte da página de cadastramento de pessoas. Não será necessário digitar o código abaixo, pois o arquivo foi disponibilizado. Benefrancis do Nascimento SISTEMA WEB 123 <%@page contentType="text/html" pageEncoding="UTF‐8"%> <%@page import="br.com.benefrancis.controle.*" %> <%@page import="br.com.benefrancis.util.Util" %> <%@page import="java.util.ArrayList" %> <%@page import="java.util.Date" %> <!DOCTYPE HTML PUBLIC "‐//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <jsp:include page="../geral/head.jsp" /> <body> <form action="pessoa.jsp" method="post" name="Formulario" > <table width="750" border="0" cellpadding="0" cellspacing="0" align="center"> <tr> <td colspan="2"> <jsp:include page="../geral/topo.jsp" /> </td> </tr> <tr> <td colspan="2"> <% int op = 0; String tipo = null; Pessoa pessoa = null; String username = null; String senha = null; DocReceita docReceita = null; try { op = Integer.parseInt(Util.SoNumero(request.getParameter("op"))); } catch (Exception ex) { Benefrancis do Nascimento SISTEMA WEB 124 } try { if (op == 1) {//O formulário foi enviado try { tipo = request.getParameter("Tipo"); } catch (Exception ex) { } if (tipo == "PJ") { String razao = null; try { razao = request.getParameter("razao"); docReceita = new CNPJ(request.getParameter("CNPJ")); //Criando uma pessoa juridica pessoa = new PJ(); pessoa.setDocReceita(docReceita); pessoa.setNome(razao); docReceita.setPessoa(pessoa); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException("<center>" + "<font face='verdana' color='red' " + "size='2'>Erro ao cadastrar Utilizador." + "<br /> Verifique os dados de Pessoa Jurídica" + " tente novamente</font></center>"); } } else { try { String nome = request.getParameter("Nome"); Benefrancis do Nascimento SISTEMA WEB 125 docReceita = new CPF(request.getParameter("CPF")); //Criando uma pessoa física pessoa = new PF(); pessoa.setDocReceita(docReceita); pessoa.setNome(nome); docReceita.setPessoa(pessoa); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException("<center>" + "<font face='verdana' color='red' " + " size='2'>Erro ao cadastrar Utilizador." + "<br /> Verifique os dados de Pessoa física" + " tente novamente</font></center>"); } } //Já existe pessoa com o CPF ou CNPJ informado? if (pessoa.existe(docReceita) == true) { if (pessoa.getTipo() == 1) { throw new RuntimeException("<br>" + "<center><font face='verdana' " + "color='red' size='2'><br />" + "já existe cliente cadastrado com" + " o CPF informado</font></center><br>"); } else { throw new RuntimeException("<br>" + "<center><font face='verdana' " + "color='red' size='2'><br />" + "já existe cliente cadastrado com" + " o CNPJ informado</font></center><br>"); Benefrancis do Nascimento SISTEMA WEB 126 } } try { username = request.getParameter("email"); senha= request.getParameter("senha"); } catch (Exception ex) { throw new RuntimeException("Verifique " + "se o e‐mail e senha foram " + "digitados corretamente"); } if (username == "" || senha == "") { throw new RuntimeException("<center>" + "<font face='verdana' color='red'" + " size='2'><br />Verifique o e‐mail " + "e senha foram digitados corretamente" + "</font></center>"); } else if (pessoa.existe(username) == true) { throw new RuntimeException("<br><center>" + "<font face='verdana' color='red' " + " size='2'><br />já existe usuário " + "cadastrado com o e‐mail digitado</font>" + "</center><br>"); } else { pessoa.setEmail(username); pessoa.setSenha(senha); } //Telefones da pessoa ArrayList<Telefone> telefone = new ArrayList<Telefone>(); Benefrancis do Nascimento SISTEMA WEB 127 try { int dddTel = Integer.parseInt(Util.SoNumero(request.getParameter("TelDDD"))); String Tel = Util.SoNumero(request.getParameter("Tel")); if (dddTel != 0 && Tel != "") { telefone.add(new Telefone(dddTel, Tel, pessoa)); } } catch (Exception eTel) { } try { int dddCel = Integer.parseInt(Util.SoNumero(request.getParameter("TelCelDDD"))); String Cel = Util.SoNumero(request.getParameter("TelCel")); if (dddCel != 0 && Cel != "") { telefone.add(new Telefone(dddCel, Cel, pessoa)); } } catch (Exception eCel) { } try { int dddFax = Integer.parseInt(Util.SoNumero(request.getParameter("TelFaxDDD"))); String Fax = Util.SoNumero(request.getParameter("TelFax")); if (dddFax != 0 && Fax != "") { telefone.add(new Telefone(dddFax, Fax, pessoa)); } } catch (Exception eFax) { } //Endereços da pessoa ArrayList<Endereco> end = new ArrayList<Endereco>(); Endereco endereco = new Endereco(); String logradouro = ""; String numero = ""; Benefrancis do Nascimento SISTEMA WEB 128 String complemento = ""; String bairro = ""; String cep = ""; String cidade = ""; String uf = ""; try { logradouro = request.getParameter("logradouro"); numero = request.getParameter("Numero"); complemento = request.getParameter("Complemento"); bairro = request.getParameter("Bairro"); cep = Util.SoNumero(request.getParameter("CEP")); cidade = request.getParameter("Cidade"); uf = request.getParameter("uf"); if (logradouro == "" || numero == "" || bairro == "" || cidade == "" || uf == "" || cep == "") { throw new RuntimeException("O endereço deve conter" + " logradouro, número, Bairro, " + "Cidade, Estado e CEP"); } else { endereco.setLogradouro(logradouro); endereco.setBairro(bairro); endereco.setCep(cep); endereco.setCidade(cidade); endereco.setComplemento(complemento); endereco.setNumero(numero); endereco.setUf(uf); endereco.setPessoa(pessoa); end.add(endereco); Benefrancis do Nascimento SISTEMA WEB 129 } } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException("Logradouro é um campo obrigatório"); } //Salvando a pessoa e todos os seua relacionamentos em banco de dados //Adicionando a Pessoa pessoa.setTelefone(telefone); pessoa.setEndereco(end); pessoa.setAnimal(null); //Salvando: pessoa.salvar(pessoa); out.print("<br>"); out.print("<br>"); out.print("<br>"); out.print("<center><font face='verdana' color='blue' size='2'>Utilizador cadastrado com sucesso</font></center>"); out.print("<br>"); out.print("<br>"); out.print("<br>"); } else {//Se op for diferente de 1 %> </td> </tr> <tr> <td width="162" class="Txt">Tipo</td> <td width="436" class="Txt"> <select name="Tipo" id="Tipo" onChange="showCampo(document.forms[0][this.name].options[document.forms[0][this.name].selecte Benefrancis do Nascimento SISTEMA WEB 130 dIndex].value,'campo_hidden');"> <option value="0">Selecione</option> <option value="PJ">PJ</option> <option value="PF">PF</option> </select> </td> </tr> <tr id="campo_hiddenPJ" style="display:none"> <td height="104" colspan="2" valign="top"> <table width="100%" border="0" cellpadding="0" cellspacing="0"> <!‐‐DWLayoutTable‐‐> <tr> <td height="1" colspan="2" valign="top"><hr size="1"></td> </tr> <tr> <td height="22" colspan="2" valign="top" class="Txt"><strong>PESSOA JURÍDICA </strong></td>
Compartilhar