Escolar Documentos
Profissional Documentos
Cultura Documentos
Treinamento Noite
Segundas, Quartas e Sextas
Início: 15/06/2020 – Término: 02/09/2020
Prof. Edson Belém
profedsonbelem@gmail.com
Celular: 98199-0108
WWW.COTIINFORMATICA.COM.BR 1
Java WebDeveloper Noite -
Aula 01 (Seg, Qua, Sex)
Tema da aula:
Projeto java, Conceitos, Padrão MVC, Encapsulamento
.
WWW.COTIINFORMATICA.COM.BR 2
Acompanhe o Blog:
www.blogedsonbelem.com.br
Indicação de livros:
Kathy Sierra
WWW.COTIINFORMATICA.COM.BR 3
Programas para Baixar:
JDK 8
https://www.oracle.com/java/technologies/javase/javase-jdk8-
downloads.html
WWW.COTIINFORMATICA.COM.BR 4
Eclipse Oxygen (essa é a versão mais estável)
https://www.eclipse.org/downloads/packages/release/oxygen/3a/e
clipse-ide-java-ee-developers
WWW.COTIINFORMATICA.COM.BR 5
MySql
https://dev.mysql.com/downloads/mysql/
Baixar a versão: 5.7.29 que utilizamos nas aulas.
WWW.COTIINFORMATICA.COM.BR 6
Digitar o nome do projeto next
Clicar em Finish
WWW.COTIINFORMATICA.COM.BR 7
Abrir a estrutura do projeto clicando na seta
WWW.COTIINFORMATICA.COM.BR 8
Digitar o nome do pacote finish
WWW.COTIINFORMATICA.COM.BR 9
Digitar o nome da classe (sempre com a letra inicial maiuscula) FINISH
Classe criada
WWW.COTIINFORMATICA.COM.BR 10
Importando um Projeto Local
WWW.COTIINFORMATICA.COM.BR 11
Clicar em general Existing Projects into Workspace Next.
WWW.COTIINFORMATICA.COM.BR 12
Clicar na pasta OK.
Finish.
WWW.COTIINFORMATICA.COM.BR 13
Atalhos do Eclipse
WWW.COTIINFORMATICA.COM.BR 14
TECLAS O que faz
Orientação a objetos
A Orientação a Objetos é uma maneira alternativa de pensar os problemas
de sistemas de informação utilizando modelos organizados a partir de
conceitos do mundo real. O artefato base é o “objeto” capaz de combinar
estrutura e comportamento em uma única “entidade”. Tudo o que podemos
ver no mundo real é considerado um objeto com atributos e
comportamentos definidos. Na qualidade de método de modelagem, é tida
como a melhor estratégia para se eliminar a dificuldade recorrente no
processo de modelar o mundo real do domínio do problema em um
conjunto de componentes de software que seja o mais fiel na sua
representação deste domínio.
WWW.COTIINFORMATICA.COM.BR 15
outros objetos. A alternativa mais usual ao uso de classes é o uso de
protótipos. Neste caso, objetos são cópias de outros objetos, não instâncias
de classes. Javascript e Lua são exemplos de linguagens cuja POO é
realizada por protótipos. A diferença prática mais evidente é que na POO
baseada em protótipos apenas a herança simples é implementada pela
cópia do objeto. Assim, na POO, implementa-se um conjunto de classes
passíveis de serem instanciadas como objetos, e.g. Python e C++ (ou
objetos protótipos que são copiados e alterados, e.g. JavaScript e VimL).
WWW.COTIINFORMATICA.COM.BR 16
árvore taxonômica. Na herança, tipicamente todos os atributos e métodos
da classe pai/mãe estão também disponíveis na classe filha, embora seja
comum que algumas características sejam substituídas. Assim, a herança
permite reúso facilitado de características e muitas vezes reflete relações do
mundo real de forma intuitiva. Ambas a ‘composição de objetos’ e a
‘herança’ constituem hierarquias entre as classes e objetos na POO.
Linguagem Java
Java é a base de praticamente todos os tipos de aplicativos em rede, e é o
padrão global para desenvolvimento e fornecimento de aplicativos para
celular, jogos, conteúdo on-line e software corporativo. Com mais de 9
milhões de desenvolvedores em todo o mundo, o Java permite desenvolver
e implantar aplicativos e serviços incríveis de maneira eficiente. Com
ferramentas abrangentes, um ecossistema sólido e um desempenho
eficiente, o Java oferece a portabilidade de aplicativos mesmo entre os
ambientes computacionais mais diferentes.
WWW.COTIINFORMATICA.COM.BR 17
Classe JavaBean
Classe Java de Entidade (Modelagem)
Características:
Atributos privados.
Construtor default (vazio)
Sobrecarga de Construtor (Entrada de dados)
Encapsulamento
Sobrescrita dos métodos de Object
toString
equals
hashCode
Serialização (Opcional)
package heranca;
public Cliente() {
}
@Override
public String toString() {
return idCliente + ", " + nome;
}
WWW.COTIINFORMATICA.COM.BR 18
Visibilidades:
package heranca;
public PessoaFisica() {
}
@Override
public String toString() {
return super.toString() + ", " + cpf;
}
WWW.COTIINFORMATICA.COM.BR 19
Implementação (É-UM)
Componente de programação OO totalmente abstrato. Tem como
caracteristicas: Padronização.
package relacionamento;
void abrirArquivo();
void gravarArquivo(String conteudo);
void fecharArquivo();
}
Quando uma Classe não abstrata (comum) herda (implementa) uma
interface, esta é obrigada a fornecer corpo para os metodos da interface.
Por exemplo:
package relacionamento;
@Override
public void abrirArquivo() {
WWW.COTIINFORMATICA.COM.BR 20
// TODO Auto-generated method stub
}
@Override
public void gravarArquivo(String conteudo) {
// TODO Auto-generated method stub
}
@Override
public void fecharArquivo() {
// TODO Auto-generated method stub
}
}
package entity2;
public Automovel() {
}
WWW.COTIINFORMATICA.COM.BR 21
@Override
public String toString() {
return idAutomovel + ", " + nome;
}
// Métodos abstratos
public abstract void setFabricante(String fabricante);
public abstract String getFabricante();
}
public CarroEsportivo() {
@Override
public String toString() {
return super.toString() + ", " + ano + ", " + fabricante;
}
@Override
WWW.COTIINFORMATICA.COM.BR 22
public String getFabricante() {
return fabricante;
}
@Override
public void setFabricante(String fabricante) {
this.fabricante = fabricante;
}
}
.
package entity2;
public CarroExecutivo() {
@Override
public String toString() {
return super.toString() + ", " + modelo + ", " +
fabricante;
}
@Override
public String getFabricante() {
return fabricante;
}
@Override
public void setFabricante(String fabricante) {
this.fabricante = fabricante;
}
}
.
package main;
import entity2.Automovel;
WWW.COTIINFORMATICA.COM.BR 23
import entity2.CarroEsportivo;
import entity2.CarroExecutivo;
System.out.println(a1);
System.out.println(a2);
}
}
No exemplo acima podemos dizer que CarroEsportivo É Automovel e
CarroExecutivo É Automovel, portanto, a herança da Classe abstrata
configura o uso de Polimorfismo. Note que Transformamos o objeto
Automovel em CarroEsportivo e CarroExecutivo
WWW.COTIINFORMATICA.COM.BR 24
oferecidos por seus objetos e quais informações eles podem armazenar.
Classes não são diretamente suportadas em todas as linguagens, e são
necessárias para que uma linguagem seja orientada a objetos. Uma classe
representa um conjunto de objetos com características afins. Uma classe
define o comportamento dos objetos através de seus métodos, e quais
estados ele é capaz de manter através de seus atributos.
Um bean também pode ser definido como uma classe Java que expõe
propriedades, seguindo uma convenção de nomeclatura simples para os
métodos getter e setter.
Atributos privados
Construtores
o Vazio (sem argumentos)
o Com entrada de argumetos (Sobrecarga)
Métodos set e get (encapsulamento)
Sobrescrita dos métodos da Classe Object
o toString
o equals
o hashCode
WWW.COTIINFORMATICA.COM.BR 25
Objeto
É uma instância de uma Classe. Armazenamento de estados através de seus
atributos e reação a mensagens enviadas por outros objetos.
[Classe] [Objeto]
[Construtor Instância]
Camada Model
package modelo;
public Pessoa() {
}
@Override
public String toString() {
return "Pessoa [idPessoa=" + idPessoa + ", nome=" + nome +
", idade=" + idade + "]";
}
WWW.COTIINFORMATICA.COM.BR 27
Camada Controle
package controle;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import modelo.Pessoa;
Camada View
package view;
import java.util.Scanner;
WWW.COTIINFORMATICA.COM.BR 28
System.out.println("Digite a Idade :");
Scanner in = new Scanner(System.in);
return in.nextInt();
} catch (Exception ex) {
System.out.println("Digite idade inteira ...");
return lerIdade();
}
}
package main;
import modelo.Pessoa;
import view.InputPessoa;
import controle.ValidaPessoa;
try{
p.setIdPessoa(ip.lerCodigo());
p.setNome(ip.lerNome());
p.setIdade(ip.lerIdade());
vp.validaCodigo(p);
vp.validaNome(p);
vp.validaIdade(p);
System.out.println("Dados" + p);
}catch(Exception ex){
System.out.println("Error" + ex.getMessage());
}
}
}
WWW.COTIINFORMATICA.COM.BR 29
Encapsulamento
WWW.COTIINFORMATICA.COM.BR 30
É um conceito da orientação a objetos que significa como pode ser feito a
entrada e saída de dados de uma classe. Na Linguagem existem duas formas
para isso. A primeira seria pelos métodos gets ( Saída de Dados ) e sets (
Entrada de Dados ) e a outra seria pelo construtor cheio ( Entrada de Dados
) e o toString ( Saída de Dados ). E os atributos da classe sendo private.
package entity;
public Aluno() {
}
@Override
public String toString() {
return "Aluno [idAluno=" + idAluno + ", nomeAluno=" +
nomeAluno + ", nota1=" + nota1 + ", nota2=" + nota2 + "]";
}
WWW.COTIINFORMATICA.COM.BR 31
public Integer getIdAluno() {
return idAluno;
}
public void setIdAluno(Integer idAluno) {
this.idAluno = idAluno;
}
public String getNomeAluno() {
return nomeAluno;
}
public void setNomeAluno(String nomeAluno) {
this.nomeAluno = nomeAluno;
}
public Double getNota1() {
return nota1;
}
public void setNota1(Double nota1) {
this.nota1 = nota1;
}
public Double getNota2() {
return nota2;
}
public void setNota2(Double nota2) {
this.nota2 = nota2;
}
}
.
package main;
import entity.Aluno;
System.out.println
("Nome: " + a1.getNomeAluno() +
"Nota1: " + a1.getNota1() +
"Nota2: " + a1.getNota2()
);
//------------------------------------------------
// O encapsulamento utilizando Construtor cheio e
// toString ( representado pelo objeto )
Aluno a2 = new Aluno(2,"Joao",8.,6.);
System.out.println("Dados: " + a2);
}
}
WWW.COTIINFORMATICA.COM.BR 32
Estrutura do projeto feito em aula depois
de finalizado:
Usuario.java
package entity;
WWW.COTIINFORMATICA.COM.BR 33
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
WWW.COTIINFORMATICA.COM.BR 34
Para rodar a classe.
Clique na classe com o botão direito -> run as -> java application
WWW.COTIINFORMATICA.COM.BR 35
Se dermos espaço de memória para o Usuario.
Usuario u = new Usuario();
E rodarmos novamente. O resultado será:
WWW.COTIINFORMATICA.COM.BR 36
Java WebDeveloper Noite -
Aula 02 (Seg, Qua, Sex)
Tema da aula:
Projeto Herança, Junit4, Atributos, Encapsuladores, Validação na classe,
@Before, AssertFalse
Herança
WWW.COTIINFORMATICA.COM.BR 37
A herança é um relacionamento pelo qual uma classe, chamada de sub-
classe, herda todos comportamentos e estados possíveis de outra classe,
chamada de super-classe ou classe base. É permitido que a sub-classe
estenda os comportamentos e estados possíveis da super-classe (por isso
este relacionamento também é chamado de extensão). Essa extensão ocorre
adicionando novos membros a sub-classe, como novos métodos e atributos.
Quando uma classe herda de mais de uma super-classe, ocorre uma herança
múltipla. Esta técnica é possível em C++ e em Python, mas não é possível
em Java e C♯, no entanto estas linguagens permitem múltipla tipagem
através do uso de interfaces.
super() x super
O comando Java super() , “super com parêntese” , no construtor da sub-
Classe tem a finalidade de chamar os atributos da Super-Classe. O comando
obrigatoriamente fica localizado na primeira linha do construtor cheio.
WWW.COTIINFORMATICA.COM.BR 38
public Aluno(String nome, String email, Double nota1, Double nota2) {
super(nome, email);
this.nota1 = nota1;
this.nota2 = nota2;
}
@Override
public String toString() {
return super.toString() + "Aluno [nota1=" + nota1 +
", nota2=" + nota2 + "]";
}
package entity;
public Pessoa() {
}
@Override
public String toString() {
return "Pessoa [nome=" + nome + ", email=" + email + "]";
}
WWW.COTIINFORMATICA.COM.BR 39
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package entity;
public Aluno() {
}
@Override
public String toString() {
return super.toString() + "Aluno [nota1=" + nota1
+ ", nota2=" + nota2 + "]";
}
WWW.COTIINFORMATICA.COM.BR 40
package entity;
public Professor() {
}
@Override
public String toString() {
return super.toString() + "Professor [matricula="
+ matricula + ", salario=" + salario + "]";
}
package main;
import entity.Aluno;
import entity.Professor;
// Herança
// Instanciando os objetos pelas Sub-Classes
Aluno a = new Aluno("Jose","jose@gmail.com",10.,8.);
System.out.println(a);
//----------------------
Professor p = new Professor("Luiz","luiz@gmail.com",123,3000.);
System.out.println(p);
}
}
WWW.COTIINFORMATICA.COM.BR 41
Junit
WWW.COTIINFORMATICA.COM.BR 42
Algumas vantagens de se utilizar JUnit:
Uma vez escritos, os testes são executados rapidamente sem que, para
isso, seja interrompido o processo de desenvolvimento;
JUnit é LIVRE.
WWW.COTIINFORMATICA.COM.BR 43
Estrutura do projeto feito em aula depois
de finalizado:
Pessoa.java
package entity;
WWW.COTIINFORMATICA.COM.BR 44
public Boolean isNome() {
if (this.nome.length() > 1) {
return true;
} else {
return false;
}
}
Usuario.java
package entity;
u.setIdUsuario(100);
u.setNome("lu");
u.setEmail("lu@gmail.com");
u.setSenha("123456");
System.out.println(u.getNome());
System.out.println(u.getEmail());
WWW.COTIINFORMATICA.COM.BR 45
System.out.println("IdUsuario :" + u.getIdUsuario());
System.out.println("Senha:" + u.getSenha());
Clique na classe com o botão direito -> run as -> java application
WWW.COTIINFORMATICA.COM.BR 46
Resultado no console.
WWW.COTIINFORMATICA.COM.BR 47
Clicar em Java Build Path -> Clicar na aba Libraries -> Clicar no
botão Add Esternal jars
WWW.COTIINFORMATICA.COM.BR 48
Selecionar o Junit4 -> clicar em Finish
WWW.COTIINFORMATICA.COM.BR 49
TesteUnidadePessoa.java
package teste;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import entity.Usuario;
// ctrl + shift + o
Usuario usuario;
@Before
public void iniciar() {
usuario = new Usuario();
usuario.setNome("l");
}
@Test
public void testeNomeInvalido() {
Assert.assertFalse(usuario.isNome());
}
WWW.COTIINFORMATICA.COM.BR 50
Para rodar a classe de teste.
Clicar na classe com o botão direito -> run as -> Junit test
WWW.COTIINFORMATICA.COM.BR 51
Java WebDeveloper Noite -
Aula 03 (Seg, Qua, Sex)
Tema da aula:
Projeto local, atributo static, calculo, Thread, JOptionPane,
WWW.COTIINFORMATICA.COM.BR 52
Aluno.java
package entity;
WWW.COTIINFORMATICA.COM.BR 53
}
// crud
public void gerarMedia() {
this.media = (this.nota1 + this.nota2) / 2;
}
}
SimuladorExecucao.java
package main;
import entity.Aluno;
a.setNota1(8.);
WWW.COTIINFORMATICA.COM.BR 54
System.out.println("nota1 " + a.getNota1());
Thread.sleep(1000);
a.setNota2(8.);
System.out.println("nota1 " + a.getNota2());
Thread.sleep(1000);
a.gerarMedia();
System.out.println("Media" + a.getMedia());
Thread.sleep(1000);
Clique na classe com o botão direito -> run as -> java application
Conta.java
package entity;
import javax.swing.JOptionPane;
WWW.COTIINFORMATICA.COM.BR 55
private Double saldo = 0.; // rn (>=0 soma) =
//(menor que 0) subtrai
private Double valor = 0.; // digitado ...
private Double total = 0.;
WWW.COTIINFORMATICA.COM.BR 56
Para rodar a classe.
Clique na classe com o botão direito -> run as -> java application.
Aguardar abrir a Caixa de Dialogo. Digitar o valor e Clicar em OK
Resultado no console
WWW.COTIINFORMATICA.COM.BR 57
Java WebDeveloper Noite -
Aula 04 (Seg, Qua, Sex)
Tema da aula:
Projeto Relacionamento OneToOne, sobrecarga de construtores,
Polimorfismo, JOptionPane, script Mysql
Sobrecarga de Métodos(Overloading)
A sobrecarga de métodos ocorre quando tem dois ou mais métodos que
possuem a mesma assinatura e só mudando o tipo ou a quantidades de
parâmetros declarados nele. Casos que pode ser identificado à sobrecarga:
Quando declaramos dois ou mais construtores na classe.
package entity;
public Cliente() {
WWW.COTIINFORMATICA.COM.BR 58
}
}
Quando ocorre é declarado dois ou mais métodos na mesma classe.
A assinatura: public void print
Os parametros: int a ; double a ; int a , int b
package entity;
package entity;
package entity;
WWW.COTIINFORMATICA.COM.BR 59
package main;
import entity.NumeroNatural;
Polimorfismo
WWW.COTIINFORMATICA.COM.BR 60
Polimorfismo significa “muitas formas”. Em Orientação a Objetos, o conceito
do polimorfismo é aplicado quando utilizamos o vertbo SER entre pelo
menos 2 ou mais subclasses, podendo ser feito utilizando-se interfaces ou
Classes abstratas.
Utilizando Interfaces
A interface é o tipo de programação mais “puro” do Java, pois não
programamos o conteúdo dos métodos de uma interface, apenas sua
declaração (assinatura). Toda interface Java obedece às seguintes regras:
WWW.COTIINFORMATICA.COM.BR 61
Tipos de polimorfismo
Existem quatro tipos de polimorfismo que a linguagem pode ter (atente
para o fato de que nem toda linguagem orientada a objeto tem
implementado todos os tipos de polimorfismo):
Universal
o Inclusão - um ponteiro para classe mãe pode apontar para
uma instância de uma classe filha (exemplo em Java: List lista =
new LinkedList(); (tipo de polimorfismo mais básico que existe)
o Paramétrico - se restringe ao uso de templates (C++, por
exemplo) e generics (C#/Java)
Ad-Hoc
o Sobrecarga - duas funções/métodos com o mesmo nome mas
assinaturas diferentes
o Coerção - conversão implícita de tipos sobre os parâmetros de
uma função
JOptionpane
Métodos
Método Descrição
WWW.COTIINFORMATICA.COM.BR 62
Método Descrição
Parametros
Parametro Descrição
OK_CANCEL_OPTION
Exemplo
JOptionPane.showMessageDialog(null, “alerta”,
“alerta”, JOptionPane.ERROR_MESSAGE);
WWW.COTIINFORMATICA.COM.BR 63
2. Mosta um painel de informação com as opções Sim/Não e exibe a
mensagem: ‘Escolha um:’
JOptionPane.showConfirmDialog(null,”Escolha um:”,
“Escolha um”,JOptionPane.YES_NO_OPTION);
WWW.COTIINFORMATICA.COM.BR 64
4. Mostra uma caixa de diálogo solicitando que o usuário digite uma
string:
Relacionameno OneToOne
WWW.COTIINFORMATICA.COM.BR 65
Classe Funcionario tem Endereco.
Criar uma classe Funcionario contendo 2 atributos (código, nome).
Funcionario.java
package entity;
public class Funcionario {
private Integer codigo;
private String nome;
}
Criar uma classe Endereco contendo os seguintes atributos: código, bairro,
cidade, os construtores, toString e getters e setters.
Endereco.java
package entity;
public Endereco() {
@Override
public String toString() {
return "Endereco [codigo=" + codigo + ", bairro=" + bairro
+ ", cidade=" + cidade + "]";
}
WWW.COTIINFORMATICA.COM.BR 66
public String getCidade() {
return cidade;
}
package entity;
public class Funcionario {
private Integer codigo;
private String nome;
private Endereco endereco;
A classe Endereco virou um atributo da classe Funcionario. Dessa forma
indicamos que Funcionario tem um Endereco. Agora criar os outros métodos
restantes (construtores, toString e getters e setters).
ublic Funcionario() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Funcionario [codigo=" + codigo + ", nome=" + nome
+ ", endereco=" + endereco + "]";
}
WWW.COTIINFORMATICA.COM.BR 67
E os getters e setters de todos os atributos.
public Funcionario() {
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Funcionario [codigo=" + codigo + ", nome=" + nome
+ ", endereco=" + endereco + "]";
}
WWW.COTIINFORMATICA.COM.BR 68
public String getNome() {
return nome;
}
System.out.println(f1);
System.out.println(f2.getCodigo() + "," + f2.getNome() );
System.out.println(f2.getEndereco().getBairro());
}
Criamos o objeto do funcionário “f1” e passamos os dados através do
construtor cheio. Depois criamos o funcionário “f2” e usamos o construtor
vazio, passando os dados através do “set” de cada atributo. Pedimos a
impressão do “f1” completa, através do toString e “f2” imprimiremos
somente o que foi pedido (código, nome) e (bairro).
WWW.COTIINFORMATICA.COM.BR 69
Estrutura do projeto feito em aula depois
de finalizado:
Aluno.java
package entity;
}
//Sonar testa o seu códido ...
@Override
WWW.COTIINFORMATICA.COM.BR 70
public String toString() {
return "Aluno [idAluno=" + idAluno + ", nome=" + nome
+ ", email=" + email + "]";
}
Endereco.java
package entity;
//ctrl + d
public Endereco(Integer idEndereco, String bairro, String cidade,
Aluno aluno) {
this.idEndereco = idEndereco;
this.bairro = bairro;
WWW.COTIINFORMATICA.COM.BR 71
this.cidade = cidade;
this.aluno = aluno;
}
@Override
public String toString() {
return "Endereco [idEndereco=" + idEndereco + ", bairro="
+ bairro + ", cidade=" + cidade + ",\n aluno=" + aluno
+ "]";
}
// o relacionamento
//packote main / Classe Main métododo(main)
WWW.COTIINFORMATICA.COM.BR 72
script.sql
mysql -u root -pcoti
use BDUMNOITE;
#1 p 1
create table aluno(idAluno int primary key,
nome varchar (50),
email varchar (50) unique
);
use BDUMNOITE;
WWW.COTIINFORMATICA.COM.BR 73
create table aluno(idAluno int primary key,
nome varchar (50),
email varchar (50) unique
);
Main.java
package main;
import entity.Aluno;
import entity.Endereco;
WWW.COTIINFORMATICA.COM.BR 74
Para rodar a classe.
Clique na classe com o botão direito -> run as -> java application
WWW.COTIINFORMATICA.COM.BR 75
Java WebDeveloper Noite -
Aula 05 (Seg, Qua, Sex)
Tema da aula:
Projeto Orientação a Objetos, SimpleDateFormat
WWW.COTIINFORMATICA.COM.BR 76
Autor.java
package entity;
import java.util.List;
public Autor() {
}
@Override
public String toString() {
return "Autor [idAutor=" + idAutor + ", nome=" + nome +
"]";
}
System.out.println(a.getIdAutor());
System.out.println(a.getNome());
WWW.COTIINFORMATICA.COM.BR 77
}
}
Clique na classe Aluno.java com o botão direito -> run as -> java
application. Resultado no console.
Pessoa.java
package entity;
Post.java
package entity;
import java.text.SimpleDateFormat;
import java.util.Date;
WWW.COTIINFORMATICA.COM.BR 78
private String nome;
private String descricao;
private Date dataPost;
public Post() {
}
@Override
public String toString() {
return "Post [idPost=" + idPost + ", nome=" + nome
+ ", descricao=" + descricao + ", dataPost="
+ sdf.format(dataPost) + "]";
}
WWW.COTIINFORMATICA.COM.BR 79
}
}
Coti Informática - https://www.cotiinformatica.com.br
Coti EAD - https://www.cotiead.com.br
tags: noite seg-qua-sex 15-06
WWW.COTIINFORMATICA.COM.BR 80
Java WebDeveloper Noite -
Aula 06 (Seg, Qua, Sex)
Tema da aula:
Projeto json, Instalação Json-viewer, Relacionamento OneToMany
WWW.COTIINFORMATICA.COM.BR 81
Estrutura do projeto feito em aula depois
de finalizado:
https://chrome.google.com/webstore/detail/json-
viewer/aimiinbnnkboelefkjlenlgimcabobli?hl=pt-BR
WWW.COTIINFORMATICA.COM.BR 82
É só clicar no botão Usar no Chrome
aluno.json
"aluno": {
"id": 10,
"nome": "jose",
"email": "email@gmail.com",
"endereco": {
"logradouro": "rua a",
"bairro": "centro"
},
"disciplina": [
{
"nome": "java",
"nota1": 9,
"nota2": 10,
"media": 9.5,
"situacao": "aprovado"
},
{
"nome": "angular",
"nota1": 9,
"nota2": 10,
"media": 9.5,
"situacao": "aprovado"
}
WWW.COTIINFORMATICA.COM.BR 83
]
}
}
aluno.java
package entity;
import java.util.List;
public Aluno() {
@Override
public String toString() {
return "Aluno [idAluno=" + idAluno + ", nome=" + nome
+ ", email=" + email + ", disciplinas=" + disciplinas +
"]";
}
WWW.COTIINFORMATICA.COM.BR 84
return nome;
}
Disicplina.java
package entity;
import java.util.ArrayList;
import java.util.List;
public Disciplina() {
// TODO Auto-generated constructor stub
}
WWW.COTIINFORMATICA.COM.BR 85
public Disciplina(Integer idDisciplina, String nomeDiscplina,
Double nota1, Double nota2, Double media) {
super();
this.idDisciplina = idDisciplina;
this.nomeDiscplina = nomeDiscplina;
this.nota1 = nota1;
this.nota2 = nota2;
this.media = media;
}
@Override
public String toString() {
return "Disciplina [idDisciplina=" + idDisciplina
+ ", nomeDiscplina=" + nomeDiscplina + ", nota1="
+ nota1 + ", nota2=" + nota2 + ", media=" + media + "]";
}
WWW.COTIINFORMATICA.COM.BR 86
}
System.out.println(a);
// caiu o microfone
}
}
WWW.COTIINFORMATICA.COM.BR 87
Java WebDeveloper Noite -
Aula 07 (Seg, Qua, Sex)
Tema da aula:
Projeto Orientação a Objetos, gson, java-json, DateTimeFormatter,
JsonObject, Validação, Lançamento de erro, Calculo
WWW.COTIINFORMATICA.COM.BR 88
Para colocar as bibliotecas no projeto
WWW.COTIINFORMATICA.COM.BR 89
Clicar em Java Build Path -> Clicar na aba Libraries -> Clicar no
botão Add external jars
WWW.COTIINFORMATICA.COM.BR 90
Adicionar a biblioteca do java-json
WWW.COTIINFORMATICA.COM.BR 91
Aluno.java
package projetoJson;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.json.JSONObject;
public Aluno() {
}
WWW.COTIINFORMATICA.COM.BR 92
public Integer getIdAluno() {
return idAluno;
}
public void setIdAluno(Integer idAluno) {
this.idAluno = idAluno;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getDisciplina() {
return disciplina;
}
public void setDisciplina(String disciplina) {
this.disciplina = disciplina;
}
public Double getNota1() {
return nota1;
}
public void setNota1(Double nota1) {
this.nota1 = nota1;
}
public Double getNota2() {
return nota2;
}
WWW.COTIINFORMATICA.COM.BR 93
}else {
throw new IllegalArgumentException
("Fora da Faixa da Nota2");
}
return this;
}
WWW.COTIINFORMATICA.COM.BR 94
Para rodar a classe
Clicar na classe com o botão direito -> run as -> java application
WWW.COTIINFORMATICA.COM.BR 95
Java WebDeveloper Noite -
Aula 08 (Seg, Qua, Sex)
Tema da aula:
Projeto Orientação a Objetos, Banco Mysql, Encapsulamento, Criação do
banco, tabelas, inserção de dados, criação da chave de crptografia MD5,
Dao, Conexão com duas versões de MySql
WWW.COTIINFORMATICA.COM.BR 96
PessoaDao representa essa lógica e a entidade a ser persistida no banco de
dados é Pessoa. A classe Dao é composta por dois métodos que são: Open()
para abrir o banco e o Close() para fechar o banco. E alguns atributos como
Connection (Conexão ao Banco de Dados), PreparedStatement (Acessar a
Tabela), ResultSet (Consulta a Tabela) e o CallaBleStatement (Usar
Procedures e Function).
WWW.COTIINFORMATICA.COM.BR 97
passo seguinte é definir a classe que irá fazer a lógica do CRUD (Inserir,
Listar, Atualizar, Deletar). Nesse caso será utilizado a classe PessoaDao para
representar essa lógica e nessa classe é herdado a classe Dao.
package persistence;
import java.util.ArrayList;
import java.util.List;
import entity.Pessoa;
open();
stmt = con.prepareStatement("delete from Pessoa where
idPessoa = ?");
stmt.setInt(1, p.getIdPessoa());
stmt.execute();
stmt.close();
close();
open();
stmt = con.prepareStatement("update Pessoa nome = ?,
email = ? where idPessoa = ?");
stmt.setString(1, p.getNomePessoa());
stmt.setString(2, p.getEmail());
stmt.setInt(3, p.getIdPessoa());
stmt.execute();
stmt.close();
close();
open();
stmt = con.prepareStatement("select * from pessoa
where idPessoa = ? ");
rs = stmt.executeQuery();
Pessoa p = null;
WWW.COTIINFORMATICA.COM.BR 98
if (rs.next()) {
p = new Pessoa();
p.setIdPessoa(rs.getInt("idPessoa"));
p.setNomePessoa(rs.getString("nomePessoa"));
p.setEmail(rs.getString("email"));
}
close();
return p;
}
p.setNomePessoa(rs.getString("nomePessoa"));
p.setEmail(rs.getString("email"));
lista.add(p);
}
close();
return lista;
} catch (Exception e) {
System.out.println(e.getMessage());
return null;
}
}
}
Para efetuar um teste com a lógica do CRUD tem que criar o banco e a
tabela pessoa pelo SQL, que é a linguagem padronizada para todos os
bancos de dados, e copiar no mysql. Logo é criado um arquivo chamando
script.sql.
script.sql
WWW.COTIINFORMATICA.COM.BR 99
# comando para criar uma tabela
create table pessoa(
idPessoa int primary key auto_increment,
nomePessoa varchar(50),
email varchar(50)
);
package entity;
public Pessoa() {
}
@Override
public String toString() {
return "Pessoa [idPessoa=" + idPessoa + ", nomePessoa="
+ nomePessoa + ", email=" + email + "]";
}
WWW.COTIINFORMATICA.COM.BR 100
}
}
// 1º Passo
//Busca pelo Codigo
// 2 -> é a chave primaria de pessoa no banco
Pessoa pessoa = pd.finallByCod(2);
System.out.println("pessoa:" + pessoa);
pessoa.setEmail("joao2@gmail.com");
// 2º Passo
//Alterar o usuario 2
System.out.println("pessoa:" + pessoa);
pd.update(pessoa);
WWW.COTIINFORMATICA.COM.BR 101
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
WWW.COTIINFORMATICA.COM.BR 102
Bibliotecas utilizadas no projeto:
Usuario.java
package entity;
public Usuario() {
}
@Override
public String toString() {
return "Usuario [idUsuario=" + idUsuario + ", nome="
+ nome + ", login=" + login + ", status=" + status + "]";
}
WWW.COTIINFORMATICA.COM.BR 103
public Integer getIdUsuario() {
return idUsuario;
}
public void setIdUsuario(Integer idUsuario) {
this.idUsuario = idUsuario;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
banco.md
# Estrutura do Projeto
entity
Usuario
persistence
Dao
UsuarioDao
script.sql -> diagrama fisico
test
TestConexao
TestGravacao
WWW.COTIINFORMATICA.COM.BR 104
script.sql
# linha de comando ...
show databases;
use BDUSUNOITE;
show tables;
set @chave='www.cotiinformatica.com.br#profedsonbelem@gmail.com#1+1=0';
select @chave;
# java criptografia
select version();
WWW.COTIINFORMATICA.COM.BR 105
Visualizando os comando no banco MySql:
Criar o banco de dados
Mostrar todos os bancos nessa maquina. Tenho 373 banco criados na minha
máquina.
show databases;
use BDUSUNOITE;
WWW.COTIINFORMATICA.COM.BR 106
Mostrar as tabelas desse banco. Ainda não criamos nada…
show tables;
set @chave='www.cotiinformatica.com.br#profedsonbelem@gmail.com#1+1=0';
WWW.COTIINFORMATICA.COM.BR 107
Mostrar a chave criada
select @chave;
select*from usuario;
WWW.COTIINFORMATICA.COM.BR 108
Deletando o usuario Belem
WWW.COTIINFORMATICA.COM.BR 109
Mostrando como se concatena (junta) palavras no banco
select version();
WWW.COTIINFORMATICA.COM.BR 110
Dao.java
package persistence;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
//5
public static boolean openFive() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
if (con ==null) {
con = DriverManager.getConnection
("jdbc:mysql://localhost:3306/BDUSUNOITE","root","coti");
return true;
}else {
return false;
}
}
//Oito
public static boolean openOito() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
if (con ==null) {
con = DriverManager.getConnection
("jdbc:mysql://localhost:3306/BDUSUNOITE?serverTimezone=UTC&useSSL=false"
,"root","coti");
return true;
}else {
return false;
}
}
WWW.COTIINFORMATICA.COM.BR 111
}else {
System.out.println(">1 quantidade de vezes");
System.out.println(resp );
}
}catch(Exception ex) {
ex.printStackTrace();
}
}
}
Clicar na classe com o botão direito -> run as -> java application
WWW.COTIINFORMATICA.COM.BR 112
Java WebDeveloper Noite -
Aula 09 (Seg, Qua, Sex)
Tema da aula:
Projeto orientação a objetos, Mysql, script mysql, chave criptografia MD5,
Interface, criação do Java doc
Criptografia MD5
WWW.COTIINFORMATICA.COM.BR 113
desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, e muito
utilizado por softwares com protocolo ponto-a-ponto (P2P, ou Peer-to-Peer,
em inglês) na verificação de integridade de arquivos e logins.
Foi desenvolvido em 1991 por Ronald Rivest para suceder ao MD4 que tinha
alguns problemas de segurança. Por ser um algoritmo unidirecional, uma
hash md5 não pode ser transformada novamente no texto que lhe deu
origem. O método de verificação é, então, feito pela comparação das duas
hash (uma da mensagem original confiável e outra da mensagem recebida).
O MD5 também é usado para verificar a integridade de um arquivo através,
por exemplo, do programa md5sum, que cria a hash de um arquivo. Isto
pode-se tornar muito útil para downloads de arquivos grandes, para
programas P2P que constroem o arquivo através de pedaços e estão sujeitos
a corrupção dos mesmos. Como autenticação de login é utilizada em vários
sistemas operacionais unix e em muitos sites com autenticação.
O md5 é uma função criptográfica, mas não deve ser confundido com
criptografia. A encriptação é uma tarefa de mão dupla que você usa sempre
que precisa armazenar com segurança uma informação, mas precisa
recuperá-la mais tarde através de uma chave simétrica ou privada. Já o hash,
é comumente utilizado quando você necessita comparar informações.
Vulnerabilidade
Como o MD5 faz apenas uma passagem sobre os dados, se dois prefixos
com o mesmo hash forem construídos, um sufixo comum pode ser
adicionado a ambos para tornar uma colisão mais provável. Deste modo é
possível que duas strings diferentes produzam o mesmo hash. O que não
garante que a partir de uma senha codificada em hash específica consiga-se
a senha original, mas permite uma possibilidade de descobrir algumas
senhas a partir da comparação de um conjunto grande de hash de senhas
através do método de comparação de dicionários.
WWW.COTIINFORMATICA.COM.BR 114
Criptografia
Criptografia (em grego: kryptós, “escondido”, e gráphein, “escrita”) é o
estudo dos princípios e técnicas pelas quais a informação pode ser
transformada da sua forma original para outra ilegível, de forma que possa
ser conhecida apenas por seu destinatário (detentor da “chave secreta”), o
que a torna difícil de ser lida por alguém não autorizado. Assim sendo, só o
receptor da mensagem pode ler a informação com facilidade. É um ramo da
Matemática, parte da Criptologia. Há dois tipos de chaves criptográficas:
chaves simétricas(criptografia de chave única) e chaves assimétricas
(criptografia de chave pública).
Chave (criptografia)
Uma chave criptográfica é um valor secreto que modifica um algoritmo de
encriptação. A fechadura da porta da frente da sua casa tem uma série de
pinos. Cada um desses pinos possui múltiplas posições possíveis. Quando
alguém põe a chave na fechadura, cada um dos pinos é movido para uma
posição específica. Se as posições ditadas pela chave são as que a fechadura
precisa para ser aberta, ela abre, caso contrário, não.
Para um algoritmo bem projetado, cifrar o mesmo texto mas com uma chave
diferente deverá produzir um texto cifrado totalmente diferente. Igualmente,
decifrar o texto cifrado com a chave errada deverá produzir um texto
aleatório ininteligível. Se a chave de decriptação for perdida, o dado cifrado
WWW.COTIINFORMATICA.COM.BR 115
praticamente não pode ser recuparado pelo mesmo algoritmo de
criptografia.
A escolha da chave
Para evitar que uma chave seja adivinhada, as chaves precisam ser geradas
aleatoriamente e conterem entropia suficiente. O problema de como gerar
seguramente chaves verdadeiramente aleatórias é difícil e tem sido
encarado de várias formas por vários sistemas criptográficos. Existe um RFC
sobre a geração de aleatoriedade (RFC 1750,Randomness Recommendations
for Security Recomendações de Aleatoriedade para Segurança]. Alguns
sistemas operacionais incluem ferramentas para “coletar” entropia a partir
da medição do tempo de certas operações imprevisíveis como os
movimentos da cabeça do drive de disco. Para a produção de pequenas
quantidades de material, umdado comum é uma boa fonte de aleatoriedade
de alta qualidade.
WWW.COTIINFORMATICA.COM.BR 116
Alguns algoritmos e sistemas criptográficos
Funções de Hash criptográfico, ou message digest
MD5
SHA-1
RIPEMD-160
Tiger
PGP
GPG
SSL
IPSec / Free S/WAN
Curvas elípticas
Diffie-Hellman
DSA de curvas elípticas
El Gamal
RSA
Interface
WWW.COTIINFORMATICA.COM.BR 117
Em algumas linguagens de programação, termo interface é uma referência à
característica que permite a construção de interfaces que isolam do mundo
exterior os detalhes de implementação de um componente de software.
WWW.COTIINFORMATICA.COM.BR 118
package entity1;
package entity1;
}
.
package entity1;
@Override
public void open() throws Exception {
System.out.println("Abrir Conexao Banco de Dados");
}
@Override
public void close() throws Exception {
System.out.println("Fechar Conexao Banco de Dados");
}
}
.
package entity1;
@Override
public void open() throws Exception {
System.out.println("Abrir Conexao Arquivo");
}
@Override
public void close() throws Exception {
System.out.println("Fechar Conexao Arquivo");
}
@Override
public void write() throws Exception {
System.out.println("Escrever no Arquivo");
}
@Override
public String read() throws Exception {
WWW.COTIINFORMATICA.COM.BR 119
return "Ler do Arquivo";
}
}
Sintaxe
public class nome_classe implements nome_interface
Onde
Utilização
Um exemplo clássico de utilização de interfaces é o do sistema operacional
que, através de uma interface de programação de aplicativos, permite que
os programas utilizem os recursos do sistema (memória, CPU e etc) sem que
os seus detalhes de implementação sejam conhecidos do programador. Este
esquema isola e protege o sistema operacional de eventuais erros
cometidos pela aplicação.
WWW.COTIINFORMATICA.COM.BR 120
de exceções e assinaturas de métodos. Em alguns casos é mais apropriado
definir as variáveis como parte das interfaces. As interfaces também
especificam a funcionalidade disponibilizada através de comentários ou
através de declarações lógicas formais (assertions).
Linguagens
O princípio da interface é um alicerce da programação modular que, por sua
vez, é precursora e parte da programação orientada a objeto. Na
programação orientada a objeto, a interface de um objeto consiste de um
conjunto de métodos que um objeto deve suportar. É importante notar que
as variáveis de instância não fazem parte da interface de um objeto pois
devem ser acessadas somente pelos “métodos de acesso”. Historicamente,
as interfaces são derivadas dos arquivos de cabeçalho da Linguagem C
(normalmente arquivos com extensão “.h”) que separam o contexto sintático
de um módulo (ou protótipos de funções) da sua implementação.
WWW.COTIINFORMATICA.COM.BR 121
podem ser especificadas na implementação da classe ou em uma classe
genérica (classe mãe) que não precisa implementar os seus métodos. Elas
são extraídas por processadores da linguagem e podem ser vistas em uma
ambiente de desenvolvimento além de gerarem verificações em tempo de
execução. A linguagem garante que classes derivadas obedeçam aos
contratos definidos nas classes que servem de base.
Tags Javadoc
Os desenvolvedores usam certos estilos de comentários e tags Javadoc ao
documentar códigos-fonte. Um bloco de comentário em Java iniciado com
/** irá iniciar um bloco de comentário Javadoc, que será incluído no HTML
gerado. Uma tag Javadoc começa com um “@” (arroba). Na tabela abaixo,
algumas destas tags.
Tag Descrição
WWW.COTIINFORMATICA.COM.BR 122
Tag Descrição
Para inserir o símbolo @ sem iniciar uma tag Javadoc você pode usar o
código de caracter HTML @ e evitar problemas de parsing
WWW.COTIINFORMATICA.COM.BR 123
Estrutura do projeto feito em aula depois
de finalizado:
WWW.COTIINFORMATICA.COM.BR 124
banco.md
# Estrutura do Projeto
entity
Usuario
persistence
Dao
UsuarioDao
script.sql -> diagrama fisico
test
TestConexao
TestGravacao
Usuario.java
package entity;
public Usuario() {
}
WWW.COTIINFORMATICA.COM.BR 125
String senha, Integer status) {
super();
this.idUsuario = idUsuario;
this.nome = nome;
this.login = login;
this.senha = senha;
this.status = status;
}
@Override
public String toString() {
return "Usuario [idUsuario=" + idUsuario + ", nome="
+ nome + ", login=" + login + ", status=" + status + "]";
}
script.sql
# linha de comando ...
WWW.COTIINFORMATICA.COM.BR 126
show databases;
use BDUSUNOITE;
show tables;
create table usuario(
idUsuario int primary key auto_increment,
nome varchar (80) not null,
login varchar (80) unique,
senha varchar (250) not null,
status int);
//UsuarioDao
set @chave='www.cotiinformatica.com.br#profedsonbelem@gmail.com#1+1=0';
select @chave;
# java criptografia
select version();
DAO.java
package persistence;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
WWW.COTIINFORMATICA.COM.BR 127
PreparedStatement stmt;
ResultSet rs;
/*
* (primitivo c++ ) int, float , double, char, boolean, byte, short
, long
* byte[], short, int, long
* float, double
*
* String
* char
* boolean
*
* ---------------------------------------
* Byte, Short, (Integer), Long (Wrapper)
*
* Float, Double
* Boolean
* String
*
*
**/
WWW.COTIINFORMATICA.COM.BR 128
Clicar na classe com o botão direito -> run as -> java application
UsuarioDao.java
package persistence;
import entity.Usuario;
UsuarioDaoImpl.java
package persistence;
import entity.Usuario;
@Override
public void criarUsuario(Usuario u)throws Exception{
DAO.openFive();
stmt = con.prepareStatement("insert into usuario values
(null,?,?,?,?)");
stmt.setString(1, u.getNome());
stmt.setString(2, u.getLogin());
stmt.setString(3, u.getSenha());
}
}
WWW.COTIINFORMATICA.COM.BR 129
Para gerar o JavaDoc
WWW.COTIINFORMATICA.COM.BR 130
Clicar em configure -> Indicar onde se encontra o comando do
javadoc -> abrir
WWW.COTIINFORMATICA.COM.BR 131
Next
WWW.COTIINFORMATICA.COM.BR 132
Clicar em yes to all
No console
WWW.COTIINFORMATICA.COM.BR 133
Na pasta onde foi salvo, só clicar em index.html
WWW.COTIINFORMATICA.COM.BR 134
Clicando no link dados
WWW.COTIINFORMATICA.COM.BR 135
Java WebDeveloper Noite -
Aula 10 (Seg, Qua, Sex)
Tema da aula:
Projeto orientação a objetos, Mysql, script mysql, chave criptografia MD5,
Interface, criação do Java doc, Herança, Lista, buscar, buscar pelo codigo
WWW.COTIINFORMATICA.COM.BR 136
Estrutura do projeto feito em aula depois
de finalizado:
WWW.COTIINFORMATICA.COM.BR 137
Bibliotecas utilizadas no projeto:
Banco.md
# Estrutura do Projeto
entity
Usuario
persistence
Dao
UsuarioDao
script.sql -> diagrama fisico
test
TestConexao
TestGravacao
WWW.COTIINFORMATICA.COM.BR 138
Usuario.java
package entity;
public Usuario() {
}
@Override
public String toString() {
return "Usuario [idUsuario=" + idUsuario + ", nome="
+ nome + ", login=" + login + ", status=" + status + "]";
}
WWW.COTIINFORMATICA.COM.BR 139
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
script.sql
# linha de comando ...
show databases;
use BDUSUNOITE;
show tables;
set @chave='www.cotiinformatica.com.br#profedsonbelem@gmail.com#1+1=0';
select @chave;
select version();
WWW.COTIINFORMATICA.COM.BR 140
DAO.java
package persistence;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/*
* (primitivo c++ ) int, float , double, char, boolean, byte, short
, long
* byte[], short, int, long
* float, double
*
* String
* char
* boolean
*
* ---------------------------------------
* Byte, Short, (Integer), Long (Wrapper)
*
* Float, Double
* Boolean
* String
*
*
**/
WWW.COTIINFORMATICA.COM.BR 141
}
Clicar na classe DAO.java com o botão direito -> run as -> java
application
UsuarioDao.java
package persistence;
import entity.Usuario;
UsuarioDaoImp.java
package persistence;
import entity.Usuario;
@Override
public void criarUsuario(Usuario u)throws Exception{
DAO.openFive();
stmt = con.prepareStatement("insert into usuario values
WWW.COTIINFORMATICA.COM.BR 142
(null,?,?,md5(?),?)");
stmt.setString(1, u.getNome());
stmt.setString(2, u.getLogin());
stmt.setString(3, chave + u.getSenha());
stmt.setInt(4, u.getStatus());
stmt.execute();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
Rodando a classe
ManagerBeanUsuario.java
package controller;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import entity.Usuario;
WWW.COTIINFORMATICA.COM.BR 143
usuarios.add(new Usuario
(3, "cleber", "cleber@gmail.com", "123", 1));
}
// Filter
public Usuario buscarCodigo(Integer cod) {
// retorno 1
Usuario resposta = usuarios.stream().filter(a ->
a.getIdUsuario().equals(cod)).findAny()
.orElseThrow(() -> new IllegalArgumentException
("codigo nao Encontrado ..."));
return resposta;
}
System.out.println(obj.quantidade());
System.out.println(obj.buscarTodosLoginsESenha());
System.out.println("obrigado ....");
} catch (Exception ex) {
ex.printStackTrace();
}
// Exercicios _
// a) (diferenca do map x filter x reduce)
// Para que se utiliza interface
// ter e ser qual a diferença ...
// Camadas e Pacotes Diferenca
// ManagerBean (? )
// Crud com CRUD List(add, size, get, remove, set)
// voa nisso (...)
WWW.COTIINFORMATICA.COM.BR 144
Rodando a classe
WWW.COTIINFORMATICA.COM.BR 145
Java WebDeveloper Noite -
Aula 11 (Seg, Qua, Sex)
Tema da aula:
Projeto, Orientação a objetos, interface, classe abstrata, metodo abstrato,
conversao de dados em Json
WWW.COTIINFORMATICA.COM.BR 146
Estrutura do projeto feito em aula depois
de finalizado:
WWW.COTIINFORMATICA.COM.BR 147
Bibliotecas utilizadas no projeto:
IFuncionario.java
package exemplo;
Funcionario.java
package entity;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
WWW.COTIINFORMATICA.COM.BR 148
// nao gera Objeto (instancia)
public Funcionario() {
}
@Override
public String toString() {
return "Funcionario [idFuncionario=" + idFuncionario
+ ", nome=" + nome + ", setor=" + setor + ", dataCadastro="
+ dataCadastro + ", salarioBruto=" + salarioBruto
+ ", salarioLiquido=" + salarioLiquido + "]";
}
WWW.COTIINFORMATICA.COM.BR 149
this.setor = setor;
}
//
// public static void main(String[] args) {
//
// Funcionario f = new Funcionario() {
// public void contratoCalcularSalario() {
// System.out.println("teste");
// }
// };
// f.setIdFuncionario(10);
// f.setNome("armacao");
// f.setSalarioBruto(5000.);
// f.setSalarioLiquido(2000.);
// f.setSetor("programacao");
// f.setDataCadastro(LocalDate.of(2019, 02, 12));
//
// System.out.println(f);
//
// Map <String,String> mapa = new HashMap<String,String>();
// mapa.put("nome", "gilvan");
// mapa.put("email", "gilvan@gmail.com");
// System.out.println(f.toJson(mapa));
//
// }
//
WWW.COTIINFORMATICA.COM.BR 150
Estagiario.java
package entity;
import java.time.LocalDate;
public Estagiario() {
super();
}
@Override
public void contratoCalcularSalario() {
this.setSalarioBruto(940. / 2);
this.setSalarioLiquido(this.getSalarioBruto() - 200.);
}
@Override
public String toString() {
return "Estagiario [getIdFuncionario()=" +
getIdFuncionario()
+ ", getNome()=" + getNome() + ", getSetor()=" + getSetor()
+ ", getDataCadastro()=" + getDataCadastro()
+ ", getSalarioBruto()=" + getSalarioBruto()
+ ", getSalarioLiquido()=" + getSalarioLiquido() + "]";
}
}
}
WWW.COTIINFORMATICA.COM.BR 151
Para rodar a classe.
Clicar na classe com o botão direito -> run as -> java application
JSONFormatter.java
package io;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import entity.Estagiario;
WWW.COTIINFORMATICA.COM.BR 152
Estagiario estagiario = new Estagiario
(10, "jose", "programacao", LocalDate.of(2020, 10, 20), 0., 0.);
estagiario.contratoCalcularSalario();
JSONFormate json = new JSONFormate();
try {
System.out.println(json.getConversaoDados
(estagiario));
} catch (Exception e) {
e.printStackTrace();
}
}
}
WWW.COTIINFORMATICA.COM.BR 153
Java WebDeveloper Noite -
Aula 12 (Seg, Qua, Sex)
Tema da aula:
Projeto JSP, Dao, Gravar, login, MySql
JavaServer Pages
JavaServer Pages (JSP) é uma tecnologia que ajuda os desenvolvedores de
software a criarem páginas web geradas dinamicamente baseadas em HTML,
XML ou outros tipos de documentos. Lançada em 1999 pela Sun
Microsystems, JSP é similar ao PHP, mas usa a linguagem de programação
Java.
WWW.COTIINFORMATICA.COM.BR 155
O recipiente web cria objetos JSP implícitos como pageContext,
servletContext, session, request & response.
A linguagem
Em relação a arquitetura, JSP pode ser visto como uma abstração de alto
nível dos Java servlets. Páginas JSP são carregadas dentro do servidor e
processado a partir de uma estrutura especial do servidor Java, chamada
Java EE Web Application, muitas vezes como um arquivo .war .ear.
JSP permite que código Java e certas ações pré-definidas sejam intercaladas
com conteúdo de marcação estático, resultando na página sendo compilada
e executada no servidor para ser entregue num documento HTML ou XML.
As páginas compiladas e qualquer dependência de biblioteca Java usa os
bytecodes primeiro que o formato nativo de software, e deve assim ser
executado com uma JVM, a máquina virtual Java, integrada com o host do
sistema operacional para prover um ambiente de abstração de plataforma.
Sintaxe
Páginas JSP utilizam vários delimitadores para funções de script. A mais
básica é <% … %>, que delimita um scriptlet JSP. Um scriptlet é um
fragmento de código Java que é executado quando o usuário solicita uma
página. Outros delimitadores comuns incluem <%= … %> para expressões,
onde o valor da expressão é colocado na página entregue ao usuário, e
diretivas, denotadas com <%@ … %>.
O código Java não é necessário ser completo ou auto-contido dentro de seu
bloco de elemento scriptlet, mas pode abranger conteúdos de marcação
fornecendo a página como um todo é sintaticamente correto. Por exemplo,
quaisquer bloco Java if/for/while aberto em um elemento scriptlet deve ser
corretamente fechado em um elemento posterior para que a página seja
compilada com sucesso. A marcação que cai dentro de um bloco de código
quebrado está sujeito aquele código, desta forma a marcação dentro do
bloco ifaparecerá apenas na saída quando a condição if for avaliada como
WWW.COTIINFORMATICA.COM.BR 156
verdadeira (true). Do mesmo modo, a marcação dentro de uma construção
de loop pode aparecer várias vezes na saída dependendo de quantas vezes
o corpo do loop for executado.
Comentários JSP
O JSP tem um tipo de comentário próprio, por exemplo: <%-- comentário --
%>
Tags JSP
No JSP existem 5 tags:
1 - Declaration tag
Esta tag permite declarar variáveis e métodos. A sua sintaxe é: <%! …mais
alguma coisa… %> Um exemplo:
<%!
private int contador= 0 ;
%>
2 - Expression tag
Esta tag permite mostrar algum resultado. A sua sintaxe é: <%=…algo para
mostrar…%> Por exemplo, para mostrar o valor da variável contador bastava
apenas:
<%=contador %>
3 - Directive tag
Esta tag permite dar informação sobre a página ao motor JSP. Existe 3 tipos
de directivas:
WWW.COTIINFORMATICA.COM.BR 157
<%@ taglib prefix = "prefixo" uri = "taglib.tld" %>
4 - Scriptlet tag
Todo o código entre <% %> é chamado de scriptlet. Sintaxe:
Acessar
Para a inclusão de applets Java em páginas, independentemente e
alterar propriedades de JavaBeans (jsp:useBean, jsp:getProperty e
jsp:setProperty);
Redirecionar a requisição para outra página JSP (jsp:forward);
Uma única tag do browser cliente (jsp:plugin e jsp:fallback).
WWW.COTIINFORMATICA.COM.BR 158
Estrutura do projeto feito em aula depois
de finalizado:
Usuario.java
package entity;
public Usuario() {
WWW.COTIINFORMATICA.COM.BR 159
}
@Override
public String toString() {
return "Usuario [idUsuario=" + idUsuario + ", login="
+ login + ", senha=" + senha + "]";
}
scritp.sql
mysql -u root -pcoti
create database BDDOISB;
use BDDOISB;
show tables;
desc usuario;
WWW.COTIINFORMATICA.COM.BR 160
Visualizando os comando no banco
create database BDDOISB;
use BDDOISB;
WWW.COTIINFORMATICA.COM.BR 161
show tables;
desc usuario;
DAO.java
package persistence;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
("jdbc:mysql://localhost:3306/BDDOISB","root","coti");
}
WWW.COTIINFORMATICA.COM.BR 162
}
}
UsuarioDao.java
package persistence;
import entity.Usuario;
WWW.COTIINFORMATICA.COM.BR 163
Para rodar a classe
Clicar na classe UsuarioDao.java com o botão direito -> run as -> java
application.
Resultado na aba de Console.
WWW.COTIINFORMATICA.COM.BR 164
Java WebDeveloper Noite -
Aula 13 (Seg, Qua, Sex)
Tema da aula:
Projeto JSP, Bootstrap conceitos, Criar projeto Dynamic, Importar projeto,
MySql, script, Dao, Gravar, logar, Bibliotecas online, Jumbotron, grid, card,
shadow, form
WWW.COTIINFORMATICA.COM.BR 165
Criando um Dynamic Web Project
WWW.COTIINFORMATICA.COM.BR 166
Download do Apache TomCat
WWW.COTIINFORMATICA.COM.BR 167
Clicar em finish
WWW.COTIINFORMATICA.COM.BR 168
Mudar a versão do dynamic web module para 3.1 -> next
Next
WWW.COTIINFORMATICA.COM.BR 169
Clicar em generate web.xml Finish
WWW.COTIINFORMATICA.COM.BR 170
Importando um Projeto Web
WWW.COTIINFORMATICA.COM.BR 171
Selecionar “war file” next.
WWW.COTIINFORMATICA.COM.BR 172
Clicar no arquivo “war” Abrir…
Clicar em Finish.
WWW.COTIINFORMATICA.COM.BR 173
Projeto importado…
Frameworks CSS
Frameworks CSS são bibliotecas pré-preparadas que se destinam a facilitar
mais estilizações de páginas web compatíveis com os padrões usando a
linguagem Cascading Style Sheets. Alguns exemplos notáveis e amplamente
utilizados de frameworks são o Bootstrap ou Foundation.
Tipografia web
WWW.COTIINFORMATICA.COM.BR 174
janelas modais (Luz)
Bootstrap - https://getbootstrap.com/
Vantagens:
WWW.COTIINFORMATICA.COM.BR 175
Funciona em todos os navegadores atuais (Chrome, Safari, Firefox, IE,
Opera).
Desvantagens:
Tema padrão e comum do Bootstrap (caso não faça ajustes visuais, seu
projeto se parecerá com outros que também utilizam o Bootstrap).
WWW.COTIINFORMATICA.COM.BR 176
Estrutura do projeto feito em aula depois
de finalizado:
WWW.COTIINFORMATICA.COM.BR 177
Usuario.java
package entity;
public Usuario() {
}
@Override
public String toString() {
return "Usuario [idUsuario=" + idUsuario + ", login="
+ login + ", senha=" + senha + "]";
}
WWW.COTIINFORMATICA.COM.BR 178
script.sql
mysql -u root -pcoti
create database BDDOISB;
use BDDOISB;
show tables;
desc usuario;
DAO.java
package persistence;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
WWW.COTIINFORMATICA.COM.BR 179
UsuarioDao.java
package persistence;
import entity.Usuario;
WWW.COTIINFORMATICA.COM.BR 180
Bibliotecas online
WWW.COTIINFORMATICA.COM.BR 181
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Primeira aula web</title>
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/boots
trap.min.css"
integrity="sha384-
9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk"
crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
integrity="sha384-
DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
crossorigin="anonymous"></script>
<script
src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper
.min.js"
integrity="sha384-
Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
crossorigin="anonymous"></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstr
ap.min.js"
integrity="sha384-
OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI"
crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<div class="jumbotron">
<h1 class="text-center">Projeto Usuário</h1>
</div>
WWW.COTIINFORMATICA.COM.BR 182
<label>Senha:</label>
<input type="password" name="senha"
placeholder="Digite sua senha"
class="form-control" required="required">
WWW.COTIINFORMATICA.COM.BR 183
Selecionar o Tomcat 8.0 -> NEXT
WWW.COTIINFORMATICA.COM.BR 184
Selecionar a pasta. Não é necessário entrar no diretorio.
Clicar em FINISH
WWW.COTIINFORMATICA.COM.BR 185
Aguardar abrir o browser
WWW.COTIINFORMATICA.COM.BR 186
Java WebDeveloper Noite -
Aula 14 (Seg, Qua, Sex)
Tema da aula:
Projeto Rest, Webservice, Json, MySql, script, gravar, logar, listar, buscar pelo
codigo, Controller, Rotas, configuração do web.xml
Web service
WWW.COTIINFORMATICA.COM.BR 187
que novas aplicações possam interagir com aquelas que já existem e que
sistemas desenvolvidos em plataformas diferentes sejam compatíveis. Os
Web services são componentes que permitem às aplicações enviar e receber
dados em formato XML. Cada aplicação pode ter a sua própria “linguagem”,
que é traduzida para uma linguagem universal, um formato intermediário
como XML, Json, CSV, etc.
Utilizando a tecnologia Web Service, uma aplicação pode invocar outra para
efetuar tarefas simples ou complexas mesmo que as duas aplicações estejam
em diferentes sistemas e escritas em linguagens diferentes. Por outras
palavras, os Web Services fazem com que os seus recursos estejam
disponíveis para que qualquer aplicação cliente possa operar e extrair os
recursos fornecidos pelo Web Service.
WWW.COTIINFORMATICA.COM.BR 188
interoperabilidade entre as aplicações, a EAI permite definir um workflow
entre as aplicações e pode constituir uma alternativa aos ERP (Enterprise
Resource Planning). Com umworkflow é possível otimizar e controlar
processos e tarefas de uma determinada organização.
Padrão
A W3C, OASIS são as instituições responsáveis pela padronização dos Web
Services. Empresas como IBM e Microsoft, duas das maiores do setor de
tecnologia, apoiam o desenvolvimento deste padrão.
Tecnologias
As bases para a construção de um Web service são os padrões XML e SOAP.
O transporte dos dados é realizado normalmente via protocolo HTTP ou
HTTPS para conexões seguras (o padrão não determina o protocolo de
transporte). Os dados são transferidos no formato XML, encapsulados pelo
protocolo SOAP. Também é bastante comum usar o protocolo REST(
Representational transfer protocol), para transferir o estado do dado para a
aplicação.
Segurança
Muitas empresas temiam, no passado, prover funcionalidades na Internet
devido ao medo de expor seus dados. Mas com advento dos Web Services
elas podem publicar serviços de forma simples e que são totalmente
isolados da base de dados. A segurança dos Web Services é um dos pontos
fracos desta tecnologia. O problema não é a falta de mecanismos de
segurança mas sim a falta de consenso em qual deve ser o mecanismo a ser
adaptado pela tecnologia Web Service. As questões mais relevantes na
segurança são as seguintes:
WWW.COTIINFORMATICA.COM.BR 189
Autenticidade (ter a certeza que uma transação do Web Service
ocorreu entre o servidor e seu cliente;
Integração de sistemas
Muitas pessoas consideram que os Web services corrigem um grande
problema da informática: a falta de integração de sistemas. Os Web services
permitem que a integração de sistemas seja realizada de maneira
compreensível, reutilizável e padronizada. É uma tentativa de organizar um
cenário cercado por uma grande variedade de diferentes aplicativos,
fornecedores e plataformas.
Tecnologias Utilizadas
Para a representação e estruturação dos dados nas mensagens
recebidas/enviadas é utilizado o XML . As chamadas às operações, incluindo
os parâmetros de entrada/saída, são codificadas no protocolo SOAP. Os
serviços (operações, mensagens, parâmetros, etc.) são descritos usando a
linguagem WSDL. O processo de publicação/pesquisa/descoberta de Web
Services utiliza o protocolo UDDI.
WWW.COTIINFORMATICA.COM.BR 190
RESTFULL
O que é REST?
REST é acrônimo de Representational State Transfer, e tem como objetivo
primário a definição de características fundamentais para a construção de
aplicações Web seguindo boas práticas. A Web como a conhecemos hoje,
funciona seguindo práticas REST, e para entendermos melhor, vamos
considerar o exemplo abaixo:
WWW.COTIINFORMATICA.COM.BR 191
O servidor interpreta sua requisição e de acordo com o que foi
solicitado, uma resposta HTTP é retornada ao seu navegador.
Recursos
Um recurso é um elemento abstrato e que nos permite mapear qualquer
coisa do mundo real como um elemento para acesso via Web. A partir desse
endereço, estamos aptos a acessar algum recurso, que poderia ser por
exemplo, cursos ou alunos.
Interfaces Uniforme
O HTTP nos fornece uma interface de operações padronizadas, permitindo
que possamos criar, atualizar, pesquisar, remover e executar operações sob
um determinado recurso. Além de operações padronizadas, o HTTP fornece
um conjunto de respostas para que os clientes (navegadores, APIs, etc)
possam saber, de forma adequada, como agir perante uma determinada
resposta.
GET
O método GET é utilizado quando existe a necessidade de se obter um
recurso. Ao executar o método GET sob um recurso, uma representação será
devolvida pelo servidor. Em aplicações Web, normalmente é retornado uma
representação HTML.
WWW.COTIINFORMATICA.COM.BR 192
POST
Utilizamos o método POST quando desejamos criar algum recurso no
servidor a partir de uma determinada representação. Exemplo disso é
quando fazemos a submissão de algum formulário em uma página Web.
DELETE
Como você já deve estar imaginando, o método DELETE é utilizado com o
intuito de remover um recurso em um determinado servidor.
Respostas
Baseado nos métodos, o servidor deve processar cada uma das requisições e
retornar uma resposta adequada. Veja um resumo de cada uma dessas
respostas.
WWW.COTIINFORMATICA.COM.BR 193
Para cada tipo que você pode ver, existe uma série de respostas
relacionadas. Por exemplo, se o servidor retornar um “200 OK”, significa que
o recurso pedido foi retornado com sucesso. Por outro lado, se o servidor
retornar um “404 Not Found”, significa que o recurso que estamos pedindo
não foi encontrado. Apesar de muitas aplicações Web não seguirem o uso
adequado de métodos e respostas, devemos sempre que possível, construir
nossas aplicações utilizando-as da maneira mais adequada possível.
Representações
Em aplicações Web, a representação mais utilizada é o HTML. Essa
representação é utilizada como forma de encapsular as informações
relacionadas a um determinado recurso. Além do HTML, podemos utilizar
XML, JSON, ou algum outro formato que melhor atenda o cenário que
estamos desenvolvendo. É importante citar que um recurso pode ter mais de
uma representação, ou seja, podemos construir aplicações que para
determinados cenários, retornem representações diferentes, baseado nas
necessidades de cada cliente.
Hypermedia
Hypermedia é um dos conceitos mais importantes em aplicações que
seguem o modelo REST. É essa característica que permite criarmos
aplicações que possam evoluir de formas tão surpreendentes. Uma
representação hypermedia trabalha basicamente como um motor de estado,
permitindo que clientes naveguem nos mesmos. Cada estado é um
documento (uma página HTML) e possui referências para futuros estados (a
partir de links).
WWW.COTIINFORMATICA.COM.BR 194
Anotações Descrição
WWW.COTIINFORMATICA.COM.BR 195
Anotações Descrição
WWW.COTIINFORMATICA.COM.BR 196
Anotações Descrição
WWW.COTIINFORMATICA.COM.BR 197
WWW.COTIINFORMATICA.COM.BR 198
Bibliotecas utilizadas no projeto:
WWW.COTIINFORMATICA.COM.BR 199
Usuario.java
package entity;
public Usuario() {
}
@Override
public String toString() {
return "Usuario [idUsuario=" + idUsuario + ", login="
+ login + ", senha=" + senha + "]";
}
WWW.COTIINFORMATICA.COM.BR 200
script.sql
drop database BDDOIS;
use BDDOIS;
select*from usuario;
Visualizando no banco:
drop database BDDOIS;
use BDDOIS;
WWW.COTIINFORMATICA.COM.BR 201
);
select*from usuario;
DAO.java
package persistence;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
WWW.COTIINFORMATICA.COM.BR 202
conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/BDDOISB", "root", "coti");
}
}
}
UsuarioDao.java
package persistence;
import java.util.ArrayList;
import entity.Usuario;
while (rs.next()) {
Usuario u = new Usuario(rs.getInt("idUsuario"),
rs.getString("login"), rs.getString("senha"));
lista.add(u);
}
return lista;
}
WWW.COTIINFORMATICA.COM.BR 203
public Usuario findByCode(Integer cod) throws Exception {
open();
stmt = conn.prepareStatement("select * from usuario
where idUsuario=?");
stmt.setInt(1, cod);
rs = stmt.executeQuery();
Usuario usuario = null;
if (rs.next()) {
usuario = new Usuario(rs.getInt(1),
rs.getString(2),
rs.getString(3));
}
return usuario;
}
}
UsuarioService.java
package service;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.google.gson.Gson;
import entity.Usuario;
import persistence.UsuarioDao;
@Path("/usuario")
public class UsarioService {
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getDados() {
try {
return new Gson().toJson(new UsuarioDao()
.findAll());
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
WWW.COTIINFORMATICA.COM.BR 204
public String gravar(String usuario) {
try {
Usuario resp = new Gson().fromJson
(usuario, Usuario.class);
new UsuarioDao().create(resp);
return new Gson().toJson(resp);
} catch (Exception ex) {
Map<String, String> mapa = new HashMap
<String, String>();
mapa.put("error", "Dados nao Gravados");
return new Gson().toJson(mapa);
}
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>service</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
WWW.COTIINFORMATICA.COM.BR 205
Clicar no projeto com o botão direito -> run as -> run on server
WWW.COTIINFORMATICA.COM.BR 206
Java WebDeveloper Noite -
Aula 15 (Seg, Qua, Sex)
Tema da aula:
Projeto JSP MVC, Validação dos campos, Controller, Mostrar Dados
WWW.COTIINFORMATICA.COM.BR 207
Aluno.java
package entity;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public Aluno() {
WWW.COTIINFORMATICA.COM.BR 208
}
@Override
public String toString() {
return "Aluno [idAluno=" + idAluno + ", nome=" +
nome + ", disciplina=" + disciplina + ", nota1=" + nota1
+ ", nota2=" + nota2 + ", media=" + media + "]";
}
// validacao de campos
WWW.COTIINFORMATICA.COM.BR 209
public Boolean isNome() {
Pattern p = Pattern.compile("[a-z A-Z]{2,50}");
Matcher m = p.matcher(this.nome);
return m.matches();
}
ControllerAluno.java
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entity.Aluno;
@WebServlet("/ControllerAluno")
public class ControllerAluno extends HttpServlet {
private static final long serialVersionUID = 1L;
WWW.COTIINFORMATICA.COM.BR 210
public static int id = 0;
sistemaaluno.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- nome,disciplina,nota1, nota2 -->
<form method="post" action="ControllerAluno">
<h2>Cadastro Aluno</h2>
<br />Nome<br />
<input type="text" name="nome" id="nome" size="50"
required="required" /> <br />Disciplina<br />
<select
name="disciplina" id="disciplina">
<option value="nada">Escolha os Opcoes</option>
<option value="java">java</option>
<option value="node">node</option>
<option value="javascript">javascript</option>
WWW.COTIINFORMATICA.COM.BR 211
<option value="angular">angular</option>
</select>
<br />Nota1<br />
<input type="number" step="0.1" name="nota1" id="nota1"
size="50" required="required" /> <br />
Nota2<br />
<input type="number" step="0.1" name="nota2" id="nota2"
size="50" required="required" /> <br />
<button type="submit" id="btn1">Enviar os Dados</button>
<div id="respostaServidor">${msg}</div>
</form>
</body>
</html>
Rodar o projeto
Clicar na classe sistemaaluno.jsp com o botão direito -> run as -> run on
server
WWW.COTIINFORMATICA.COM.BR 212
Selecionar o Tomcat -> Finish
WWW.COTIINFORMATICA.COM.BR 213
Preencher as informações
WWW.COTIINFORMATICA.COM.BR 214
Java WebDeveloper Noite -
Aula 16 (Seg, Qua, Sex)
Tema da aula:
Projeto JSP, Junit Teste, Relacionamento OneToMany, Calculo, @Before,
AssertTrue
JUNIT Test
https://junit.org/junit5/
WWW.COTIINFORMATICA.COM.BR 215
sistema, o framework execute todos os testes para garantir a integridade e
estabilidade do que foi desenvolvido.
Toda classe de teste deve ser criada com a palavra Test no final.
O teste é uma das partes mais importantes para a garantia da qualidade no
desenvolvimento de um software. Testar é assegurar que todas as
funcionalidades esperadas estão implementadas corretamente. Testar é
descobrir falhas/bugs para que sejam corrigidas até que a versão final atinja
a qualidade desejada. Testar é validar se uma parte do software está pronta
para ser disponibilizada em produção.
Testando funcionalidades
Para testar seu código em condições específicas, utilizamos o método assert,
fornecido pelo framework ou outra estrutura de declaração, normalmente
chamadas de asserts ou assert statements. Essa estrutura permite que
especifiquemos uma mensagem de erro e comparar o resultado real do
teste com o resultado esperado. Temos vários tipos de asserts que podem
ser implementados:
WWW.COTIINFORMATICA.COM.BR 216
fail([message]): pode ser usado para verificar se uma determinada parte do
código não é atingida ou para ter um teste com falha antes que o código de
teste seja implementado. O parâmetro da mensagem é opcional.
assertTrue([message,] boolean condition): verifica se a condição booleana é
verdadeira.
assertFalse([message,] boolean condition): verifica se a condição booleana
é falsa.
assertEquals([message,] expected, actual): testa se dois valores (esperado e
atual) são os mesmos. No caso de arrays, a verificação é em relação à
referência e não ao conteúdo.
assertEquals([message,] expected, actual, tolerance): testa se dois valores
float ou double correspondem. A tolerância é o número de casas decimais
que devem ser consideradas na comparação.
assertNull([message,] object): verifica se o objeto é nulo.
assertNotNull([message,] object): verifica se o objeto não é nulo.
assertSame([message,] expected, actual): verifica se ambas as variáveis se
referem ao mesmo objeto.
assertNotSame([message,] expected, actual): verifica se ambas as variáveis
se referem a objetos diferentes.
Anotações
Anotação Descrição
WWW.COTIINFORMATICA.COM.BR 217
Anotação Descrição
WWW.COTIINFORMATICA.COM.BR 218
Anotação Descrição
@ParameterizedTest, ou @TestFactorymétodo na
classe atual; análogo ao JUnit 4 @After. Tais
métodos são herdados, a menos que sejam
substituídos.
WWW.COTIINFORMATICA.COM.BR 219
Anotação Descrição
Suites Case
A principal função de um test suíte é rodar vários test cases ao “mesmo
tempo”, na verdade trata-se de uma classe que contém métodos que
disparam a execução de vários test cases. O Eclipse também disponibiliza de
maneira simples um assistente para a criação de classes de testes suítes.
WWW.COTIINFORMATICA.COM.BR 220
Estrutura do projeto feito em aula depois
de finalizado:
Aluno.java
package entitty;
public Aluno() {
WWW.COTIINFORMATICA.COM.BR 221
public Aluno(Integer idAluno, String nomeAluno, String disciplina,
Double media) {
super();
this.idAluno = idAluno;
this.nomeAluno = nomeAluno;
this.disciplina = disciplina;
this.media = media;
}
@Override
public String toString() {
return "Aluno [idAluno=" + idAluno + ", nomeAluno="
+ nomeAluno + ", disciplina=" + disciplina + ", media="
+ media + "]";
}
WWW.COTIINFORMATICA.COM.BR 222
Turma.java
package entitty;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public Turma() {
}
@Override
public String toString() {
return "Turma [idTurma=" + idTurma + ", nomeTurma="
+ nomeTurma + ", dataInicio=" + dataInicio + ", mediaTurma="
+ mediaTurma + "]";
}
WWW.COTIINFORMATICA.COM.BR 223
}
// null
public Boolean isAlunos() {
if (this.alunos != null) {
return true;
} else {
return false;
}
}
WWW.COTIINFORMATICA.COM.BR 224
TestTurma.java
package test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import entitty.Aluno;
import entitty.Turma;
List<Aluno> alunos;
Turma turma;
Aluno aluno;
@Before()
public void init() {
this.aluno = new Aluno();
this.alunos = new ArrayList<Aluno>();
this.turma = new Turma();
}
@Test
public void testarQuantidadeAlunos() {
this.turma.adicionarAluno(new Aluno(10, "miguel", "java", 9.));
this.turma.adicionarAluno(new Aluno(11, "joao", "java", 9.));
this.turma.adicionarAluno(new Aluno(12, "clara", "java", 10.));
// Listas
// Assert.assertTrue(this.turma.getAlunos().size()==3);
this.alunos.addAll(Arrays.asList(new Aluno[]
{ new Aluno (10, "miguel", "java", 9.),
new Aluno(11, "joao", "java", 9.),
new Aluno(12, "clara", "java", 10.) }));
Assert.assertTrue(this.alunos.size() ==
this.turma.getAlunos().size());
}
@Test
public void testarRelacionamento() {
// para turma adicionar assim
this.turma.adicionarAluno(new Aluno(13, "timoteo", "java", 10.));
this.aluno.setTurma(this.turma);
// relacionamento BIDIRECIONAL ...
Assert.assertTrue(turma.getAlunos() != null && aluno.getTurma()
!= null);
}
}
WWW.COTIINFORMATICA.COM.BR 225
Rodar o projeto pela classe de teste
Clicar com o botão direito no classe TestTurma.java -> run as -> java
application
WWW.COTIINFORMATICA.COM.BR 226
Java WebDeveloper Noite -
Aula 17 (Seg, Qua, Sex)
Tema da aula:
Projeto Springboot, Hibernate 5.2, Mysql, Annotations, Configuração do
banco no properties, JpaRepository, Controller, Rotas, Listar
WWW.COTIINFORMATICA.COM.BR 227
Bibliotecas utilizadas:
WWW.COTIINFORMATICA.COM.BR 228
Livro.java
package br.com.coti.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "livro")
public class Livro implements Serializable {
@Column(name = "livro_id")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 50)
private String nomeLivro;
@Column
private Double precoLivro;
@Column
private String imagem;
public Livro() {
}
@Override
public String toString() {
return "Livro [id=" + id + ", nomeLivro=" + nomeLivro
+ ", precoLivro=" + precoLivro + ", imagem=" + imagem +
"]";
}
WWW.COTIINFORMATICA.COM.BR 229
public void setId(Long id) {
this.id = id;
}
application.properties
spring.jpa.properties.hibernate.dialect=
org.hibernate.dialect.MySQL5Dialect
spring.datasource.url=jdbc:mysql://localhost:3306/BDSPRINGBOOT0?
createDatabaseIfNotExist=true&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=coti
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
WWW.COTIINFORMATICA.COM.BR 230
spring.thymeleaf.enabled=false
server.port=7744
LivroRepository.java
package br.com.coti.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import br.com.coti.entity.Livro;
@Repository
public interface LivroRepository extends JpaRepository<Livro, Long> {
LivroRestController.java
package br.com.coti.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import br.com.coti.entity.Livro;
import br.com.coti.repository.LivroRepository;
@RestController
@ResponseBody
public class LivroRestController {
@Autowired
LivroRepository dao;
@GetMapping("/livro")
public List<Livro> findAll() {
return dao.findAll();
}
}
Application.java
WWW.COTIINFORMATICA.COM.BR 231
package br.com.coti.application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.
EnableJpaRepositories;
@SpringBootApplication
@EntityScan(basePackages = "br.com.coti.entity")
@EnableJpaRepositories(basePackages = "br.com.coti.repository")
@ComponentScan(basePackages = "br.com.coti.controller")
public class Application {
Rodar o projeto
Clicar na classe application.java com o botão direito -> run as -> java
application
WWW.COTIINFORMATICA.COM.BR 232
Aguardar o servidor iniciar
WWW.COTIINFORMATICA.COM.BR 233
Java WebDeveloper Noite -
Aula 18 (Seg, Qua, Sex)
Tema da aula:
Projeto Angular, Conceitos, Typescript, Instalação Angular, Node, Orientação
a Objetos em Typescript, Serviço, calculo, Material Design Bootstrap,
Fontawesome, wow, animação, card
Instalar o Angular
Este comando instala a versão mais recente
WWW.COTIINFORMATICA.COM.BR 234
As versões que estamos usando no curso:
Outros comandos
ng v
Criar um projeto.
ng new nome_do_projeto
WWW.COTIINFORMATICA.COM.BR 235
diretorio
Node js
WWW.COTIINFORMATICA.COM.BR 236
https://nodejs.org/en/
WWW.COTIINFORMATICA.COM.BR 237
Como o Node funciona?
O Node roda em uma JavaScript V8 VM. Mas espere, JavaScript no servidor?
Isso, você leu certo. JavaScript no lado do servidor pode ser um conceito
novo para todos que trabalharam exclusivamente com o JavaScript no lado
do cliente, mas a idéia em sí não é tão absurda – porque não usar a mesma
linguagem de programação no cliente que você usa no servidor?
O que é V8? O motor JavaScript V8 é o motor que a Google usa com seu
navegador Chrome. Poucas pessoas pensam sobre o que realmente
acontece com o JavaScript no lado do cliente. Bem, a engine JavaScript
realmente interpreta o código e o executa. Com o V8 a Google criou um
ultra-rápido interpretador escrito em C++, com um outro aspecto único:
você pode baixar a engine e incorporá-la em qualquer aplicação desejada.
Isso não está restrito em rodar em um navegador. Então Node atualmente
usa o motor JavaScript V8 escrito pela Google e propõe que seja usado no
servidor.
Conceitos Gerais
Classe e Objeto
WWW.COTIINFORMATICA.COM.BR 238
Para definir os dados são utilizados os atributos, e para definir o
comportamento são utilizados métodos. Depois que uma classe é definida
podem ser criados diferentes objetos que utilizam a classe. A Listagem 1
mostra a definição da classe Empresa, que tem os atributos nome, endereço,
CNPJ, data de fundação, faturamento, e também o método imprimir, que
apenas mostra os dados da empresa.
Encapsulamento
O conceito do encapsulamento consiste em “esconder” os atributos da
classe de quem for utilizá-la. Isso se deve por dois motivos principais.
Um é para que alguém que for usar a classe não a use de forma errada
como, por exemplo, em uma classe que tem um método de divisão entre
dois atributos da classe - se o programador java não conhecer a
implementação interna da classe, ele pode colocar o valor zero no atributo
do dividendo, mas se a classe estiver corretamente encapsulada podemos
impedir que o programador faça isso.
Associação de Classes
Herança
WWW.COTIINFORMATICA.COM.BR 239
A herança é um tipo de relacionamento que define que uma classe “é um”
de outra classe como, por exemplo, a classe Funcionario que é uma Pessoa,
assim um Funcionário tem um relacionamento de herança com a classe
Pessoa. Em algumas linguagens, como C, é possível fazer herança múltipla,
isto é, uma classe pode herdar de diversas outras classes, mas em Java isso
não é permitido, pois cada classe pode herdar de apenas outra classe.
Interface
WWW.COTIINFORMATICA.COM.BR 240
Em algumas linguagens de programação, o termo interface (ou protocolo) é
uma referência à característica que permite a construção de interfaces que
isolam do mundo exterior os detalhes de implementação de um
componente de software.
WWW.COTIINFORMATICA.COM.BR 241
métodos ou funcionalidades comuns a um conjunto de classes. Ver interface
na linguagem Java.
Desenvolvimento de Software
WWW.COTIINFORMATICA.COM.BR 242
shell faz a interface com o sistema operacional. O front-endreveste o usuário
e o back-end executa os programas do sistema operacional em resposta.
Arquitetura MVC
WWW.COTIINFORMATICA.COM.BR 243
frameworks MVC populares que são atualmente usados no
desenvolvimentos de aplicações web.
WWW.COTIINFORMATICA.COM.BR 244
Um array é uma estrutura de dados homogênea que mantém uma série de
elementos de dados de mesmo tipo. Pode-se acessar os elementos
individuais armazenados no array por meio de uma posição de índice
associada, geralmente numérica.
Unidimensional: Vetor
Bidimensional: Matriz
Tridimensional: Cubo
WWW.COTIINFORMATICA.COM.BR 245
permite portanto armazenar até quatro dados, de nome Notas.
Declaração de vetores
Podemos declarar um vetor em português estruturado usando a seguinte
sintaxe:
nomeVetor: vetor [i…f] de Tipo_Dados
Onde:
Declaração de Matrizes
WWW.COTIINFORMATICA.COM.BR 246
int Vetor[5]; // declara um vetor de 5 posições
int Matriz[5][3]; // declara uma matriz de 5 linhas e 3 colunas
Operador ternário
WWW.COTIINFORMATICA.COM.BR 247
double salario = 1000;
double bonus = 0.0;
System.out.println(bonus);
Nesse exemplo o resultado é 150.0 pois o salário é menor que R$ 1000.0, ou
seja, bônus de 15%.
WWW.COTIINFORMATICA.COM.BR 248
Vejamos alguns exemplos:
JavaScript:
Angular
WWW.COTIINFORMATICA.COM.BR 249
Arquitetura de uma aplicação Angular. Os principais blocos são módulos,
componentes, templates, metadados, enlace de dados, directivas, serviços e
injeção de dependência.Angular foi uma base de reescrita do AngularJS.
Typescript
WWW.COTIINFORMATICA.COM.BR 250
TypeScript é um superconjunto de JavaScript desenvolvido pela Microsoft
que adiciona tipagem e alguns outros recursos a linguagem. Anders
Hejlsberg, arquiteto da linguagem C# e criador das linguagens Delphi e
Turbo Pascal, trabalhou no desenvolvimento do TypeScript. A linguagem
pode ser usada para desenvolver aplicações JavaScript no lado cliente e lado
servidor (Node.js).
Foi considerada pelo público a 4ª linguagem “mais amada”, de acordo com
uma pesquisa conduzida pelo site Stack Overflow em 2018, e está entre as
15 linguagens mais populares, de acordo com uma pesquisa conduzida pela
RedMonk
WWW.COTIINFORMATICA.COM.BR 251
var foo = 42; // foo is now a Number
var foo = 'bar'; // foo is now a String
var foo = true; // foo is now a Boolean
Em uma linguagem fracamente tipada, o tipo de um valor depende de como
ele é usado . Por exemplo, se eu puder passar uma string para o operador
de adição e ela será automaticamente interpretada como um número ou
causará um erro se o conteúdo da string não puder ser traduzido em um
número . Da mesma forma, posso concatenar cadeias e números ou usar
strings como booleanos, etc.
Em uma linguagem fortemente tipada, uma variável tem um tipo e esse tipo
não pode mudar . O que você pode fazer com uma variável depende do seu
tipo. Se tentarmos compilar o código acima no TypeScript, obteremos o
erro:
Lembrar:
Orientado a Objeto
A programação orientada a objetos (OOP) é um conceito antigo usado por
vários idiomas, como Java ou C #, para ajudar o desenvolvedor a associar
dados e métodos em um “objeto”. Em OOPobjeto são criados e são capazes
de interagir uns com os outros usando os métodos de enfrentamento
público um do outro. JavaScript em si não é uma linguagem orientada a
objetos na maneira que C ++, C # ou Java são. O TypeScript, por outro lado,
pode ser tratado como uma linguagem orientada a objetos por causa das
construções de linguagem introduzidas sobre os fechamentos de JavaScript.
O TypeScript traz muitos recursos orientados a objetos que perdemos no
JavaScript por um longo tempo. Temos conceitos explícitos de:
Classes
WWW.COTIINFORMATICA.COM.BR 252
Interfaces
Construtores
Modificadores de acesso (públicos e privados)
Fundamentos do TypeScript
O TypeScript fornece aos desenvolvedores conceitos orientados a objeto e
compila a verificação do tipo de tempo em cima do JavaScript, o que ajuda a
escrever código mais estruturado, sustentável e robusto. O TypeScript
introduz alguns dos termos orientados a objetos padrão, como Classes,
Interfaces, Module e Variables, que no final são convertidos em várias
formas diferentes de JavaScript. A estrutura de código para um arquivo
TypeScript típico é mostrada abaixo.
Módulo
O módulo é como um namespace no mundo .NET e pode conter classes e
interfaces. Os módulos não possuem nenhum recurso próprio, eles apenas
fornecem um contêiner que pode ser usado para estruturar o código de
forma lógica. Olhe para o módulo apenas como um contêiner de entidade
lógica / comercial.
WWW.COTIINFORMATICA.COM.BR 253
Interface
Interfaces são exatamente como interfaces no .NET que fornecem um
contrato para as classes implementarem. O TypeScript ajuda a fornecer
verificação de erros de tempo de compilação para as classes que
implementam essas interfaces. Se todos os métodos não foram
implementados corretamente (incluindo a assinatura do método), o
TypeScript sinaliza aqueles em tempo de design, bem como o tempo de
compilação. Coisa interessante sobre Interfaces é que eles não existem em
JavaScript e, portanto, quando compilamos um arquivo TypeScript em
JavaScript, as Interfaces são omitidas.
Classes
O conceito de Classes é novamente muito semelhante ao mundo .NET /
Java. Classes contém variáveis, propriedades e métodos que formam uma
entidade lógica. O TypeScript também permite definir o escopo da variável e
funções com palavras-chave como “ private” e “ public”, embora esse escopo
não tenha qualquer efeito sobre o JavaScript gerado.
Funções
Funções são métodos em que a lógica é implementada. O TypeScript
fornece suporte de tempo de compilação para garantir que qualquer pessoa
que chame a função mencionada concorde com o argumento de entrada e
com o tipo de valor de retorno.
Variáveis
Variáveis são os campos definidos dentro de uma classe ou função. O
TypeScript nos permite definir uma variável usando a palavra-chave “ var” e
atribuir um tipo de dados a ela. Uma vez que um tipo de dado é atribuído,
qualquer uso adicional da variável deve ser com o mesmo tipo de dados,
caso contrário, o TypeScript gerará erro no design e no tempo de
compilação. O TypeScript também é inteligente o suficiente para inferir o
tipo de uma variável e depois tratá-la como esse tipo quando uma variável é
declarada e inicializada. Nos casos em que o TypeScript não é capaz de
inferir o tipo, ele atribuirá esse tipo de variável “ any”.
Tipos de TypeScript
O TypeScript fornece alguns tipos primitivos (mostrados abaixo), bem como
um tipo dinâmico “ any”. " Any" É como " dynamic" palavra-chave em c # em
que podemos atribuir qualquer tipo de valor para a variável. O TypeScript
WWW.COTIINFORMATICA.COM.BR 254
não sinaliza erros de tipo para variáveis do tipo “ any”.
No TypeScript, definimos uma variável com um tipo apenas acrescentando o
nome da variável com dois-pontos, seguido do nome do tipo, como
mostrado no exemplo abaixo.
Classes e Interface
Classes
Classes TypeScript são uma unidade básica de abstração muito semelhante
às classes C # / Java. No TypeScript, uma classe pode ser definida com a
palavra-chave “ class” seguida do nome da classe. Classes TypeScript podem
conter construtor, campos, propriedades e funções. O TypeScript permite
que os desenvolvedores definam o escopo da variável dentro das classes
como “ public” ou “ private”. É importante notar que as palavras-chave “
public/ private” só estão disponíveis no TypeScript, uma vez convertido para
JavaScript, não há como distinguir entre os dois e ambos podem ser
chamados. O TypeScript define um construtor usando a palavra-chave "
constructor".
WWW.COTIINFORMATICA.COM.BR 255
Para criar o projeto
Digitar no terminal:
ng new nome_do_projeto
y -> sim, para criar as rotas
css -> padrão do estilo
readme.md
ng g c aluno _ guia ,...
ng serve -open
ng s -o --port 4545
ng s
npm i npm-registry-client
ng add angular-bootstrap-md
WWW.COTIINFORMATICA.COM.BR 256
aluno.ts
export class Aluno {
idAluno: number;
nome: string;
nota1: number;
nota2: number;
disciplina: string;
media: number;
situacao: string;
public getDados() {
return this.idAluno + "," + this.nome + "," +
this.nota1 + "," + this.nota2 + "," + this.disciplina
+ "," + this.media + "," + this.situacao;
}
}
aluno.service.ts
import { Injectable } from '@angular/core';
import { Aluno } from '../model/aluno';
@Injectable()
export class AlunoService {
WWW.COTIINFORMATICA.COM.BR 257
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
@NgModule({
declarations: [
AppComponent,
AlunoComponent
],
imports: [
BrowserModule,
AppRoutingModule,
FormsModule,
MDBBootstrapModule.forRoot()
],
providers: [AlunoService],
bootstrap: [AppComponent]
})
export class AppModule { }
app.component.html
<app-aluno></app-aluno>
aluno.component.ts
import { AlunoService } from './../service/aluno.service';
import { Component, OnInit } from '@angular/core';
import { Aluno } from '../model/aluno';
@Component({
selector: 'app-aluno',
templateUrl: './aluno.component.html',
styleUrls: ['./aluno.component.css']
})
export class AlunoComponent implements OnInit {
aluno: Aluno;
WWW.COTIINFORMATICA.COM.BR 258
alunos: Aluno[] = [];
ngOnInit() {
}
}
Digitar no terminal:
npm i npm-registry-client
ng add angular-bootstrap-md
aluno.component.html
<h1 class="bg-info p-5 text-center text-white wow animated slideInLeft">
<i class="fas fa-user-graduate"></i>
Projeto aluno
<i class="fas fa-user-graduate"></i>
</h1>
<div class="container">
WWW.COTIINFORMATICA.COM.BR 259
<div class="col-md-6 offset-md-3">
<div class="card card-body shadow">
<label>Id Aluno:</label>
<input type="number" name='idAluno' [(ngModel)]='aluno.idAluno'
class="form-control">
<label>Nome:</label>
<input type='text' name='nome' [(ngModel)]='aluno.nome' class="form-
control">
<label>Nota1:</label>
<input type='number' name='nota1' [(ngModel)]='aluno.nota1' class="form-
control">
<label>Nota2:</label>
<input type='number' name='nota2' [(ngModel)]='aluno.nota2' class="form-
control">
<label>Disciplina:</label>
<input type='text' name='disciplina' [(ngModel)]='aluno.disciplina'
class="form-control">
<br>
<button mdbBtn class="btn btn-info" mdbWavesEffect>Calcular Média
</button>
<button mdbBtn class="btn btn-primary" mdbWavesEffect>Calcular
Situação</button>
</div>
</div>
</div>
Rodar o projeto
Digitar no terminal:
ng s -o
WWW.COTIINFORMATICA.COM.BR 260
http://localhost:4200/
WWW.COTIINFORMATICA.COM.BR 261
Java WebDeveloper Noite -
Aula 19 (Seg, Qua, Sex)
Tema da aula:
Projeto Springboot, Hibernate 5.2, MySql, Annotation, Pattern,
Relacionamento OneToOne, JsonBackReference, Configuração do
Application, JpaRepository, Controller, Rota, gravar
WWW.COTIINFORMATICA.COM.BR 262
Bibliotecas utilizadas no projeto:
Cliente.java
package br.com.coti.entity;
import java.io.Serializable;
WWW.COTIINFORMATICA.COM.BR 263
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import com.fasterxml.jackson.annotation.JsonManagedReference;
@Entity
@Table(name = "cliente")
public class Cliente implements Serializable {
@Column(name = "clienteid")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idCliente;
@Column
private Double valorPlano;
@Column(length = 60)
private String nomePlano;
@Column()
private Double taxaPlano;
public Cliente() {
WWW.COTIINFORMATICA.COM.BR 264
this.nome = nome;
this.valorPlano = valorPlano;
this.nomePlano = nomePlano;
this.taxaPlano = taxaPlano;
}
@Override
public String toString() {
return "Cliente [idCliente=" + idCliente + ", email="
+ email + ", nome=" + nome + ", valorPlano=" + valorPlano
+ ", nomePlano=" + nomePlano + ", taxaPlano=" + taxaPlano + "]";
}
WWW.COTIINFORMATICA.COM.BR 265
this.taxaPlano = taxaPlano;
}
Endereco.java
package br.com.coti.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import com.fasterxml.jackson.annotation.JsonBackReference;
@Entity
@Table(name = "endereco")
public class Endereco implements Serializable {
WWW.COTIINFORMATICA.COM.BR 266
@Column
private String latitude;
@Column
private String longitude;
@OneToOne
@JsonBackReference
@JoinColumn(name = "clienteidfk", referencedColumnName =
"clienteid")
private Cliente cliente;
WWW.COTIINFORMATICA.COM.BR 267
public String getLatitude() {
return latitude;
}
application.properties
ClienteRepository.java
package br.com.coti.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import br.com.coti.entity.Cliente;
WWW.COTIINFORMATICA.COM.BR 268
@Repository
public interface ClienteRepository extends JpaRepository<Cliente, Long> {
EnderecoRepository.java
package br.com.coti.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import br.com.coti.entity.Endereco;
@Repository
public interface EnderecoRepository extends JpaRepository<Endereco, Long>
{
ClienteRestController.java
package br.com.coti.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import br.com.coti.entity.Cliente;
import br.com.coti.repository.ClienteRepository;
@ResponseBody
@RestController
public class ClienteRestController {
@Autowired
ClienteRepository dao;
WWW.COTIINFORMATICA.COM.BR 269
Cliente resp = dao.save(cliente); // (cliente e
endereco)
if (resp == null) {
throw new Exception("Dados nao Gravados");
}
return ResponseEntity.status(200).body(resp); // certo|Objeto do
Cliente
} catch (Exception ex) {
Map<String, String> mapa = new HashMap<String,
String>();
mapa.put("erro", "error na Gravacao:" +
ex.getMessage());
return ResponseEntity.status(500).body(mapa);
}
}
}
Application.java
package br.com.coti.application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import
org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@EntityScan(basePackages = "br.com.coti.entity")
@EnableJpaRepositories(basePackages = "br.com.coti.repository")
@ComponentScan(basePackages = "br.com.coti.controller")
@SpringBootApplication
public class Application {
WWW.COTIINFORMATICA.COM.BR 270
Rodar o projeto
Clicar na classe application.java com o botão direito -> run as -> java
application
WWW.COTIINFORMATICA.COM.BR 271
Visualizando o banco MySql
Testar no Postam
Gravação. Selecionar POST -> Digitar a URL -> clicar em BODY ->
clicar em RAW -> Selecionar JSON -> digitar os dados para gravação
-> clicar em SEND
WWW.COTIINFORMATICA.COM.BR 272
Resultado:
Visualizando no banco:
WWW.COTIINFORMATICA.COM.BR 273
Java WebDeveloper Noite -
Aula 20 (Seg, Qua, Sex)
Tema da aula:
Projeto Maven Springboot, Mysql, Junit, Annotations, Pattern, JpaRepository,
Controller, Rotas, Listar, Buscar pelo id, Logar, Gravar
WWW.COTIINFORMATICA.COM.BR 274
Estrutura do projeto depois de finalizado
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.BUILD-SNAPSHOT</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>br.com.coti</groupId>
<artifactId>projetologin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>projetologin</name>
<description>projeto de login</description>
<properties>
<java.version>1.8</java.version>
</properties>
WWW.COTIINFORMATICA.COM.BR 275
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-
jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-
rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-
validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-
tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-
engine</artifactId>
</exclusion>
</exclusions>
WWW.COTIINFORMATICA.COM.BR 276
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-
plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
WWW.COTIINFORMATICA.COM.BR 277
Users.java
package br.com.coti.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
@Entity
@Table(name = "users")
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 50)
@NotBlank(message = "nao pode deixar o nome vazio")
@Pattern(regexp = "[a-z A-Z]{2,50}", message = "nome fora do
padrao")
private String nome;
@Column(length = 50, unique = true)
@Email(message = "o Login deve estar no padrao de email")
private String login;
@Column(length = 250)
@Size(min = 6, max = 15, message = "Faixa de 6 a 15")
private String password;
public Users() {
}
WWW.COTIINFORMATICA.COM.BR 278
@Override
public String toString() {
return "Users [id=" + id + ", nome=" + nome + ", login=" +
login
+ ", password=" + password + "]";
}
UserRepository.java
package br.com.coti.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import br.com.coti.entity.Users;
@Repository
public interface UsersRepository extends JpaRepository<Users, Long> {
WWW.COTIINFORMATICA.COM.BR 279
public Users findByLoginAndPassword(String login, String
password);
UserController.java
package br.com.coti.controller;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import br.com.coti.entity.Users;
import br.com.coti.repository.UsersRepository;
@RestController
@ResponseBody
@RequestMapping({ "/users" })
public class UsersController {
@Autowired
UsersRepository dao;
@GetMapping
public List<Users> findAll() {
return dao.findAll();
}
@GetMapping(path = { "/{id}" })
public ResponseEntity<Users> findById(@PathVariable Long id) {
return dao.findById(id).map(res ->
ResponseEntity.ok().body(res))
.orElse(ResponseEntity.notFound().build());
@PostMapping(path = "/{login}")
public ResponseEntity<?> findByLogin(@Valid @RequestBody Users
users) {
WWW.COTIINFORMATICA.COM.BR 280
try {
Users user =
dao.findByLoginAndPassword(users.getLogin(),
users.getPassword());
if (user == null) {
throw new IllegalArgumentException("nao
logado");
}
return ResponseEntity.ok().body(user);
} catch (Exception ex) {
return ResponseEntity.status(500).body("error:"
+ ex.getMessage());
}
}
@PostMapping(path = "/{gravar}")
public ResponseEntity<?> create(@Valid @RequestBody Users users) {
try {
Users user = dao.save(users);
if (user == null) {
throw new
IllegalArgumentException("usuario invalido");
}
return ResponseEntity.ok().body(user);
} catch (Exception ex) {
return ResponseEntity.status(500).body("error:"
+ ex.getMessage());
}
}
}
ProjetoLoginApplication.java
package br.com.coti;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProjetologinApplication {
WWW.COTIINFORMATICA.COM.BR 281
Java WebDeveloper Noite -
Aula 21 (Seg, Qua, Sex)
Tema da aula:
WWW.COTIINFORMATICA.COM.BR 282
Estrutura do projeto server Java depois de
finalizado
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
WWW.COTIINFORMATICA.COM.BR 283
<version>2.2.10.BUILD-SNAPSHOT</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>br.com.coti</groupId>
<artifactId>projetologin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>projetologin</name>
<description>projeto de login</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
WWW.COTIINFORMATICA.COM.BR 284
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
WWW.COTIINFORMATICA.COM.BR 285
Users.java
package br.com.coti.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
@Entity
@Table(name = "users")
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 50)
@NotBlank(message = "nao pode deixar o nome vazio")
@Pattern(regexp = "[a-z A-Z]{2,50}",
message = "nome fora do padrao")
private String nome;
@Column(length = 50, unique = true)
@Email(message = "o Login deve estar no padrao de email")
private String login;
@Column(length = 250)
@Size(min = 6, max = 15, message = "Faixa de 6 a 15")
private String password;
public Users() {
}
@Override
WWW.COTIINFORMATICA.COM.BR 286
public String toString() {
return "Users [id=" + id + ", nome=" + nome + ", login="
+ login + ", password=" + password + "]";
}
UserRepository.java
package br.com.coti.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import br.com.coti.entity.Users;
@Repository
public interface UsersRepository extends JpaRepository<Users, Long> {
WWW.COTIINFORMATICA.COM.BR 287
public Users findByLoginAndPassword(String login, String
password);
UserController.java
package br.com.coti.controller;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import br.com.coti.entity.Users;
import br.com.coti.repository.UsersRepository;
@RestController
@ResponseBody
@RequestMapping({ "/users" })
public class UsersController {
@Autowired
UsersRepository dao;
@GetMapping
public List<Users> findAll() {
return dao.findAll();
}
@GetMapping("/{id}")
public ResponseEntity<Users> findById(@PathVariable Long id) {
return dao.findById(id).map(res -> ResponseEntity.ok()
.body(res)).orElse(ResponseEntity.notFound().build());
@PostMapping("/login")
public ResponseEntity<?> findByLogin
(@Valid @RequestBody Users users) {
try {
Users user = dao.findByLoginAndPassword
(users.getLogin(), users.getPassword());
if (user == null) {
WWW.COTIINFORMATICA.COM.BR 288
throw new IllegalArgumentException("nao logado");
}
return ResponseEntity.ok().body(user);
} catch (Exception ex) {
return ResponseEntity.status(500).body
("error:" + ex.getMessage());
}
}
@PostMapping("/gravar")
public ResponseEntity<?> create(@Valid @RequestBody Users users) {
try {
Users user = dao.save(users);
if (user == null) {
throw new IllegalArgumentException("usuario invalido");
}
return ResponseEntity.ok().body(user);
} catch (Exception ex) {
return ResponseEntity.status(500).body
("error:" + ex.getMessage());
}
}
CorsFilter
package br.com.coti.controller;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
@Component
public class CorsFilter implements Filter {
public CorsFilter() {
WWW.COTIINFORMATICA.COM.BR 289
IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse) response;
resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Methods",
"POST, GET, PUT, OPTIONS, DELETE, PATCH");
resp.setHeader("Access-Control-Max-Age", "3600");
resp.setHeader("Access-Control-Allow-Headers", "Origin,
X-Requested-With, Content-Type, Accept");
resp.setHeader("Access-Control-Expose-Headers", "Location");
chain.doFilter(request, response);
}
ProjetoLoginApplication.java
package br.com.coti;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProjetologinApplication {
WWW.COTIINFORMATICA.COM.BR 290
Rodar o projeto
Clicar em ProjetoLoginApplication.java com o botão direito -> run as ->
java application
WWW.COTIINFORMATICA.COM.BR 291
Banco criado
Testar no Postman
Para gravar um usuario.
Selecionar POST -> Digitar a URL -> clicar em BODY -> clicar em RAW ->
Selecionar JSON -> Digitar os dados -> Clicar em SEND
Resultado: gravado
WWW.COTIINFORMATICA.COM.BR 292
Visualizando no banco
WWW.COTIINFORMATICA.COM.BR 293
readme.md
ng new projclientspring
y
css
cd projclientspring
code .
model
serviço
users.ts
export class Users {
id: number;
nome: string;
login: string;
password: string;
UsersService.ts
import { Users } from './../model/Users';
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable()
export class UsersService {
public findAll() {
WWW.COTIINFORMATICA.COM.BR 294
return this.http.get<Users[]>(`${URL}`);
}
app.module.ts
import { UsersService } from './service/Users.service';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule,
HttpClientModule
],
providers: [UsersService],
bootstrap: [AppComponent]
})
export class AppModule { }
app.component.ts
import { UsersService } from './service/Users.service';
import { Component, OnInit } from '@angular/core';
import { Users } from './model/Users';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
ngOnInit(): void {
this.listar();
}
WWW.COTIINFORMATICA.COM.BR 295
constructor(private service: UsersService) {
public listar() {
this.service.findAll().subscribe(res => {
this.usuarios = res;
})
}
}
app.component.html
Rodar o projeto
Digitar no terminal
ng s -o
Abrindo o browser
http://localhost:4200/
WWW.COTIINFORMATICA.COM.BR 296
Java WebDeveloper Noite -
Aula 22 (Seg, Qua, Sex)
Tema da aula:
Projeto server node, instalação json-server
Projeto angular, calculo
WWW.COTIINFORMATICA.COM.BR 297
https://www.npmjs.com/package/json-server
npm i json-server
readme.md
npm init
package.json (A partir)
posso instalar qualquer coisa
WWW.COTIINFORMATICA.COM.BR 298
package.json
{
"name": "serverangu",
"version": "1.0.0",
"description": "npm init package.json",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"json-server": "^0.16.1"
}
}
cliente.json
{
"cliente": [
{
"id": 1,
"nome": "kleber",
"login": "kleber@gmail.com",
"senha": "123456",
"plano": "planoum",
"valor": 300
},
{
"id": 2,
"nome": "carol",
"login": "carol@gmail.com",
"senha": "123456",
"plano": "planodois",
"valor": 400
},
{
"id": 3,
"nome": "lu",
"login": "lu@gmail.com",
"senha": "123456",
"plano": "planotres",
"valor": 500
}
]
}
WWW.COTIINFORMATICA.COM.BR 299
Iniciar o projeto com o json-server
Clicar no arquivo cliente.json com o botão direito -> arir no terminal.
Digitar no terminal:
json-server cliente.json
Servidor iniciado
WWW.COTIINFORMATICA.COM.BR 300
Clicar no link gerado para abrir no browser.
http://localhost:3000/cliente
WWW.COTIINFORMATICA.COM.BR 301
Para criar o projeto, digitar no terminal:
ng new nome_do_projeto
cliente.ts
export class Cliente {
id: number;
nome: string;
login: string;
senha: string;
plano: string;
valor: number;
public getDados() {
return this.id + "," + this.nome + "," + this.login
+ this.senha + "," + this.plano + "," + this.valor;
}
}
cliente.service.ts
import { Injectable } from '@angular/core';
WWW.COTIINFORMATICA.COM.BR 302
@Injectable()
export class ClienteService{
constructor(){
}
WWW.COTIINFORMATICA.COM.BR 303
Java WebDeveloper Noite -
Aula 23 (Seg, Qua, Sex)
Tema da aula:
Projeto Jboss, Annotations, Habilitar Jboss, Jpa, Administrador Jboss
WWW.COTIINFORMATICA.COM.BR 304
JBoss Application Server
WWW.COTIINFORMATICA.COM.BR 305
recursos e serviços iniciados on-demand. Tudo isso é possível graças à nova
arquitetura baseada em um kernel ainda mais modular, composto por JBoss
Modules e o JBoss Modular Service Container (MSC).
Desde que a Red Hat adquiriu o JBoss em 2006, houve um grande avanço
em relação a plataformas e projetos existentes na comunidade. O número
de plataformas saltou de apenas uma, que representava o próprio
application server, para oito, incluindo soluções para SOA, Portais, Regras e
Cloud. Já o número de projetos cresceu de aproximadamente 20 para mais
de 140 disponíveis na JBoss Community (www.jboss.org).
WWW.COTIINFORMATICA.COM.BR 306
Vantagens:
Uma inicialização rápida e o baixo consumo de memória abrem diversas
possibilidades, como executar o container Java EE em um teste unitário.
Outra possibilidade seria utilizar apenas uma JVM com o Application Server
por aplicação, tornando a manutenção de aplicações independente. Desta
forma, caso seja necessário parar o servidor, teríamos impacto apenas em
uma aplicação.
Estrutura de diretórios
A distribuição do AS 7 está organizada em uma estrutura de diretórios bem
diferente das versões anteriores. A Figura 6mostra como essa nova estrutura
é composta. Veja a seguir mais detalhes sobre cada um dos diretórios:
WWW.COTIINFORMATICA.COM.BR 307
• licenses: contém as licenças de todas as tecnologias que compõem o
servidor de aplicação;
• schema: contém os arquivos XML Schema que definem os diversos
descritores utilizados na configuração do servidor. Bastante útil ta nto para
referência como para uso em uma IDE.
• domain: contém os arquivos de configuração, bem como toda a estrutura
necessária para execução do servidor em modo Domain. O diretório domain
é composto por vários subdiretórios. O primeiro deles é o configuration, que
armazena os descritores domain.xml e host.xml – veremos detalhes dessa
configuração mais adiante, quando falarmos sobre domínios. Após a
primeira inicialização temos o diretório content, que armazena os
deployments realizados no domínio. O diretório log armazena os logs dos
processos que compõem o domínio(process-controller e host-controller) –
também veremos detalhes sobre estes processos em breve. O diretório
servers hospeda a estrutura individual de cada instância do servidor (server
nodes) configurada no host para fazer parte do domínio. Cada server node
possui seu próprio log (diretório log), bem como seus próprios arquivos de
dados (diretório data) e temporários (diretório tmp). Por último, temos o
subdiretório tmp, que armazena alguns artefatos temporários gerados em
tempo de execução pelos processos do domínio. Como veremos mais
adiante, o modo Domain é uma das grandes novidades no AS 7;
• modules: contém todos os módulos e extensões que compõem o núcleo
do AS 7, bem como os serviços fornecidos pelo servidor de aplicação. Como
veremos mais adiante, o AS 7 é composto por diversos módulos;
• standalone: contém os arquivos de configuração necessários para
executar o servidor em modo isolado. Esse diretório é semelhante aos
profiles (all, default e minimal) encontrados em versões anteriores do JBoss
AS. O diretório standalone também é composto por vários subdiretórios. O
primeiro deles é o configuration, que armazena o descritor standalone.xml
que define o conjunto de subsistemas (profile) a ser inicializado pela
instância do servidor em modo standalone. O diretório deployments
armazena os pacotes (WAR, EAR, JAR, SAR) implantados no servidor. O
diretório lib é usado para armazenar bibliotecas e extensões do servidor de
aplicação. Por fim, após a primeira inicialização, são criados os diretórios
data, log e tmp, que armazenam, respectivamente, arquivos de dados, log
de saída e arquivos temporários gerados em tempo de execução;
• welcome-content: contém a página de boas-vindas do AS 7. É o contexto
raiz (http://localhost:8080/) do container web do servidor.
WWW.COTIINFORMATICA.COM.BR 308
Modos de Operação
AS 7 possui dois modos de operação: Standalone e Domain. O que os
diferencia basicamente é a execução e o gerenciamento. Como o próprio
nome diz, Standalone significa uma única instância de execução. Já o modo
Domain permite a execução distribuída e o gerenciamento centralizado de
múltiplas instâncias.
Estes dois modos não existiam nas versões anteriores do JBoss AS, portanto,
havia apenas uma única forma de iniciar uma nova instância do servidor,
que se parecia muito com o modo Standalone do AS 7. Esta instância era
baseada em um profile, que nada mais é do que um conjunto de recursos e
serviços fornecidos pelo Servidor de Aplicação devidamente configurado e
pronto para uso. Um profile define as características, bem como as
capacidades oferecidas por uma instância de execução do servidor.
Como exemplo podemos citar um profile especializado na camada web, que
oferece a configuração necessária para o deployment e execução de
aplicações utilizando JSP, Servlet, JSF, CDI, JPA, etc. Outro exemplo seria um
profile que traz todo o arsenal necessário para desenvolver qualquer
aplicação Java EE, como suporte a objetos distribuídos, EJB, Remoting, JNDI,
Mensageria, entre outras coisas que fazem parte desta especificação.
Modo Standalone
O modo Standalone é muito semelhante aos profiles default, all e minimal
das versões anteriores. Ao utilizá-lo será iniciada apenas uma instância de
AS 7 por script de inicialização (no caso, standalone.sh). Este modo pode
pertencer a ambientes que necessitam de apenas uma instância do JBoss AS
7, ou em aplicações que não requeiram gerenciamento unificado.
WWW.COTIINFORMATICA.COM.BR 309
Diferente do esquema de configuração distribuída em vários arquivos,
encontrado nas versões anteriores, standalone.xml (veja a Listagem 4)
contém toda a configuração necessária para a inicialização do servidor:
módulos, subsistemas, interfaces de gerenciamento, segurança, data
sources, socket bindings, etc. Assim, quando quiser fazer qualquer tipo de
alteração, basta olhar apenas este arquivo.
Modo Domain
Esta é sem dúvida umas das principais novidades do AS 7. A possibilidade
de iniciar várias instâncias, bem como gerenciá-las de forma centralizada em
um ponto único, traz benefícios notáveis para o administrador do
Application Server.
WWW.COTIINFORMATICA.COM.BR 310
• Domain controller: é o ponto central de controle e mantém toda a
política de gerenciamento do domínio. Ele hospeda a configuração do AS e
a compartilha com todas as outras instâncias que fazem parte do mesmo
domínio;
• Host controller: é responsável por coordenar, juntamente com o Domain
Controller, todo o ciclo de vida (start/stop) das instâncias que fazem parte
do domínio, além de executar o trabalho de distribuir os deploys em todas
elas;
• Process controller: é responsável por criar as instâncias do servidor,
inclusive a instância do host controller. É sua função também gerenciar os
fluxos de entrada e saída das instâncias do servidor. O fato deste processo
estar em uma JVM isolada permite que o host controller seja atualizado e,
até mesmo, reiniciado sem impactar nas demais instâncias do domínio;
• Server nodes: são as instâncias propriamente ditas, onde as aplicações e
serviços são implantadas. Cada server node terá seu próprio processo Java
no sistema operacional.
WWW.COTIINFORMATICA.COM.BR 311
quanto o Domain Controller executam em um mesmo processo Java.
Cliente.java
package entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "cliente")
public class Cliente implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer idCliente;
@Column(length = 50)
private String nome;
@Column(length = 50, unique = true)
private String email;
public Cliente() {
WWW.COTIINFORMATICA.COM.BR 312
public Cliente(Integer idCliente, String nome, String email) {
super();
this.idCliente = idCliente;
this.nome = nome;
this.email = email;
}
@Override
public String toString() {
return "Cliente [idCliente=" + idCliente + ", nome="
+ nome + ", email=" + email + "]";
}
WWW.COTIINFORMATICA.COM.BR 313
Para colocar o Servidor JBOSS no worspace
WWW.COTIINFORMATICA.COM.BR 314
Clicar em SERVER -> Clicar em RUNTIME ENVIRONMENTS -> clicar
no botão ADD
WWW.COTIINFORMATICA.COM.BR 315
Clicar em BROWSER -> selecionar o diretório onde se encontram
os arquivos do JBOSS
WWW.COTIINFORMATICA.COM.BR 316
Em RUNTIME JRE, selecionar o JAVASE1.8 -> Clicar em FINISH
WWW.COTIINFORMATICA.COM.BR 317
Para habilitar o JSF e JPA
Clicar em Project Facest -> Marcar JAVA SERVER FACES -> Clicar
em Futher Configuration
WWW.COTIINFORMATICA.COM.BR 318
Em TYPE, selecionar DISABLE LIBRARY CONFIGURATIONA.
Em URL MAPPING PATTERNS -> clicar em /FACES/* -> clicar em REMOVE
WWW.COTIINFORMATICA.COM.BR 319
Clicar em OK
Clicar em APPLY
WWW.COTIINFORMATICA.COM.BR 320
Clicar em JPA -> clicar em FUTHER CONFIGURATION
WWW.COTIINFORMATICA.COM.BR 321
Clicar em APPLY AND CLOSE
WWW.COTIINFORMATICA.COM.BR 322
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="javauppull">
<jta-data-source>java:/javaup</jta-data-source>
<class>entity.Cliente</class>
<properties>
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="show_sql"
value="true" />
<property name="format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
SessionBeanCliente.java
package session;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
@Stateless
@LocalBean
public class SessionBeanCliente {
EntityManager manager;
public SessionBeanCliente() {
WWW.COTIINFORMATICA.COM.BR 323
Para adicionar o servidor para rodar
WWW.COTIINFORMATICA.COM.BR 324
Selecionar RED HAT JBOSS MIDDLEWARE -> Clicar na versão 6.1 ->
clicar em NEXT
Clicar em NEXT
WWW.COTIINFORMATICA.COM.BR 325
Clicar em FINISH
WWW.COTIINFORMATICA.COM.BR 326
Aguardar iniciar. Servidor inciado
WWW.COTIINFORMATICA.COM.BR 327
Senha: coti@110
Na pagina principal
WWW.COTIINFORMATICA.COM.BR 328
Clicar na aba DEPLOYMENTS
WWW.COTIINFORMATICA.COM.BR 329
Escolher o driver do mysql 5.1.6
Clicar em NEXT
WWW.COTIINFORMATICA.COM.BR 330
Clicar em ENABLE
WWW.COTIINFORMATICA.COM.BR 331
Adicionar a conexão com o banco do projeto. Clicar em ADD
WWW.COTIINFORMATICA.COM.BR 332
Clicar no conector do MYSQL -> Clicar em NEXT
WWW.COTIINFORMATICA.COM.BR 333
Conexão ok
Clicar em DONE
WWW.COTIINFORMATICA.COM.BR 334
Clicar em ENABLE para habilitar a conexão
Clicar em CONFIRM
WWW.COTIINFORMATICA.COM.BR 335
Conexão habilitada
WWW.COTIINFORMATICA.COM.BR 336
Java WebDeveloper Noite -
Aula 24 (Seg, Qua, Sex)
Tema da aula:
Projeto Jboss, Annotations, Habilitar Jboss, Jpa, Persistence.xml, session,
Administrador Jboss
WWW.COTIINFORMATICA.COM.BR 337
Para colocar o Servidor JBOSS no worspace
WWW.COTIINFORMATICA.COM.BR 338
Clicar em SERVER -> Clicar em RUNTIME ENVIRONMENTS -> clicar
no botão ADD
WWW.COTIINFORMATICA.COM.BR 339
Clicar em BROWSER -> selecionar o diretório onde se encontram
os arquivos do JBOSS
WWW.COTIINFORMATICA.COM.BR 340
Em RUNTIME JRE, selecionar o JAVASE1.8 -> Clicar em FINISH
WWW.COTIINFORMATICA.COM.BR 341
User.java
package entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(length = 50, unique = true)
private String login;
@Column
private String password;
public User() {
@Override
public String toString() {
return "User [id=" + id + ", login=" + login
+ ", password=" + password + "]";
}
WWW.COTIINFORMATICA.COM.BR 342
this.login = login;
}
WWW.COTIINFORMATICA.COM.BR 343
Clicar em Project Facest -> Marcar JAVA SERVER FACES -> Clicar
em Futher Configuration
WWW.COTIINFORMATICA.COM.BR 344
Clicar em ADD -> Digitar a URL: *.jsf -> clicar em OK
Clicar em OK
WWW.COTIINFORMATICA.COM.BR 345
Clicar em APPLY
WWW.COTIINFORMATICA.COM.BR 346
Em TYPE, selecionar DISABLE LIBRARY CONIGURATION -> clicar em
OK
WWW.COTIINFORMATICA.COM.BR 347
Será gerado o diretório META-INF e será gerado o arquivo
persistence.xml
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="unidadejavapool">
<jta-data-source>java:/unidadejava</jta-data-source>
<class>entity.User</class>
<properties>
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="show_sql" value="true" />
<property name="format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
WWW.COTIINFORMATICA.COM.BR 348
ManagerUser.java
package manager;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import entity.User;
@ManagedBean(name = "mb")
@RequestScoped
public class ManagerUser implements Serializable {
SessionBeanUser.java
package session;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import entity.User;
@Stateless
@LocalBean
public class SessionBeanUser {
@PersistenceContext(name = "unidadejavapool")
EntityManager em;
Query queryUm;
TypedQuery<User> query;
public SessionBeanUser() {
}
WWW.COTIINFORMATICA.COM.BR 349
public void create(User user) {
em.persist(user);
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>projetoJbossServer</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
WWW.COTIINFORMATICA.COM.BR 350
Para adicionar o servidor para rodar
WWW.COTIINFORMATICA.COM.BR 351
Selecionar RED HAT JBOSS MIDDLEWARE -> Clicar na versão 6.1 ->
clicar em NEXT
Clicar em NEXT
WWW.COTIINFORMATICA.COM.BR 352
Clicar em FINISH
WWW.COTIINFORMATICA.COM.BR 353
Aguardar iniciar. Servidor inciado
WWW.COTIINFORMATICA.COM.BR 354
Senha: coti@110
Na pagina principal
WWW.COTIINFORMATICA.COM.BR 355
Clicar na aba DEPLOYMENTS
WWW.COTIINFORMATICA.COM.BR 356
Escolher o driver do mysql 5.1.6
Clicar em NEXT
WWW.COTIINFORMATICA.COM.BR 357
Clicar em ENABLE
WWW.COTIINFORMATICA.COM.BR 358
Adicionar a conexão com o banco do projeto. Clicar em ADD
WWW.COTIINFORMATICA.COM.BR 359
Clicar em NEXT
WWW.COTIINFORMATICA.COM.BR 360
Digitar as informações -> Conection
URL: jdbc:mysql://localhost:3306/banconoite?createDatabaseIfNotExist=true
-> Username: root -> Password: coti-> clicar em TEST CONECTION
Conexão ok
WWW.COTIINFORMATICA.COM.BR 361
Clicar em DONE
WWW.COTIINFORMATICA.COM.BR 362
Clicar em CONFIRM
Conexão habilitada
WWW.COTIINFORMATICA.COM.BR 363
Java WebDeveloper Noite -
Aula 25 (Seg, Qua, Sex)
Tema da aula:
Projeto JSF, Primefaces5.0, calculo, Relacionamento OneToMany, lista, Panel,
Panelgrid, Messages, Datalist
JavaServer Faces
WWW.COTIINFORMATICA.COM.BR 364
Foi formalizada como um padrão através do Java Community Process e faz
parte da Java Platform, Enterprise Edition. JSF 2 utiliza Facelets como seu
sistema de template padrão. Outras tecnologias da camada de visão, como
XUL também podem ser empregadas. Em contraste, JSF 1.x utiliza JavaServer
Pages (JSP) como seu sistema de template padrão.
Histórico
O JavaServer Faces ganhou expressão na versão 1.1 quando implementado
pela comunidade utilizando a especificação 127 do Java Community Process,
evidenciando maturidade e segurança. Hoje ele está na versão 2.0 da
especificação 252 do JCP. A fundação Apache vem realizando esforços na
implementação da especificação através do projeto MyFaces. O
reconhecimento do trabalho é visto por diversas empresas, tanto é que a
Oracle doou os fontes do ADF Faces, conjunto de mais de 100 componentes
JSF, para o projeto MyFaces que o denominará de Trinidad. O JSF é
atualmente considerado pela comunidade Java como a última palavra em
termos de desenvolvimento de aplicações Web utilizando Java, resultado da
experiência e maturidade adquiridas com o JSP/Servlet (Model1), Model2
(MVC) e Struts.
Como trabalha
WWW.COTIINFORMATICA.COM.BR 365
restaurado na próxima criação desta visão. Objetos e estados podem ser
salvos ou no cliente ou no servidor.
Características
WWW.COTIINFORMATICA.COM.BR 366
Utiliza Ajax em alguns de seus componentes tornando alguns
processos mais rápidos e eficientes.
Ciclo de vida
WWW.COTIINFORMATICA.COM.BR 367
durante a conversão ou validação, o ciclo de vida escapa diretamente para a
fase de “apresentação da resposta”.
4. Atualização de valores de modelo - durante esta fase, o valor do
componente é passado para o modelo através da atualização das
propriedades dos backing beans.
5. Invocação da aplicação - a manipulação de evento para cada ação e
ouvidor de ação é executada começando com o(s) ouvidor(es) de ação e
então a chamada do método de ação.
Recursos visuais
O framework JSF permite a inserção, via IDE, de:
JSF inclui
Suporte a internacionalização e acessibilidade;
Um conjunto padrão de componentes de interface de usuário que
possibilitam validação padronizada;
Duas bibliotecas de etiqueta (“tag libraries”) especiais do JavaServer Pages
(JSP) para expressar a interface do JavaServer Faces dentro de uma página
JSP;
Um modelo de eventos do lado servidor (“server-side event model”);
Gerência de estados;
Managed Beans;
Linguagem de Expressão Unificada (“Unified Expression Language”) para JSP
2.0 e JSF 1.2.
WWW.COTIINFORMATICA.COM.BR 368
PrimeFaces
Showcase do PrimeFaces
https://www.primefaces.org/showcase/
Temas
https://www.primefaces.org/themes/
WWW.COTIINFORMATICA.COM.BR 369
Para habilitar o JSF no projeto:
Clicar no projeto com o botão direito.
Clicar em “project facets” -> marcar “java server faces” -> clicar no link
“futher configuration”
WWW.COTIINFORMATICA.COM.BR 370
Clicar em type e selecionar “disable library”
WWW.COTIINFORMATICA.COM.BR 371
Clicar em “add”
WWW.COTIINFORMATICA.COM.BR 372
Clicar em “ok”
WWW.COTIINFORMATICA.COM.BR 373
Prof Edson Belém - profedsonbelem@gmail.com Sexta, Ago 14, 2020
WWW.COTIINFORMATICA.COM.BR 374
Aluno.java
package entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
// OneToOne
private List<Disciplina> disciplinas;
public Aluno() {
}
@Override
public String toString() {
return "Aluno [idCliente=" + idCliente + ", nome="
+ nome + ", email=" + email + ", soma=" + soma + "]";
}
WWW.COTIINFORMATICA.COM.BR 375
public void setEmail(String email) {
this.email = email;
}
// substituir ...
public void setDisciplinas(List<Disciplina> disciplinas) {
this.disciplinas = disciplinas;
}
lista.add(d1);
lista.add(d2);
lista.add(d3);
WWW.COTIINFORMATICA.COM.BR 376
a.adicionar(d1);
a.adicionar(d2);
a.adicionar(d3);
System.out.println(a);
System.out.println(lista);
} catch (Exception ex) {
}
}
}
Resultado no console
Disciplina.java
package entity;
public Disciplina() {
}
// Agregacao ....
public Disciplina(Integer idDisciplina, String disciplina,
Double nota1, Double nota2, Aluno aluno) {
super();
this.idDisciplina = idDisciplina;
this.disciplina = disciplina;
this.nota1 = nota1;
this.nota2 = nota2;
this.aluno = aluno;
}
WWW.COTIINFORMATICA.COM.BR 377
@Override
public String toString() {
return "Disciplina [idDisciplina=" + idDisciplina
+ ", disciplina=" + disciplina + ", nota1=" + nota1
+ ", nota2=" + nota2 + ", media=" + media + ", aluno="
+ aluno + "]";
}
WWW.COTIINFORMATICA.COM.BR 378
this.media = (this.getNota1() + this.getNota2()) / 2;
}
}
Habilitar o JSF
Clicar no projeto com o botão direito -> properties.
Clicar Project Facets -> Marcar Java Server faces -> Apply and close
WWW.COTIINFORMATICA.COM.BR 379
ManagerBean.java
package manager;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import entity.Aluno;
import entity.Disciplina;
@ManagedBean(name = "mb")
@RequestScoped
public class ManagerBean {
@PostConstruct
public void init() {
this.aluno = new Aluno();
this.alunos = new ArrayList<Aluno>();
this.disciplinas = new ArrayList<Disciplina>();
this.disciplinas.add(new Disciplina());
this.disciplinas.add(new Disciplina());
}
WWW.COTIINFORMATICA.COM.BR 380
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>projetoJSFsemjboss</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
sistema.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<p:panel header="Relacionamento Aluno Disciplina">
<h:form id="form1">
<p:panelGrid columns="2">
<h:outputText value="Nome Aluno"></h:outputText>
<p:inputText value="#{mb.aluno.nome}"></p:inputText>
<h:outputText value="Email"></h:outputText>
<p:inputText value="#{mb.aluno.email}"></p:inputText>
WWW.COTIINFORMATICA.COM.BR 381
</p:inputText>
<h:outputText value="Nota1"></h:outputText>
<p:inputText value="#{mb.disciplinas[0].nota1}">
</p:inputText>
<h:outputText value="Nota2"></h:outputText>
<p:inputText
value="#{mb.disciplinas[0].nota2}"></p:inputText>
<h:outputText value="Nota1"></h:outputText>
<p:inputText
value="#{mb.disciplinas[1].nota1}"></p:inputText>
<h:outputText value="Nota2"></h:outputText>
<p:inputText
value="#{mb.disciplinas[1].nota2}"></p:inputText>
<p:messages></p:messages>
</p:panelGrid>
</h:form>
</p:panel>
WWW.COTIINFORMATICA.COM.BR 382
Rodar o projeto
Clicar na pagina sistema.xhtml com o botão direito -> run as -> run on
server
WWW.COTIINFORMATICA.COM.BR 383
http://localhost:8080/projetoJSFsemjboss/sistema.jsf
WWW.COTIINFORMATICA.COM.BR 384
Java WebDeveloper Noite -
Aula 26 (Seg, Qua, Sex)
Tema da aula:
Continuação - Projeto JSF, Primefaces5.0, calculo, Relacionamento
OneToMany, lista, Panel, Panelgrid, Messages, Datalist
WWW.COTIINFORMATICA.COM.BR 385
Bibliotecas utilizadas no projeto:
Aluno.java
package entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
// OneToOne
private List<Disciplina> disciplinas;
public Aluno() {
}
WWW.COTIINFORMATICA.COM.BR 386
@Override
public String toString() {
return "Aluno [idCliente=" + idCliente + ", nome="
+ nome + ", email=" + email + ", soma=" + soma + "]";
}
// substituir ...
public void setDisciplinas(List<Disciplina> disciplinas) {
this.disciplinas = disciplinas;
}
WWW.COTIINFORMATICA.COM.BR 387
return soma;
}
lista.add(d1);
lista.add(d2);
lista.add(d3);
a.adicionar(d1);
a.adicionar(d2);
a.adicionar(d3);
System.out.println(a);
System.out.println(lista);
} catch (Exception ex) {
}
}
}
Resultado no console
Disciplina.java
package entity;
WWW.COTIINFORMATICA.COM.BR 388
private Aluno aluno;
public Disciplina() {
}
// Agregacao ....
public Disciplina(Integer idDisciplina, String disciplina,
Double nota1, Double nota2, Aluno aluno) {
super();
this.idDisciplina = idDisciplina;
this.disciplina = disciplina;
this.nota1 = nota1;
this.nota2 = nota2;
this.aluno = aluno;
}
@Override
public String toString() {
return "Disciplina [idDisciplina=" + idDisciplina
+ ", disciplina=" + disciplina + ", nota1=" + nota1
+ ", nota2=" + nota2 + ", media=" + media + ", aluno="
+ aluno + "]";
}
WWW.COTIINFORMATICA.COM.BR 389
public Double getNota2() {
return nota2;
}
Habilitar o JSF
Clicar no projeto com o botão direito -> properties.
WWW.COTIINFORMATICA.COM.BR 390
Clicar Project Facets -> Marcar Java Server faces -> Apply and close
ManagerBean.java
package manager;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import entity.Aluno;
import entity.Disciplina;
@ManagedBean(name = "mb")
@RequestScoped
public class ManagerBean implements Serializable {
WWW.COTIINFORMATICA.COM.BR 391
}
@PostConstruct
public void init() {
Disciplina d1 = new Disciplina(100, "java", 9., 8.);
Disciplina d2 = new Disciplina(150, "oracle", 8., 10.);
Disciplina d3 = new Disciplina(200, "angular", 9., 8.);
Disciplina d4 = new Disciplina(300, "oracle", 9., 10.);
alunos.add(new Aluno(10, "lu", "lu@gmail.com"));
alunos.add(new Aluno(11, "gabriel", "gabriel@gmail.com"));
alunos.get(0).adicionar(d1);
alunos.get(0).adicionar(d2);
alunos.get(1).adicionar(d3);
alunos.get(1).adicionar(d4);
this.aluno = new Aluno(); // nao (REGISTRO)
this.disciplinas = new ArrayList<Disciplina>();
this.disciplinas.add(new Disciplina());
this.disciplinas.add(new Disciplina());
this.load();
}
WWW.COTIINFORMATICA.COM.BR 392
ManagerBean.carga = carga;
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>projetoJSFsemjboss</display-name>
<servlet>
WWW.COTIINFORMATICA.COM.BR 393
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
sistema.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<p:panel header="Relacionamento Aluno Disciplina">
<h:form id="form1">
<p:panelGrid columns="2">
<h:outputText value="Nome Aluno"></h:outputText>
<p:inputText value="#{mb.aluno.nome}"></p:inputText>
<h:outputText value="Email"></h:outputText>
<p:inputText value="#{mb.aluno.email}"></p:inputText>
<h:outputText value="Nota1"></h:outputText>
<p:inputText value="#{mb.disciplinas[0].nota1}">
</p:inputText>
<h:outputText value="Nota2"></h:outputText>
<p:inputText
value="#{mb.disciplinas[0].nota2}"></p:inputText>
<h:outputText value="Nota1"></h:outputText>
<p:inputText
value="#{mb.disciplinas[1].nota1}"></p:inputText>
WWW.COTIINFORMATICA.COM.BR 394
<h:outputText value="Nota2"></h:outputText>
<p:inputText
value="#{mb.disciplinas[1].nota2}"></p:inputText>
<p:messages></p:messages>
</p:panelGrid>
</h:form>
</p:panel>
Rodar o projeto
Clicar na pagina sistema.xhtml com o botão direito -> run as -> run on
server
WWW.COTIINFORMATICA.COM.BR 395
Selecionar o Tomcat -> FINISH
WWW.COTIINFORMATICA.COM.BR 396
Preencher os dados para gravar
WWW.COTIINFORMATICA.COM.BR 397
Java WebDeveloper Noite -
Aula 27 (Seg, Qua, Sex)
Tema da aula:
O que é Ionic?
É um framework para desenvolvimento de aplicações mobile hibridas, criado
em 2013 Desenvolvido por Max Lynch, Ben Sperry e Adam Bradley da Drifty
Co e com um grande suporte da comunidade.
É possível criar aplicações com o look and feel de uma aplicação nativa, mas
ter apenas uma base de código, e no final, gerar instaladores para iOS,
Android e Windows, mas nem contamos o windows pois já está em declínio.
Um APP escrito com IONIC, utiliza, JavaScript, HTML, CSS(SASS) e Angular
(TypeScript).
Recursos nativos?
São aqueles fornecidos pelo hardware do seu dispositivo móvel, digamos
que pelo seu aplicativo seja necessário utilizar a camera, para ler um QR
code, ou usar geolocalização, estes dois exemplos são recursos nativos, e
WWW.COTIINFORMATICA.COM.BR 398
para você fazer uso deles, é necessário instalar um plugin que no
ecosistema IONIC chamamos de IONIC NATIVE.
Ionic Icons
Mais de 700 icones para sua aplicação, já se preocupando com as dierenças
entre sistemas operacionais.
Platform Continuity
É um conceito, que quer dizer que, se você desenvolve sua aplicação para
uma plataforma, os componentes disponíveis pelo IONIC se adaptam e
mudam a aparência de acordo com o sistema operacional do dispositivo.
Observe a imagem abaixo, demonstrando o mesmo app aberto nos três
sistemas operacionais suportados.
Ionic view
É uma solução para testar sua aplicação entre diversos dispositivos. Você
envia a aplicação para a nuvem do IONIC, faz o download do aplicativo
chamado IONIC VIEW, e apartir dele baixa o seu aplicativo em
desenvolvimento.
O IONIC VIEW não está sendo descontinuado, ele foi divido em dois
projetos, um focado em testes rápidos entre dispositivos, chamado IONIC
WWW.COTIINFORMATICA.COM.BR 399
DEVAPP e outro projeto chamado IONIC VIEW focado em
compartilhamento e teste da aplicação entre pessoas e dispositivos pelo
mundo todo.
Cuidado com o IONIC VIEW, apesar de ser possível testar sua aplicação
nele, há limitações. Quando você utiliza recursos nativos, muitos dos plugins
podem não funcionar, verifique a lista de plugins compatíveis.
Ionic Devapp
É uma nova solução para testar suas aplicações entre dispositivos, que NÃO
vem substituir o IONIC VIEW, que funciona apenas na rede interna onde
está rodando o comando ‘ionic serve’, veja o gif abaixo demonstrando o
funcionamento.
As of August, 2017, the Ionic View app has “split” into two apps: Ionic
DevApp focused on rapid local development and testing, and the new Ionic
View focused on helping developers share and test their apps with external
users, co-workers, clients, and more
No Angular temos a API de rotas, que apesar de estar disponível para uso
no IONIC, não é usado, no IONIC utilizamos o conceito de pilha, onde você
empilha e desempilha telas.
Nem todos componentes escritos para funcionar com Angular vão funcionar
bem no IONIC, por exemplo, existe um para fazer scrolldown infinito, que
funciona bem no Angular, no IONIC não. É por isto que sempre que precisar
de algo, primeiro olhe no site oficial se já existe algo pronto, se tiver utilize -
o, neste exemplo, temos um componente para fazer scolldown infinito.
Em uma aplicação com web escrita com Angular, rapidamente você poderá
decidir utilizar o Bootstrap, em uma aplicação escrita com IONIC, você não
deve tomar esta decisão sem antes conhecer a alternativa de ‘responsive
grid’.
WWW.COTIINFORMATICA.COM.BR 400
Ciclo de vida
Além do ciclo de vida dos componentes Angular, você também conta com
os do próprio IONIC que te ajudará a controlar sua aplicação. Dá uma
olhada na tabela a baixo que resume o ciclo de vida do IONIC.
Vantagens
Além da principal vantagem no desenvolvimento de aplicações híbridas,
muitas outras vantagens podem ser listadas quando pensamos no Ionic,
dentre elas:
WWW.COTIINFORMATICA.COM.BR 401
Menor tempo de desenvolvimento: Por criar aplicações
multiplataforma, o tempo no desenvolvimento dessa aplicação se
torna algo vantajoso em relação às aplicações nativas, uma vez que
todo código criado será reutilizado para qualquer sistema operacional
móvel, diminuindo assim o tempo de desenvolvimento;
Menor custo: Uma vez que poupamos o tempo em seu
desenvolvimento, estamos poupando os custos desta aplicação,
fazendo com que, criar aplicações multiplataforma torne-se algo mais
rentável e menos custoso;
Prototipação: Criar telas no Ionic é extremamente fácil, pois possui
uma ferramenta para esta finalidade, o Ionic Creator, que é uma
ferramenta de “arrasta e solta” para facilitar as ideias de criação de
suas aplicações que pode ser acessada neste link;
Documentação: Além de possuir uma grande comunidade, a
documentação do Ionic é bastante completa, entre outras.
Componentes:
Grid
Ion-Grid fornece um layout personalizado do flexbox. Ele possui
principalmente três componentes: grade, linhas e colunas.
WWW.COTIINFORMATICA.COM.BR 402
As colunas são colocadas horizontalmente em uma linha que pode caber
automaticamente, redimensionando sua largura de acordo com o espaço
disponível nessa linha.
Por padrão, 12 colunas podem ser adicionadas em uma linha, mas podem
ser personalizadas, o que veremos em outros exemplos.
Row
O componente de linha de íons é usado para criar uma única linha no layout
da grade. Linhas são a estrutura horizontal com vários números de colunas
para preencher a largura total da linha.
Comando Descrição
Quebra de coluna:
Comando Descrição
WWW.COTIINFORMATICA.COM.BR 403
Alinhamento vertical de colunas
Comando Descrição
Comando Descrição
WWW.COTIINFORMATICA.COM.BR 404
Comando Descrição
IonCol
O ion-col componente cria uma célula / coluna na linha. As colunas são
adicionadas dentro de uma linha. Eles ocupam todo o espaço disponível da
linha, dividido por colunas adicionadas na linha.
Comando Descrição
WWW.COTIINFORMATICA.COM.BR 405
Comando Descrição
Alguns Comandos
https://ionicframework.com/docs/v3/cli/
https://github.com/orgs/ionic-team/projects
WWW.COTIINFORMATICA.COM.BR 406
Comando Descrição
ionic start
Criar projeto com menu lateral
nome_do_projeto sidemenu
ionic start
Criar projeto real
nome_do_projeto conference
WWW.COTIINFORMATICA.COM.BR 407
Estrutura do projeto server Java depois de
finalizado
WWW.COTIINFORMATICA.COM.BR 408
Aluno.java
package entity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
// OneToOne
private List<Disciplina> disciplinas;
public Aluno() {
}
@Override
public String toString() {
return "Aluno [idCliente=" + idCliente + ", nome="
+ nome + ", email=" + email + ", soma=" + soma + "]";
}
WWW.COTIINFORMATICA.COM.BR 409
public void setEmail(String email) {
this.email = email;
}
// substituir ...
public void setDisciplinas(List<Disciplina> disciplinas) {
this.disciplinas = disciplinas;
}
lista.add(d1);
lista.add(d2);
lista.add(d3);
WWW.COTIINFORMATICA.COM.BR 410
a.adicionar(d1);
a.adicionar(d2);
a.adicionar(d3);
System.out.println(a);
System.out.println(lista);
} catch (Exception ex) {
}
}
}
Resultado no console
Disciplina.java
package entity;
public Disciplina() {
}
// Agregacao ....
public Disciplina(Integer idDisciplina, String disciplina,
Double nota1, Double nota2, Aluno aluno) {
super();
this.idDisciplina = idDisciplina;
this.disciplina = disciplina;
this.nota1 = nota1;
this.nota2 = nota2;
this.aluno = aluno;
}
WWW.COTIINFORMATICA.COM.BR 411
@Override
public String toString() {
return "Disciplina [idDisciplina=" + idDisciplina
+ ", disciplina=" + disciplina + ", nota1=" + nota1
+ ", nota2=" + nota2 + ", media=" + media + ", aluno="
+ aluno + "]";
}
WWW.COTIINFORMATICA.COM.BR 412
this.media = (this.getNota1() + this.getNota2()) / 2;
}
}
Habilitar o JSF
Clicar no projeto com o botão direito -> properties.
Clicar Project Facets -> Marcar Java Server faces -> Apply and close
WWW.COTIINFORMATICA.COM.BR 413
ManagerBean.java
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import entity.Aluno;
import entity.Disciplina;
@ManagedBean(name = "mb")
@RequestScoped
public class ManagerBean implements Serializable {
static {
Disciplina d1 = new Disciplina(100, "java", 9., 8.);
Disciplina d2 = new Disciplina(150, "oracle", 8., 10.);
Disciplina d3 = new Disciplina(200, "angular", 9., 8.);
Disciplina d4 = new Disciplina(300, "oracle", 9., 10.);
alunos.add(new Aluno(10, "lu", "lu@gmail.com"));
alunos.add(new Aluno(11, "gabriel", "gabriel@gmail.com"));
alunos.get(0).adicionar(d1); // alunos[0]
alunos.get(0).adicionar(d2);
alunos.get(1).adicionar(d3);
alunos.get(1).adicionar(d4);
}
@PostConstruct
public void init() {
this.load();
this.aluno = new Aluno(); // nao (REGISTRO)
this.disciplinas = new ArrayList<Disciplina>();
this.disciplinas.add(new Disciplina());// [0]
this.disciplinas.add(new Disciplina());// [1]
this.aluno.setDisciplinas(disciplinas);
// aluno principal
// alunos ->armazena (aluno)
// httpSession --> armazena alunos
}
WWW.COTIINFORMATICA.COM.BR 414
public void load() {
// Habilitando o trabalho
session = (HttpSession) FacesContext.getCurrentInstance()
.getExternalContext().getSession(true);
}
WWW.COTIINFORMATICA.COM.BR 415
this.disciplinas.get(0).gerarMedia();
this.disciplinas.get(1).gerarMedia();
this.aluno.setDisciplinas(this.disciplinas);
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>projetoJSFsemjboss</display-name>
<servlet>
WWW.COTIINFORMATICA.COM.BR 416
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>
sistema.xhtml
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<p:panel header="Relacionamento Aluno Disciplina">
<h:form id="form1">
<p:panelGrid columns="2">
<h:outputText value="Id Aluno"></h:outputText>
<p:inputText value="#{mb.aluno.idAluno}"></p:inputText>
<h:outputText value="Email"></h:outputText>
<p:inputText value="#{mb.aluno.email}"></p:inputText>
<h:outputText value="idDisciplina"></h:outputText>
<p:inputText
value="#{mb.disciplinas[0].idDisciplina}"></p:inputText>
<h:outputText value="Nota1"></h:outputText>
<p:inputText
value="#{mb.disciplinas[0].nota1}"></p:inputText>
<h:outputText value="Nota2"></h:outputText>
<p:inputText
value="#{mb.disciplinas[0].nota2}"></p:inputText>
<h:outputText value="idDisciplina"></h:outputText>
WWW.COTIINFORMATICA.COM.BR 417
<p:inputText
value="#{mb.disciplinas[1].idDisciplina}"></p:inputText>
<h:outputText value="Nome Disciplina"></h:outputText>
<p:inputText
value="#{mb.disciplinas[1].disciplina}"></p:inputText>
<h:outputText value="Nota1"></h:outputText>
<p:inputText
value="#{mb.disciplinas[1].nota1}"></p:inputText>
<h:outputText value="Nota2"></h:outputText>
<p:inputText
value="#{mb.disciplinas[1].nota2}"></p:inputText>
WWW.COTIINFORMATICA.COM.BR 418
Rodar o projeto
Clicar na pagina sistema.xhtml com o botão direito -> run as -> run on
server
WWW.COTIINFORMATICA.COM.BR 419
Aguardar o projeto abrir no browser
http://localhost:8080/projetoJSFsemjboss/sistema.jsf
WWW.COTIINFORMATICA.COM.BR 420
Clicar em GRAVAR. Mostra a lista
Visualizando a lista
WWW.COTIINFORMATICA.COM.BR 421
Estrutura do projeto client Ionic depois de
finalizado
produto.ts
export class Produto {
idProduto: number;
nome: string;
preco: number;
quantidade: number;
imagem: string;
WWW.COTIINFORMATICA.COM.BR 422
constructor(idProduto?: number, nome?: string,
preco?: number, quantidade?: number,
imagem?: string) {
this.idProduto = idProduto;
this.nome = nome;
this.preco = preco;
this.quantidade = quantidade;
this.imagem = imagem;
venda.ts
import { Produto } from './produto';
idVenda: number;
produtos: Produto[] = [];
dataVenda: Date;
constructor() {
this.dataVenda = new Date(2020, 10 - 1, 10, 22, 30, 10);
}
}
produto.service.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { Produto } from '../model/produto';
@Injectable()
export class ProdutoService {
constructor() {
WWW.COTIINFORMATICA.COM.BR 423
this.count.next(this.vetor.length);
}
public quantidadeItems() {
return this.vetor.length;
}
}
home.page.ts
import { Component } from '@angular/core';
import { Produto } from '../model/produto';
import { Venda } from '../model/venda';
import { ProdutoService } from '../service/produto.service';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class HomePage {
produto1: Produto;
produto2: Produto;
venda: Venda = new Venda();
quantidadeglobal: number = 0;
public adicionar() {
this.venda.produtos.push(this.produto1);
this.venda.produtos.push(this.produto2);
this.service.contar(this.produto1);
this.service.contar(this.produto2);
this.quantidadeglobal = this.service.quantidadeItems();
console.log('produto 1', this.produto1);
console.log('produto 2', this.produto2);
console.log('vendas', this.venda);
}
}
WWW.COTIINFORMATICA.COM.BR 424
home.page.html
<ion-header [translucent]="true">
<ion-toolbar>
<ion-title>
Blank
</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]="true">
<ion-header collapse="condense">
<ion-toolbar>
<ion-title size="large">Blank</ion-title>
</ion-toolbar>
</ion-header>
<div id="container">
<ion-button (click)="adicionar()">Adicionar</ion-button>
</div>
<br />
<div style="margin-left: 50px;"> {{quantidadeglobal}} </div>
</ion-content>
Rodar o projeto
Digitar no terminal:
ionic serve
Aguardar abrir o navegador
http://localhost:8100/home
WWW.COTIINFORMATICA.COM.BR 425
Clicar em F12 e clicar no celular, no console do browser
WWW.COTIINFORMATICA.COM.BR 426
Coti Informática - https://www.cotiinformatica.com.br
WWW.COTIINFORMATICA.COM.BR 427
Java WebDeveloper Noite -
Aula 28 (Seg, Qua, Sex)
Tema da aula:
Projeto Ionic, Data, Serviço contador, adicionar clique, validação na classe,
lista mock, ion-card, css, login, timeout
WWW.COTIINFORMATICA.COM.BR 428
Estrutura do projeto Ionic depois de
finalizado
readme.md
INCIAR O PROJETO APP:
ionic serve
WWW.COTIINFORMATICA.COM.BR 429
produto.ts
export class Produto {
idProduto: number;
nome: string;
preco: number;
quantidade: number;
imagem: string;
usuario.ts
export class Usuario {
id: number;
email: string;
senha: string;
isEmail() {
let reg = /^([a-zA-Z0-9])+@([a-zA-Z0-9])+\.([a-z0-9])+$/
return reg.test(this.email);
}
isSenha() {
let reg = /^[a-zA-Z0-9]{6,15}$/
return reg.test(this.senha);
WWW.COTIINFORMATICA.COM.BR 430
}
public toString() {
return this.id + "," + this.email + "," + this.senha;
}
}
venda.ts
import { Produto } from './produto';
idVenda: number;
produtos: Produto[] = [];
dataVenda: Date;
constructor() {
this.dataVenda = new Date(2020, 10 - 1, 10, 22, 30, 10);
}
}
mock-usuario.ts
import { Usuario } from './usuario';
WWW.COTIINFORMATICA.COM.BR 431
home.page.ts
import { Component } from '@angular/core';
import { Produto } from '../model/produto';
import { Venda } from '../model/venda';
import { ProdutoService } from '../service/produto.service';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class HomePage {
produto1: Produto;
produto2: Produto;
venda: Venda = new Venda();
quantidadeglobal: number = 0;
constructor(private service: ProdutoService) {
this.produto1 = new Produto(10, "havaianas", 100, 2, "none");
this.produto2 = new Produto(11, "polystastion", 80, 2, "none");
}
public adicionar() {
this.venda.produtos.push(this.produto1);
this.venda.produtos.push(this.produto2);
this.service.contar(this.produto1);
this.service.contar(this.produto2);
this.quantidadeglobal = this.service.quantidadeItems();
console.log('produto 1', this.produto1);
console.log('produto 2', this.produto2);
console.log('vendas', this.venda);
}
}
home.page.html
<ion-header [translucent]="true">
<ion-toolbar color='clear'>
<ion-title>
Home
</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]="true">
<ion-card>
<img src='https://cdn3.iconfinder.com/data/icons/
user-avatars-1/512/users-9-2-512.png'>
<ion-card-header>
WWW.COTIINFORMATICA.COM.BR 432
<ion-card-title>
Bem vindo ao nosso sistema
</ion-card-title>
<ion-card-subtitle>
Faça o cadastro ou login dos seus clientes
</ion-card-subtitle>
</ion-card-header>
</ion-card>
home.page.scss
ion-toolbar{
background-color: #0984e3;
}
img{
display: block;
margin-left: auto;
margin-right: auto;
margin-top: 20px;
border-radius: 50%;
border: 1px solid #ccc;
padding: 5px;
box-shadow: 5px 5px 10px #ccc;
background-color: #ffffff;
}
ion-card-title, ion-card-subtitle{
text-align: center;
margin-top: 20px;
}
ion-card{
background-color: rgba(195, 193, 193, 0.493);
padding: 10px;
}
WWW.COTIINFORMATICA.COM.BR 433
login.page.ts
import { usuarios } from './../model/mock-usuario';
import { Component, OnInit } from '@angular/core';
import { Usuario } from '../model/usuario';
@Component({
selector: 'app-login',
templateUrl: './login.page.html',
styleUrls: ['./login.page.scss'],
})
export class LoginPage implements OnInit {
usuario: Usuario;
logado: Usuario;
constructor() {
this.usuario = new Usuario();
this.logado = new Usuario();
}
ngOnInit() {
}
public logar() {
this.logado = this.listaUsuario.filter(res => {
return (this.usuario.email == res.email
&& this.usuario.senha == res.senha);
}
)[0];
}
public tempo() {
setTimeout(() => {
// primeiro
this.logar();
setTimeout(() => {
//segundo
if (this.logado) {
localStorage.setItem("item", JSON.stringify(this.logado));
console.log("logado ...");
} else {
console.log("nao logado");
}
}, 3000);
}, 2000);
}
}
WWW.COTIINFORMATICA.COM.BR 434
login.page.html
<ion-header [translucent]='true'>
<ion-toolbar color='clear'>
<ion-buttons>
<ion-back-button></ion-back-button>
</ion-buttons>
<ion-title>Login</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]='true'>
<ion-card>
<img src='https://cdn4.iconfinder.com/data/icons/
Pretty_office_icon_part_2/256/man.png'>
<ion-card-header>
<ion-card-title>Faça o login aqui</ion-card-title>
</ion-card-header>
<ion-card-content>
<ion-list>
<ion-item>
<ion-label position='floating'>Email:</ion-label>
<ion-input type='text' [(ngModel)]='usuario.email'></ion-input>
</ion-item>
<ion-item>
<ion-label position='floating'>Senha:</ion-label>
<ion-input type='password' [(ngModel)]='usuario.senha'>
</ion-input>
</ion-item>
</ion-list>
WWW.COTIINFORMATICA.COM.BR 435
login.page.scss
ion-toolbar{
background-color: #3DD779;
}
img{
display: block;
margin-left: auto;
margin-right: auto;
margin-top: 20px;
}
ion-card-title{
margin-top: 20px;
text-align: center;
}
Rodar o projeto
Digitar no terminal:
ionic serve
WWW.COTIINFORMATICA.COM.BR 436
Clicar no botão login
WWW.COTIINFORMATICA.COM.BR 437
Logado
WWW.COTIINFORMATICA.COM.BR 438
Java WebDeveloper Noite -
Aula 29 (Seg, Qua, Sex)
Tema da aula:
Continuação, Projeto Ionic, Data, Serviço contador, adicionar clique,
validação na classe, listas mock, serviços listar, ion-card, css, login, timeout,
ion-grid, ion-col
WWW.COTIINFORMATICA.COM.BR 439
Estrutura do projeto Ionic depois de
finalizado
WWW.COTIINFORMATICA.COM.BR 440
readme.md
INCIAR O PROJETO APP:
ionic serve
produto.ts
export class Produto {
idProduto: number;
nome: string;
preco: number;
quantidade: number;
imagem: string;
WWW.COTIINFORMATICA.COM.BR 441
public toString(): string {
return this.idProduto + "," + this.nome + ","
+ this.preco + "," + this.quantidade + "," + this.imagem;
}
}
usuario.ts
export class Usuario {
id: number;
email: string;
senha: string;
isEmail() {
let reg = /^([a-zA-Z0-9])+@([a-zA-Z0-9])+\.([a-z0-9])+$/
return reg.test(this.email);
}
isSenha() {
let reg = /^[a-zA-Z0-9]{6,15}$/
return reg.test(this.senha);
}
public toString() {
return this.id + "," + this.email + "," + this.senha;
}
}
venda.ts
import { Produto } from './produto';
idVenda: number;
produtos: Produto[] = [];
dataVenda: Date;
constructor() {
this.dataVenda = new Date(2020, 10 - 1, 10, 22, 30, 10);
}
WWW.COTIINFORMATICA.COM.BR 442
}
mock-usuario.ts
import { Usuario } from './usuario';
mock-produto.ts
import { Produto } from '../model/produto';
WWW.COTIINFORMATICA.COM.BR 443
"imagem" : "https://images-americanas.b2w.io/produtos/01/00/img/
677177/9/677177959_1GG.jpg"
}
]as Produto[];
produto.service.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { Produto } from '../model/produto';
import { produtos } from '../model/mock-produtos';
@Injectable()
export class ProdutoService {
constructor() {
public quantidadeItems() {
return this.vetor.length;
}
public findAll() {
return produtos;
}
}
home.page.ts
import { Component } from '@angular/core';
import { Produto } from '../model/produto';
import { Venda } from '../model/venda';
import { ProdutoService } from '../service/produto.service';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
})
export class HomePage {
WWW.COTIINFORMATICA.COM.BR 444
produto1: Produto;
produto2: Produto;
venda: Venda = new Venda();
quantidadeglobal: number = 0;
constructor(private service: ProdutoService) {
this.produto1 = new Produto(10, "havaianas", 100, 2, "none");
this.produto2 = new Produto(11, "polystastion", 80, 2, "none");
}
public adicionar() {
this.venda.produtos.push(this.produto1);
this.venda.produtos.push(this.produto2);
this.service.contar(this.produto1);
this.service.contar(this.produto2);
this.quantidadeglobal = this.service.quantidadeItems();
console.log('produto 1', this.produto1);
console.log('produto 2', this.produto2);
console.log('vendas', this.venda);
}
}
home.page.html
<ion-header [translucent]="true">
<ion-toolbar color='clear'>
<ion-title>
Home
</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]="true">
<ion-card>
<img src='https://cdn3.iconfinder.com/data/icons/
user-avatars-1/512/users-9-2-512.png'>
<ion-card-header>
<ion-card-title>
Bem vindo ao nosso sistema
</ion-card-title>
<ion-card-subtitle>
Faça o cadastro ou login dos seus clientes
</ion-card-subtitle>
</ion-card-header>
</ion-card>
WWW.COTIINFORMATICA.COM.BR 445
</div> -->
</ion-content>
home.page.scss
ion-toolbar{
background-color: #0984e3;
}
img{
display: block;
margin-left: auto;
margin-right: auto;
margin-top: 20px;
border-radius: 50%;
border: 1px solid #ccc;
padding: 5px;
box-shadow: 5px 5px 10px #ccc;
background-color: #ffffff;
}
ion-card-title, ion-card-subtitle{
text-align: center;
margin-top: 20px;
}
ion-card{
background-color: rgba(195, 193, 193, 0.493);
padding: 10px;
}
login.page.ts
import { usuarios } from './../model/mock-usuario';
import { Component, OnInit } from '@angular/core';
import { Usuario } from '../model/usuario';
@Component({
selector: 'app-login',
templateUrl: './login.page.html',
styleUrls: ['./login.page.scss'],
})
export class LoginPage implements OnInit {
usuario: Usuario;
logado: Usuario;
constructor() {
this.usuario = new Usuario();
this.logado = new Usuario();
WWW.COTIINFORMATICA.COM.BR 446
}
ngOnInit() {
}
public logar() {
this.logado = this.listaUsuario.filter(res => {
return (this.usuario.email == res.email
&& this.usuario.senha == res.senha);
}
)[0];
}
public tempo() {
setTimeout(() => {
// primeiro
this.logar();
setTimeout(() => {
//segundo
if (this.logado) {
localStorage.setItem("item", JSON.stringify(this.logado));
console.log("logado ...");
} else {
console.log("nao logado");
}
}, 3000);
}, 2000);
}
}
login.page.html
<ion-header [translucent]='true'>
<ion-toolbar color='clear'>
<ion-buttons>
<ion-back-button></ion-back-button>
</ion-buttons>
<ion-title>Login</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]='true'>
<ion-card>
<img src='https://cdn4.iconfinder.com/data/icons/
Pretty_office_icon_part_2/256/man.png'>
<ion-card-header>
<ion-card-title>Faça o login aqui</ion-card-title>
</ion-card-header>
<ion-card-content>
<ion-list>
WWW.COTIINFORMATICA.COM.BR 447
<ion-item>
<ion-label position='floating'>Email:</ion-label>
<ion-input type='text' [(ngModel)]='usuario.email'></ion-input>
</ion-item>
<ion-item>
<ion-label position='floating'>Senha:</ion-label>
<ion-input type='password' [(ngModel)]='usuario.senha'>
</ion-input>
</ion-item>
</ion-list>
login.page.scss
ion-toolbar{
background-color: #3DD779;
}
img{
display: block;
margin-left: auto;
margin-right: auto;
margin-top: 20px;
}
ion-card-title{
margin-top: 20px;
text-align: center;
}
produtos.page.ts
import { ProdutoService } from './../service/produto.service';
import { Component, OnInit } from '@angular/core';
import { Produto } from '../model/produto';
@Component({
selector: 'app-produtos',
templateUrl: './produtos.page.html',
styleUrls: ['./produtos.page.scss'],
})
export class ProdutosPage implements OnInit {
WWW.COTIINFORMATICA.COM.BR 448
produtos: Produto[] = [];
ngOnInit() {
this.listar();
}
public listar() {
this.produtos = this.service.findAll();
}
produtos.page.html
<ion-header>
<ion-toolbar color='clear'>
<ion-buttons slot='start'>
<ion-back-button></ion-back-button>
</ion-buttons>
<ion-title>Produtos</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]='true'>
<h4>Categorias:</h4>
<ion-grid>
<ion-row>
<ion-col>
<div>
<img src='https://cdn1.iconfinder.com/data/icons/
cool-shoes/200/ziyuan_16-256.png' class='cat'>
<p>Calçados</p>
</div>
</ion-col>
<ion-col>
<div>
<img src='https://cdn1.iconfinder.com/data/icons/
colored-hand-phone/96/Whatsapp-mobile_phone-256.png'
class='cat'>
<p>Celulares</p>
</div>
</ion-col>
<ion-col>
<div>
<img src='https://cdn0.iconfinder.com/data/icons/
devices-42/1600/Watch_2-256.png' class='cat'>
WWW.COTIINFORMATICA.COM.BR 449
<p>Relógios</p>
</div>
</ion-col>
</ion-row>
</ion-grid>
<ion-list-header>
<ion-label>Mais Vendidos</ion-label>
<ion-button color='primary'>Veja todos</ion-button>
</ion-list-header>
<ion-col size='4'>
<div>
<ion-label>{{p.nome}}</ion-label>
</div>
</ion-col>
<ion-col size='4'>
<div>
<ion-label>R$ {{p.preco}},00</ion-label>
</div>
</ion-col>
<ion-col size='2'>
<div>
<ion-button color='clear'>
<ion-icon name='pencil' class="pencil"></ion-icon>
</ion-button>
<ion-button color='clear'>
<ion-icon name='trash-outline' class="trash"></ion-icon>
</ion-button>
</div>
</ion-col>
</ion-row>
</ion-grid>
</ion-item>
</ion-list>
</ion-content>
WWW.COTIINFORMATICA.COM.BR 450
produtos.page.scss
h4{
text-align: center;
margin-top: 30px;
}
.cat{
width: 80%;
display: block;
margin-left: auto;
margin-right: auto;
}
p{
text-align: center;
font-weight: bolder;
}
ion-toolbar{
background-color: #0984e3;
}
ion-label{
text-transform: uppercase;
}
.trash{
color: red;
}
.pencil{
color: blue;
}
ion-button{
border: 1px solid #ccc;
}
Rodar o projeto
Digitar no terminal:
ionic serve
WWW.COTIINFORMATICA.COM.BR 451
Clicar no botão login
WWW.COTIINFORMATICA.COM.BR 452
Digitar os dados para logar
Logado
WWW.COTIINFORMATICA.COM.BR 453
Será redirecionado para produtos
WWW.COTIINFORMATICA.COM.BR 454
Java WebDeveloper Noite -
Aula 30 (Seg, Qua, Sex)
Tema da aula:
Projeto Maven SpringBoot, Mysql, gson, Annotations, Pattern, Validação,
Relacionamneto ManyToMany, JpaRepository, Controller
WWW.COTIINFORMATICA.COM.BR 455
Estrutura do projeto Maven depois de
finalizado
readme.md
mappedBy @JoinTable
Aluno Professor
idA idB
nomeA nome
materia email
ProfessorAluno
idB
idA
Aluno Professor
10 20
edsao lu
java lu@gmail.com
ProfessorAluno
20
10
WWW.COTIINFORMATICA.COM.BR 456
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath />
</parent>
<groupId>br.com.coti</groupId>
<artifactId>relacionamento</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>sistema</name>
<description>Relacionamento com SpringBoot</description>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
WWW.COTIINFORMATICA.COM.BR 457
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-
tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
WWW.COTIINFORMATICA.COM.BR 458
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
Aluno.java
package br.com.coti.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table(name = "aluno")
public class Aluno implements Serializable {
public Aluno() {
WWW.COTIINFORMATICA.COM.BR 459
@Override
public String toString() {
return "Aluno [id=" + id + ", nome=" + nome + ", email="
+ email + "]";
}
WWW.COTIINFORMATICA.COM.BR 460
Curso.java
package br.com.coti.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name = "curso")
public class Curso implements Serializable {
public Curso() {
}
WWW.COTIINFORMATICA.COM.BR 461
@Override
public String toString() {
return "Curso [id=" + idCurso + ", nomeCurso=" + nomeCurso
+ "]";
}
AlunoRepository.java
package br.com.coti.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import br.com.coti.entity.Aluno;
@Repository
public interface AlunoRepository extends JpaRepository<Aluno, Long> {
WWW.COTIINFORMATICA.COM.BR 462
}
CursoRepository.java
ackage br.com.coti.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import br.com.coti.entity.Curso;
@Repository
public interface CursoRepository extends JpaRepository<Curso, Long> {
AlunoController.java
package br.com.coti.controller;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@ResponseBody
public class AlunoController {
WWW.COTIINFORMATICA.COM.BR 463
Java WebDeveloper Noite -
Aula 31 (Seg, Qua, Sex)
Tema da aula:
Continuação, Projeto Maven SpringBoot, Mysql, gson, Annotations, Pattern,
Validação, Relacionamneto ManyToMany, CascadeType, @Join,
JpaRepository, Controller Rest, configuração application.properties
WWW.COTIINFORMATICA.COM.BR 464
Estrutura do projeto Maven depois de
finalizado
readme.md
mappedBy @JoinTable
Aluno Professor
idA idB
nomeA nome
materia email
ProfessorAluno
idB
idA
Aluno Professor
10 20
edsao lu
java lu@gmail.com
WWW.COTIINFORMATICA.COM.BR 465
ProfessorAluno
20
10
pom.xml
project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath />
</parent>
<groupId>br.com.coti</groupId>
<artifactId>relacionamento</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>sistema</name>
<description>Relacionamento com SpringBoot</description>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
WWW.COTIINFORMATICA.COM.BR 466
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
WWW.COTIINFORMATICA.COM.BR 467
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
Aluno.java
package br.com.coti.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table(name = "aluno")
public class Aluno implements Serializable {
public Aluno() {
WWW.COTIINFORMATICA.COM.BR 468
public Aluno(Long id, String nome, String email) {
this.id = id;
this.nome = nome;
this.email = email;
}
@Override
public String toString() {
return "Aluno [id=" + id + ", nome=" + nome + ", email="
+ email + "]";
}
WWW.COTIINFORMATICA.COM.BR 469
Curso.java
package br.com.coti.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name = "curso")
public class Curso implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idCurso;
@Column(length = 50)
private String nomeCurso;
@ManyToMany(fetch = FetchType.EAGER, cascade =
{ CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE })
@JoinTable(name = "CursoAluno", joinColumns =
@JoinColumn(name = "idCurso"), inverseJoinColumns =
@JoinColumn(name = "id"))
public Curso() {
}
WWW.COTIINFORMATICA.COM.BR 470
@Override
public String toString() {
return "Curso [id=" + idCurso + ", nomeCurso="
+ nomeCurso + "]";
}
AlunoRepository.java
package br.com.coti.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import br.com.coti.entity.Aluno;
@Repository
WWW.COTIINFORMATICA.COM.BR 471
public interface AlunoRepository extends JpaRepository<Aluno, Long> {
CursoRepository.java
package br.com.coti.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import br.com.coti.entity.Curso;
@Repository
public interface CursoRepository extends JpaRepository<Curso, Long> {
AlunoController.java
package br.com.coti.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import br.com.coti.repository.AlunoRepository;
import br.com.coti.repository.CursoRepository;
@RestController
@ResponseBody
public class AlunoController {
@Autowired
private AlunoRepository adao;
@Autowired
private CursoRepository udao;
WWW.COTIINFORMATICA.COM.BR 472
application.properties
Application.java
package br.com.coti.application;
import java.util.HashSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.
EnableJpaRepositories;
import br.com.coti.entity.Aluno;
import br.com.coti.entity.Curso;
import br.com.coti.repository.AlunoRepository;
import br.com.coti.repository.CursoRepository;
@EntityScan(basePackages = "br.com.coti.entity")
@EnableJpaRepositories(basePackages = "br.com.coti.repository")
@ComponentScan(basePackages = "br.com.coti.controller")
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private AlunoRepository adao;
@Autowired
private CursoRepository udao;
WWW.COTIINFORMATICA.COM.BR 473
Aluno aluno = new Aluno(null, "conhecimento",
"vem@gmail.com");
aluno.setCursos(new HashSet<Curso>());
Curso c1 = new Curso(null, "Angular");
Curso c2 = new Curso(null, "Java");
aluno.getCursos().clear();
c1.getAlunos().clear();
c2.getAlunos().clear();
aluno.getCursos().add(c1);
aluno.getCursos().add(c2);
c1.getAlunos().add(aluno);
c2.getAlunos().add(aluno);
adao.save(aluno);
}
Rodar o projeto
Clicar na classe Application.java com o botão direito -> run as -> java
application
WWW.COTIINFORMATICA.COM.BR 474
Aguardar o servidor iniciar
WWW.COTIINFORMATICA.COM.BR 475
Coti Informática - https://www.cotiinformatica.com.br
Coti EAD - https://www.cotiead.com.br
tags: noite seg-qua-sex 15-06-2020
WWW.COTIINFORMATICA.COM.BR 476