Você está na página 1de 476

Java WebDeveloper 2020

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
.

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Mar 09, 2020

Dados dos professores:


 profedsonbelem@gmail.com / face
(21)98199-0108 / zap
 lucianamedeiros.coti@gmail.com
(21)98201-2525

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.

Criando um projeto local

Clicar no menu File New Java Project

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

Para criar o pacote ou diretorio

Clicar em src com o botão direito new package

WWW.COTIINFORMATICA.COM.BR 8
Digitar o nome do pacote finish

Para criar a classe

Clicar no pacote com o botão direito new class

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

Abrir o Eclipse. Clicar em File Import.

WWW.COTIINFORMATICA.COM.BR 11
Clicar em general Existing Projects into Workspace Next.

Clicar em Browse e apontar onde está o diretório do projeto.

WWW.COTIINFORMATICA.COM.BR 12
Clicar na pasta OK.

Finish.

WWW.COTIINFORMATICA.COM.BR 13
Atalhos do Eclipse

TECLAS O que faz

CTRL + S Salvar a classe

CTRL + SHIFT + S Salvar todas as classes

CTRL + ESPAÇO Autocompleta os comandos

Atalho para getters and setters e


ALT + S
construtores

CTRL + SHIFT + O Faz algumas das importações

CTRL + W Fecha a aba

CTRL + SHIFT + W Fecha todas as abas

CTRL + D Exclui a linha

WWW.COTIINFORMATICA.COM.BR 14
TECLAS O que faz

F11 Rodar o main

CTRL + PG UP Pula as abas das classes para frente

CTRL + PG DOWN Pula as abas das classes para trás

CTRL + SHIFT + F Formata as o texto

CTRL + N cria novo arquivo

CTRL + SHIFT + L Listar todos os atalhos

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.

Programação Orientada a Objetos (também conhecida pela sua sigla POO)


é um modelo de análise, projeto e programação de software baseado na
composição e interação entre diversas unidades chamadas de ‘objetos’. A
POO é um dos 4 principais paradigmas de programação (as outras são
programação imperativa, funcional e lógica). Os objetos são operados com o
conceito de ‘this’ (isso) ou ‘self’ (si), de forma que seus métodos (muitas
vezes) modifiquem os dados da própria instância. Os programas são
arquitetados através de objetos que interagem entre si. Dentre as várias
abordagens da POO, as baseadas em classes são as mais comuns: objetos
são instâncias de classes, o que em geral também define o tipo do objeto.
Cada classe determina o comportamento (definido nos métodos) e estados
possíveis (atributos) de seus objetos, assim como o relacionamento com

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).

Em alguns contextos, o termo modelagem orientada ao objeto (MOO) é


preferível ao termo POO. De fato, o paradigma “orientado ao objeto” tem
origem nos estudos da cognição e influenciou a inteligência artificial e a
linguística, dada a relevância para a abstração de conceitos do mundo real.
A MOO é considerada a melhor estratégia para diminuir o “gap semântico”
(o hiato entre o mundo real e a representação dele), e facilita a comunicação
das partes interessadas no modelo ou software (e.g. o modelador e o
usuário final) na medida em que conceitos, terminologia, símbolos, grafismo
e estratégias, são, potencialmente, mais óbvios, intuitivos, naturais e exatos.

Muitas das linguagens de programação mais utilizadas atualmente (talvez a


maioria) são multi-paradigma com suporte à POO. C++, C#, VB.NET, Java,
Object Pascal, Objective-C, Python, SuperCollider, Ruby e Smalltalk são
exemplos de linguagens de programação orientadas a objetos. ActionScript,
ColdFusion, Javascript, PHP (a partir da versão 4.0), Perl (a partir da versão
5), Visual Basic (a partir da versão 4), VimL (ou Vim script) são exemplos de
linguagens de programação com suporte a orientação a objetos. Vivace é
um exemplo de linguagem sem suporte à POO.

Os atributos e métodos podem ser referentes a uma classe (e todas as suas


instâncias) ou a uma única instância. O vínculo dos atributos aos métodos,
de forma a manter uma interface bem definida para operação sobre os
dados, e a evitar corrupção dos dados, é chamado de encapsulamento. O
encapsulamento foi responsável pelo conceito de ‘ocultamento de dados’,
central para a POO. O encapsulamento pode ser realizado através de
convenções (em Python, underscores demarcam métodos e atributos
protegidos e privados), ou via recursos da linguagem (em Java ou C++, um
método privado só é acessado pela própria classe). Encapsulamento
incentiva o desacoplamento.

Quando um objeto contém outros objetos, diz-se que há composição de


objetos. A composição de objetos é usada para representar uma relação
‘tem um’, usualmente uma meronímia. Já a herança (quase sempre
suportada pelas linguagens que utilizam classes) apresenta relações ‘é um’
(i.e. ‘é um tipo de’), ou seja, relações de hiperonímia cujo resultado final é a

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.

Modificadores de acesso do Java


Em Java, podemos criar atributos ou métodos com os seguintes
modificadores de acesso:

 public - Acesso total, qualquer classe tem acesso ao método (não


indicado para usar em atributos de entidade).
 protected - Acesso permitido por herança e por classes do mesmo
pacote.
 default / friendly - Acesso permitido somente a classes do mesmo
pacote, este acesso é definido quando não declaramos nenhum
modificador.
 private - Acesso permitido somente dentro da própria classe.
(indicado para atributos de classes de entidade).

Modelagem de dados em Java com UML


O Objetivo deste artigo é fornecer uma introdução à modelagem de Classes
em Java utilizando diagramas UML. Neste exemplo iremos abordar o
primeiro tipo de relacionamento aprendido em Orientação a Objetos: SER
(É-UM) utilizado entre Classes e também entre Interfaces. Para tal iremos
partir do principio, ou seja, o tipo mais “puro” de objeto Java, denominado
JavaBean

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 class Cliente {

private Integer idCliente;


private String nome;

public Cliente() {
}

public Cliente(Integer idCliente, String nome) {


super();
this.idCliente = idCliente;
this.nome = nome;
}

@Override
public String toString() {
return idCliente + ", " + nome;
}

public Integer getIdCliente() {


return idCliente;
}
public void setIdCliente(Integer idCliente) {
this.idCliente = idCliente;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}

WWW.COTIINFORMATICA.COM.BR 18
Visibilidades:

 -private Acesso somente dentro da Classe.


 ~default Acesso somente por classes do mesmo pacote.
 #protected Acesso por pacote e por herança.
 +public Acesso total.

package heranca;

public class PessoaFisica extends Cliente {

private String cpf;

public PessoaFisica() {
}

public PessoaFisica(Integer idCliente, String nome, String cpf) {


super(idCliente, nome);
this.cpf = cpf;
}

@Override
public String toString() {
return super.toString() + ", " + cpf;
}

public String getCpf() {


return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
}

WWW.COTIINFORMATICA.COM.BR 19
Implementação (É-UM)
Componente de programação OO totalmente abstrato. Tem como
caracteristicas: Padronização.

 Interfaces Não possuem construtores.


 Seus atributos são final (constantes).
 Métodos são publicos e abstratos (não tem corpo).
 Quando uma classe implementa uma interface, ela é obrigada a
fornecer corpo para os metodos da interface (desde que não seja uma
classe abstrata).

package relacionamento;

public interface IArquivo {

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;

public class Documento implements IArquivo {

@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
}
}

UML, qualquer nome em itálico, representa algo abstrato ou interface. No


próximo artigo iremos estudar o segundo tipo de relacionamento entre
Classes denominado TER (Todo/Parte) e suas variações como Agregação,
Composição, Dependência e suas Multiplicidades.

package entity2;

public abstract class Automovel {

private Integer idAutomovel;


private String nome;

public Automovel() {
}

public Automovel(Integer idAutomovel, String nome) {


this.idAutomovel = idAutomovel;
this.nome = nome;
}

WWW.COTIINFORMATICA.COM.BR 21
@Override
public String toString() {
return idAutomovel + ", " + nome;
}

public Integer getIdAutomovel() {


return idAutomovel;
}
public void setIdAutomovel(Integer idAutomovel) {
this.idAutomovel = idAutomovel;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}

// Métodos abstratos
public abstract void setFabricante(String fabricante);
public abstract String getFabricante();
}

Classes comuns herdando da Classe Abstrata


package entity2;

public class CarroEsportivo extends Automovel {

private Integer ano;


private String fabricante;

public CarroEsportivo() {

public CarroEsportivo(Integer idAutomovel, String nome,


Integer ano, String fabricante) {
super(idAutomovel, nome);
this.ano = ano;
this.fabricante = fabricante;
}

@Override
public String toString() {
return super.toString() + ", " + ano + ", " + fabricante;
}

public Integer getAno() {


return ano;
}
public void setAno(Integer ano) {
this.ano = ano;
}

@Override

WWW.COTIINFORMATICA.COM.BR 22
public String getFabricante() {
return fabricante;
}

@Override
public void setFabricante(String fabricante) {
this.fabricante = fabricante;
}
}
.

package entity2;

public class CarroExecutivo extends Automovel {

private String modelo;


private String fabricante;

public CarroExecutivo() {

public CarroExecutivo(Integer idAutomovel, String nome,


String modelo, String fabricante) {
super(idAutomovel, nome);
this.modelo = modelo;
this.fabricante = fabricante;
}

@Override
public String toString() {
return super.toString() + ", " + modelo + ", " +
fabricante;
}

public String getModelo() {


return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}

@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;

public class Main {

public static void main(String[] args) {

Automovel a1 = new CarroEsportivo(1, "Ferrari", 2012, "Ferrari


Italia");
Automovel a2 = new CarroExecutivo(2, "C4", "Sedan", "Citroen");

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

O que é uma classe

Uma classe define estado e comportamento de um Objeto geralmente


implementando métodos e atributos (nomes utilizados na maioria das
linguagens modernas). Os atributos, também chamados de campos (do
inglês fields), indicam as possíveis informações armazenadas por um objeto
de uma classe, representando o estado de cada objeto. Os métodos são
procedimentos que formam os comportamentos e serviços oferecidos por
objetos de uma classe.

Uma classe é uma estrutura que abstrai um conjunto de objetos com


características similares. Uma classe define o comportamento de seus
objetos - através de métodos - e os estados possíveis destes objetos -
através de atributos. Em outras palavras, uma classe descreve os serviços

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.

Classe Java Beans


JavaBeans são componentes de software escritos na linguagem de
programação Java. Segundo a especificação da Sun Microsystems os
JavaBeans são “componentes reutilizáveis de software que podem ser
manipulados visualmente com a ajuda de uma ferramenta de
desenvolvimento”.

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.

Praticamente são classes escritas de acordo com uma convenção em


particular. São usados para encapsular muitos objetos em um único objeto
(o bean), assim eles podem ser transmitidos como um único objeto em vez
de vários objetos individuais.

São características de uma Classe JavaBean:

 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.

Cliente c1 = new Cliente();

[Classe] [Objeto]
[Construtor Instância]

Um objeto, na vida real, é qualquer coisa a qual pudermos dar um nome.


Um objeto, em programação orientada a objetos, é uma instância (ou seja,
um exemplar) de uma classe. A Wikilivros é um exemplo de Wiki, ou, a
Wikilivros é uma instância de Wiki. Isto poderia ser representado em um
programa orientado a objetos com uma classe chamada Wiki e um objeto
do tipo Wiki chamado Wikilivros. Um objeto é capaz de armazenar estados
através de seus atributos e reagir a mensagens enviadas a ele, assim como
se relacionar e enviar mensagens a outros objetos. Atributos são
características de um objeto. Basicamente a estrutura de dados que vai
representar a classe. Exemplos: um objeto da classe “Funcionário” teria como
atributos “nome”, “endereço”, “telefone”, “CPF”, etc. O conjunto de valores
dos atributos de um determinado objeto é chamado de estado.

Padrão MVC - Model, View e Controller

Esse padrão tem a finalidade de dividir o projeto em três camadas:


1- Camada Modelo: A camada Modelo tem as classes de dados que define o
domínio da aplicação, por exemplo, classe aluno, professor, turma se sua
aplicação for de controle de turma.
2- Camada View: A camada View corresponde a qualquer entrada de dados
WWW.COTIINFORMATICA.COM.BR 26
da aplicação, por exemplo, leitura de dados pelo console, paginas jsp, xhtml
entre outras.
3- Camada Control: A camada control corresponde à regra de negocio da
aplicação e centralizando as informações vindas da camada view, passando
para camada de modelo e voltando para camada de view.

Camada Model

package modelo;

public class Pessoa {

private Integer idPessoa;


private String nome;
private Integer idade;

public Pessoa() {
}

public Pessoa(Integer idPessoa, String nome, Integer idade) {


super();
this.idPessoa = idPessoa;
this.nome = nome;
this.idade = idade;
}

@Override
public String toString() {
return "Pessoa [idPessoa=" + idPessoa + ", nome=" + nome +
", idade=" + idade + "]";
}

public Integer getIdPessoa() {


return idPessoa;
}
public void setIdPessoa(Integer idPessoa) {
this.idPessoa = idPessoa;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Integer getIdade() {
return idade;
}
public void setIdade(Integer idade) {
this.idade = idade;
}
}

WWW.COTIINFORMATICA.COM.BR 27
Camada Controle

package controle;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import modelo.Pessoa;

public class ValidaPessoa {

public void validaCodigo(Pessoa p)throws Exception{


if (p.getIdPessoa()<=0){
throw new Exception
("Codigo Menor ou igual a zero invalido ...");
}
}

public void validaIdade(Pessoa p)throws Exception{


if (p.getIdade()<18){
throw new Exception
("So pode ser cadastrado maior de idade");
}
}

public void validaNome(Pessoa p)throws Exception{


Pattern pa = Pattern.compile("[A-Z a-z]{3,35}");
Matcher ma = pa.matcher(p.getNome());
if (! ma.matches()){
throw new Exception
("Nome somente com Letras faixa (3,35)");
}//se for falso lança o erro
}
}

Camada View

package view;

import java.util.Scanner;

public class InputPessoa {

public Integer lerCodigo() {


try {
System.out.println("Digite o Codigo :");
Scanner in = new Scanner(System.in);
return in.nextInt();
} catch (Exception ex) {
System.out.println("Digite numero inteiro ...");
return lerCodigo();
}
}

public Integer lerIdade() {


try {

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();
}
}

public String lerNome() {


System.out.println("Digite o Nome :");
Scanner in = new Scanner(System.in);
return in.nextLine();
}
}

Execução do Programa no Main

package main;

import modelo.Pessoa;
import view.InputPessoa;
import controle.ValidaPessoa;

public class Main {

public static void main(String[] args) {


Pessoa p = new Pessoa();
InputPessoa ip = new InputPessoa();
ValidaPessoa vp = new 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

Em linguagens orientadas a objetos, é possível encapsular o estado de um


objeto. Em termos práticos, isso se realiza limitando o acesso a atributos de
uma classe exclusivamente através de seus métodos. Para isso, as linguagens
orientadas a objeto oferecem limitadores de acesso para cada membro de
uma classe.

Tipicamente os limitadores de acesso são:

 público (public) - o membro pode ser acessado por qualquer classe.


Os membros públicos de uma classe definem sua interface
 protegido (protected) - o membro pode ser acessado apenas pela
própria classe e suas sub-classes
 privado (private) - o membro pode ser acessado apenas pela própria
classe

Cada linguagem de programação pode possuir limitadores de acesso


próprios. Por exemplo, em Java, o nível de acesso padrão de um membro
permite que qualquer classe de seu pacote (package) possa ser acessado.
Em C♯, o limitador de acesso interno (internal) permite que o membro seja
acessado por qualquer classe do Assembly (isto é, da biblioteca ou
executável).

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 class Aluno {

private Integer idAluno;


private String nomeAluno;
private Double nota1;
private Double nota2;

public Aluno() {
}

public Aluno(Integer idAluno, String nomeAluno,


Double nota1, Double nota2) {
super();
this.idAluno = idAluno;
this.nomeAluno = nomeAluno;
this.nota1 = nota1;
this.nota2 = nota2;
}

@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;

public class Main {

public static void main(String[] args) {

//O encapsulamento utilizando set e get

Aluno a1 = new Aluno();


a1.setIdAluno(1);
a1.setNomeAluno("luiz");
a1.setNota1(7.);
a1.setNota2(8.);

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;

public class Usuario {


//is
//Test
// heranca verbo ter
//this
private Integer idUsuario;
private String login;
private String nome;
private String senha;

public Integer getIdUsuario() {


int id = 10;
return idUsuario;
}
public void setIdUsuario(Integer idUsuario) {
this.idUsuario = idUsuario;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getNome() {

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;
}

//alt + s gerar get e set


//main _+ ctrl + espaço
//syso + ctrl + espaço
public static void main(String[] args) {
//classe objeto espaco de mem Construtor();
Usuario u = null;
u.setLogin("profedsonbelem@gmail.com");
u.setIdUsuario(100);
u.setSenha("123456");
u.setNome("belem");
System.out.println("login =" + u.getLogin());
System.out.println("" + 1 + 1);
}
}

WWW.COTIINFORMATICA.COM.BR 34
Para rodar a classe.

Clique na classe com o botão direito -> run as -> java application

Resultado no console. Dará erro pois no main colocamos que


Usuario era null

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á:

Coti Informática https://www.cotiinformatica.com.br


Coti EAD https://www.cotiead.com.br

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

Prof Edson Belém - profedsonbelem@gmail.com Quarta, Jun 17, 2020

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.

É também possível que a sub-classe altere os comportamentos e estados


possíveis da super-classe. Neste caso, a sub-classe sobrescreve membros da
super-classe, tipicamente métodos.

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.

O objetivo da herança no Java é agrupar atributos comuns de varias clas ses


em uma única classe denominada Super-Classe, e as características
especificas ficam na Sub-Classe. No Java o comando que representa a
herança é chamado extends. E uma Sub-Classe não pode ter mais de uma
Super-Classe.

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;
}

O comando Java super, “super sem parêntese” , no método da sub-classe


tem a finalidade de chamar o método com o mesmo nome da Super-Classe.

@Override
public String toString() {
return super.toString() + "Aluno [nota1=" + nota1 +
", nota2=" + nota2 + "]";
}

Apresentação das Classes no Java.


Super-Classe Pessoa possui os atributos comuns as Sub-Classes Aluno e
Professor.

package entity;

public class Pessoa {

private String nome;


private String email;

public Pessoa() {
}

public Pessoa(String nome, String email) {


super();
this.nome = nome;
this.email = email;
}

@Override
public String toString() {
return "Pessoa [nome=" + nome + ", email=" + email + "]";
}

public String getNome() {


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

WWW.COTIINFORMATICA.COM.BR 39
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

Sub-Classes Aluno e Professor com esses atributos específicos.

package entity;

public class Aluno extends Pessoa {

public Double nota1;


public Double nota2;
public transient Double media;

public Aluno() {
}

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 + "]";
}

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;
}
public Double getMedia() {
return media;
}
public void setMedia(Double media) {
this.media = media;
}
}
.

WWW.COTIINFORMATICA.COM.BR 40
package entity;

public class Professor extends Pessoa {

private Integer matricula;


private Double salario;

public Professor() {
}

public Professor(String nome, String email, Integer matricula,


Double salario) {
super(nome, email);
this.matricula = matricula;
this.salario = salario;
}

@Override
public String toString() {
return super.toString() + "Professor [matricula="
+ matricula + ", salario=" + salario + "]";
}

public Integer getMatricula() {


return matricula;
}
public void setMatricula(Integer matricula) {
this.matricula = matricula;
}
public Double getSalario() {
return salario;
}
public void setSalario(Double salario) {
this.salario = salario;
}
}
.

package main;

import entity.Aluno;
import entity.Professor;

public class Main {

public static void main(String[] args) {

// 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

O JUnit é um framework open-source, criado por Erich Gamma e Kent Beck,


com suporte à criação de testes automatizados na linguagem de
programação Java.

Esse framework facilita a criação de código para a automação de testes com


apresentação dos resultados. Com ele, pode ser verificado se cada método
de uma classe funciona da forma esperada, exibindo possíveis erros ou
falhas podendo ser utilizado tanto para a execução de baterias de testes
como para extensão.

Com JUnit, o programador tem a possibilidade de usar esta ferramenta para


criar um modelo padrão de testes, muitas vezes de forma automatizada.

O teste de unidade testa o menor dos componentes de um sistema de


maneira isolada. Cada uma dessas unidades define um conjunto de
estímulos (chamada de métodos), e de dados de entrada e saída associados
a cada estímulo. As entradas são parâmetros e as saídas são o valor de
retorno, exceções ou o estado do objeto. Tipicamente um teste unitário
executa um método individualmente e compara uma saída conhecida após o
processamento da mesma.

O JUnit permite a realização de testes de unidades, conhecidos como “caixa


branca”, facilitando assim a correção de métodos e objetos.

WWW.COTIINFORMATICA.COM.BR 42
Algumas vantagens de se utilizar JUnit:

Permite a criação rápida de código de teste enquanto possibilita um


aumento na qualidade do sistema sendo desenvolvido e testado;

Não é necessário escrever o próprio framework;

Amplamente utilizado pelos desenvolvedores da comunidade código-


aberto, possuindo um grande número de exemplos;

Uma vez escritos, os testes são executados rapidamente sem que, para
isso, seja interrompido o processo de desenvolvimento;

JUnit checa os resultados dos testes e fornece uma resposta imediata;

Pode-se criar uma hierarquia de testes que permitirá testar apenas


uma parte do sistema ou todo ele;

Escrever testes com JUnit permite que o programador perca menos


tempo depurando seu código;

JUnit é LIVRE.

A experiência adquirida com o JUnit tem sido importante na consolidação


do Test Driven Development (desenvolvimento direcionado a testes). Além
disso, ele foi adaptado a outras linguagens, tais como C♯ (NUnit), Python,
Fortran, e C++.

WWW.COTIINFORMATICA.COM.BR 43
Estrutura do projeto feito em aula depois
de finalizado:

Pessoa.java
package entity;

public class Pessoa {

private String nome;


private String email;

// alt + s gerar e set


public String getNome() {
return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public String getEmail() {


return email;
}

public void setEmail(String email) {


this.email = email;
}

WWW.COTIINFORMATICA.COM.BR 44
public Boolean isNome() {
if (this.nome.length() > 1) {
return true;
} else {
return false;
}
}

public Boolean isEmail() {


if (this.email.length() > 5) {
return true;
} else {
return false;
}
}
}

Usuario.java
package entity;

public class Usuario extends Pessoa {


//HERANÇA

private Integer idUsuario;


private String senha;

public Integer getIdUsuario() {


return idUsuario;
}

public void setIdUsuario(Integer idUsuario) {


this.idUsuario = idUsuario;
}

public String getSenha() {


return senha;
}

public void setSenha(String senha) {


this.senha = senha;
}

public static void main(String[] args) {


Usuario u = new Usuario();

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());

System.out.println("nome na Regra:" + u.isNome());


System.out.println("email na regra" + u.isEmail());
}
}

Para rodar a classe.

Clique na classe com o botão direito -> run as -> java application

WWW.COTIINFORMATICA.COM.BR 46
Resultado no console.

Para adicionar o JUnit ao projeto

Clicar no projeto com o botão direito -> properties

WWW.COTIINFORMATICA.COM.BR 47
Clicar em Java Build Path -> Clicar na aba Libraries -> Clicar no
botão Add Esternal jars

Selecionar o JUNIT -> Clicar em Next

WWW.COTIINFORMATICA.COM.BR 48
Selecionar o Junit4 -> clicar em Finish

Clicar em Apply and Close

WWW.COTIINFORMATICA.COM.BR 49
TesteUnidadePessoa.java
package teste;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import entity.Usuario;

public class TesteUnidadePessoa {

// 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

Visualizando o resultado na aba do Junit

Coti Informática https://www.cotiinformatica.com.br


Coti EAD https://www.cotiead.com.br

WWW.COTIINFORMATICA.COM.BR 51
Java WebDeveloper Noite -
Aula 03 (Seg, Qua, Sex)

Tema da aula:
Projeto local, atributo static, calculo, Thread, JOptionPane,

Prof Edson Belém - profedsonbelem@gmail.com Sexta, Jun 19, 2020

Estrutura do projeto feito em aula depois


de finalizado:

WWW.COTIINFORMATICA.COM.BR 52
Aluno.java
package entity;

public class Aluno {

//id, nome, disciplina, nota1, nota2, media

public static Double total = 0.;


// global =>valido para todos
private Integer id;
private String nome;
private String disciplina;
private Double nota1;
private Double nota2;
private Double media;

public Integer getId() {


return id;
}

public void setId(Integer id) {


this.id = id;
}

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;
}

public void setNota2(Double nota2) {


this.nota2 = nota2;

WWW.COTIINFORMATICA.COM.BR 53
}

public Double getMedia() {


return media;
}

public void setMedia(Double media) {


this.media = media;
}

// crud
public void gerarMedia() {
this.media = (this.nota1 + this.nota2) / 2;
}
}

SimuladorExecucao.java
package main;

import entity.Aluno;

public class SimuladorExecucao {

// toda vez que vc existir comandos perigosos, é necessario a


// presenca
// de Throws ...
// toda vez que eu chamar o metodo try e catch

public static void main(String[] args) throws Throwable {

// 3 alunos recebem o retulado de suas notas...


// Seu Programa irá Mostrar a reacao do aluno quando tira
// a nota baixa
// -->mensagem - Vai Vendo ... nome do ALuno ao lado
// Aluno Passou - parabens - nome do Aluno

// Programa some todas as medias


// e no final me informe o somatorio das medias

// -->Acoes Temporarizadas ....

// Aluno a Aluno ate o final até colocar somar a


// media dele
// ctrl + shit + o
// O Melhor ao caixa eletronico (sacar ou depositar)
// Contar

Aluno a = new Aluno();


a.setNome("lu");
System.out.println("nome +" + a.getNome());
Thread.sleep(1000);

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);

Aluno.total = Aluno.total + a.getMedia();


System.out.println("A soma foi :" + Aluno.total);
Thread.sleep(1000);
if (a.getMedia() < 7) {
System.out.println("VAI VENDO !!!");
} else {
System.out.println("Parabens !!!");
}
}
}

Para rodar a classe.

Clique na classe com o botão direito -> run as -> java application

Conta.java
package entity;

import javax.swing.JOptionPane;

public class Conta {

private Integer numeroConta;


private String nome;

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.;

public Integer getNumeroConta() {


return numeroConta;
}

public void setNumeroConta(Integer numeroConta) {


this.numeroConta = numeroConta;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public Double getSaldo() {


return saldo;
}

public void setSaldo(Double saldo) {


this.saldo = saldo;
}
// @entrada de dados

public Double digitarValor() {


String lerValor = JOptionPane.showInputDialog
("entre com o Valor", "");
return new Double(lerValor);
}

public Double getValor() {


return valor;
}

public void setValor(Double valor) {


this.valor = valor;
}

public Double getTotal() {


return total;
}

public void setTotal(Double total) {


this.total = total;
}

public static void main(String[] args) {


Conta c = new Conta();
c.setValor(c.digitarValor());
System.out.println(c.getValor());
}
}

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

Coti Informática https://www.cotiinformatica.com.br


Coti EAD https://www.cotiead.com.br

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

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Jun 22, 2020

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 class Cliente {

private Integer idCliente;


private String nome;

public Cliente() {

public Cliente(Integer idCliente, String nome) {


super();
this.idCliente = idCliente;
this.nome = nome;

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;

public class Numero {

public void print(int a){


System.out.println("Numero" + a);
}

public void print(int a, int b){


System.out.println("Numero" + a);
}

public void print(double a){


System.out.println("Numero" + a);
}
}

Nesse caso ocorre quando herda uma Superclasse

package entity;

public class Numero {

public void print(int a){


System.out.println("Numero" + a);
}

public void print(int a, int b){


System.out.println("Numero" + a);
}

public void print(double a){


System.out.println("Numero" + a);
}
}

package entity;

public class NumeroNatural extends Numero {

public void print(int a, int b, int c ){


System.out.println("Numeros" + a + b + c);
}
}

WWW.COTIINFORMATICA.COM.BR 59
package main;

import entity.NumeroNatural;

public class Main {

public static void main(String[] args) {

NumeroNatural nn = new NumeroNatural();

//Metodos da SuperClasse Numero


nn.print(1);
nn.print(2.);
nn.print(3, 4);

//Metodo da SubClasse NumeroNatural


nn.print(3, 5, 4);
}
}

Polimorfismo

Na programação orientada a objetos, o polimorfismo permite que


referências de tipos de classes mais abstratas representem o
comportamento das classes concretas que referenciam. Assim, um mesmo
método pode apresentar várias formas, de acordo com seu contexto. O
polimorfismo é importante pois permite que a semântica de uma interface
seja efetivamente separada da implementação que a representa. O termo
polimorfismo é originário do grego e significa ‘muitas formas’ (poli =
muitas, morphos = formas).

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.

Na programação orientada a objetos, o polimorfismo permite que


referências de tipos de classes mais abstratas representem o
comportamento das classes concretas que referenciam. Assim, é possível
tratar vários tipos de maneira homogênea (através da interface do tipo mais
abstrato). O termo polimorfismo é originário do grego e significa “muitas
formas” (poli = muitas, morphos = formas).

O polimorfismo é caracterizado quando duas ou mais classes distintas tem


métodos de mesmo nome, de forma que uma função possa utilizar um
objeto de qualquer uma das classes polimórficas, sem necessidade de tratar
de forma diferenciada conforme a classe do objeto.

Uma das formas de implementar o polimorfismo é através de uma classe


abstrata, cujos métodos são declarados mas não são definidos, e através de
classes que herdam os métodos desta classe abstrata.

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:

Todos os métodos de uma interface são implicitamente públicos e


abstratos.

Todos os métodos de uma interface não possuem corpo, apenas


assinatura.

Os Atributos de uma interface são, por definição, constantes, ou seja,


possuem valor final.

Quando uma Classe implementa uma interface, a Classe deverá forecer


corpo para todos os métodos da interface, exceto se a Classe for abstrata.

Uma interface pode herdar de outras interfaces.

Uma classe pode implementar várias interfaces.

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

JOptionPane é uma classe que possibilita a criação de uma caixa de dialogo


padrão que ou solicita um valor para o usuário ou retorna uma informação.
Abaixo encontra-se alguns metodos e parametros mais utilizados quando se
opta pelo JOptionPane.

Métodos

Método Descrição

showConfirmDialog Solicita uma confirmação como(YES, NO, CANCEL)

WWW.COTIINFORMATICA.COM.BR 62
Método Descrição

showInputDialog Solicita algum valor

showMessageDialog Informa ao usuário sobre algo

showOptionDialog Unificação dos tres acima

Parametros

Parametro Descrição

Define a caixa de diálogo onde irá aparece todo o conteúdo. Há du


maneiras de definir a caixa de diálogo a primeira você mesmo cria
parentComponent
utilizando os conceitos da classe JFrame. A segunda, você define e
parametro como null e o java irá gerar uma caixa de diálogo padrã

É a messagem que o usuário deve ler. Esta mensagem pode ser um


message
simples String ou um conjunto de objetos.

Define o estilo da mensagem. O gerente de aparencia pode expor


caixa de dialogo de formas diferentes,dependendo deste valor, po
messageType fornecer um icone padrão. Exemplos: ERROR_MESSAGE -
INFORMATION_MESSAGE - WARNING_MESSAGE -
QUESTION_MESSAGE - PLAIN_MESSAGE

Define o conjunto de botões que irá aparecer na parte inferior da


optionType caixa de diálogo. Exemplos: DEFAULT_OPTION - YES_NO_OPTION
YES_NO_CANCEL_OPTION -

OK_CANCEL_OPTION

Exemplo

1. Mostra um diálogo de erro que exibe a mensagem “alerta”:

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);

3. Mostrar uma janela de aviso com as opções OK, CANCELAR, o texto


‘Aviso’ no título e a mensagem ‘Clique em OK para continuar:

Object[] options = { “OK”, “CANCELAR” };


JOptionPane.showOptionDialog(null, “Clique OK para continuar”,
“Aviso”,
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
null, options, options[0]);

Note que se eu adicionar mais um item no vetor options, automaticamente


adicionar mais um botão de opção com o nome que eu colocar.

Object[] options = { “OK”, “CANCELAR”,”VOLTAR” };


JOptionPane.showOptionDialog(null, “Clique OK para continuar”,
“Aviso”,
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
null, options, options[0]);

WWW.COTIINFORMATICA.COM.BR 64
4. Mostra uma caixa de diálogo solicitando que o usuário digite uma
string:

String inputValue = JOptionPane.showInputDialog (“Please input a


value”);

5. Mostra uma caixa de diálogo solicitando que o usuário selecione uma


item:

Object[] itens = { “MAÇA”, “PERA”, “BANANA” };


Object selectedValue = JOptionPane.showInputDialog(null,
“Escolha um item”, “Opçao”,
JOptionPane.INFORMATION_MESSAGE, null,
itens, itens [0]); //

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 class Endereco {


private Integer codigo;
private String bairro;
private String cidade;

public Endereco() {

public Endereco(Integer codigo, String bairro, String cidade) {


super();
this.codigo = codigo;
this.bairro = bairro;
this.cidade = cidade;
}

@Override
public String toString() {
return "Endereco [codigo=" + codigo + ", bairro=" + bairro
+ ", cidade=" + cidade + "]";
}

public Integer getCodigo() {


return codigo;
}

public void setCodigo(Integer codigo) {


this.codigo = codigo;
}

public String getBairro() {


return bairro;
}

public void setBairro(String bairro) {


this.bairro = bairro;
}

WWW.COTIINFORMATICA.COM.BR 66
public String getCidade() {
return cidade;
}

public void setCidade(String cidade) {


this.cidade = cidade;
}
}
Voltando na classe Funcionario, criar o relacionamento do funcionário com
endereço. Acrescentamos o atributo endereço na classe. Ficando dessa
forma:

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
}

public Funcionario(Integer codigo, String nome, Endereco


endereco) {
super();
this.codigo = codigo;
this.nome = nome;
this.endereco = endereco;
}
Criar um construtor cheio completo, com todos os atributos, incluindo
endereço e criar um outro construtor cheio sem o atributo endereço.

public Funcionario(Integer codigo, String nome) {


super();
this.codigo = codigo;
this.nome = nome;
}
O toString será completo, contendo o endereço, pois é a saída. Imprimirá
funcionário contendo endereço.

@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 Integer getCodigo() {


return codigo;
}
public void setCodigo(Integer codigo) {
this.codigo = codigo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Endereco getEndereco() {
return endereco;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
A classe completa ficará da seguinte forma:

public class Funcionario {


private Integer codigo;
private String nome;
private Endereco endereco;

public Funcionario() {
// TODO Auto-generated constructor stub
}

public Funcionario(Integer codigo, String nome) {


super();
this.codigo = codigo;
this.nome = nome;
}

public Funcionario(Integer codigo, String nome, Endereco endereco) {


super();
this.codigo = codigo;
this.nome = nome;
this.endereco = endereco;
}

@Override
public String toString() {
return "Funcionario [codigo=" + codigo + ", nome=" + nome
+ ", endereco=" + endereco + "]";
}

public Integer getCodigo() {


return codigo;
}

public void setCodigo(Integer codigo) {


this.codigo = codigo;
}

WWW.COTIINFORMATICA.COM.BR 68
public String getNome() {
return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public Endereco getEndereco() {


return endereco;
}

public void setEndereco(Endereco endereco) {


this.endereco = endereco;
}
}
Para testar a classe Funcionario fazer um método main.

public static void main(String[] args) {


Funcionario f1 = new Funcionario(10,"Luciana",new
Endereco(10,"Ipanema","Rio de Janeiro"));

Funcionario f2 = new Funcionario();


f2.setCodigo(11);
f2.setNome("Carolina");
f2.setEndereco(new Endereco(11,"Tijuca","Rio de
Janeiro"));

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;

public class Aluno {


private Integer idAluno;
private String nome;
private String email;
//3 recursos aqui para aumentar minha velocidade

//construtor vazio (set e get)


public Aluno() {

}
//Sonar testa o seu códido ...

//Construtor (cheio não preciso mais utilizar set e get)


public Aluno(Integer idAluno, String nome, String email) {
this.idAluno = idAluno;
this.nome = nome;
this.email = email;
}

@Override

WWW.COTIINFORMATICA.COM.BR 70
public String toString() {
return "Aluno [idAluno=" + idAluno + ", nome=" + nome
+ ", email=" + email + "]";
}

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 getEmail() {


return email;
}

public void setEmail(String email) {


this.email = email;
}
}

Endereco.java
package entity;

public class Endereco {


private Integer idEndereco;
private String bairro;
private String cidade;

// Endereco tem Aluno


// Endereco has a Aluno
//Unidirecional Endereco Visualiza ...
private Aluno aluno;

//2 construtores vazio e o cheio


public Endereco() {
}

//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
+ "]";
}

public Integer getIdEndereco() {


return idEndereco;
}

public void setIdEndereco(Integer idEndereco) {


this.idEndereco = idEndereco;
}

public String getBairro() {


return bairro;
}

public void setBairro(String bairro) {


this.bairro = bairro;
}

public String getCidade() {


return cidade;
}

public void setCidade(String cidade) {


this.cidade = cidade;
}

public Aluno getAluno() {


return aluno;
}

public void setAluno(Aluno aluno) {


this.aluno = aluno;
}

// o relacionamento
//packote main / Classe Main métododo(main)

WWW.COTIINFORMATICA.COM.BR 72
script.sql
mysql -u root -pcoti

create database BDUMNOITE;

use BDUMNOITE;

#1 p 1
create table aluno(idAluno int primary key,
nome varchar (50),
email varchar (50) unique
);

create table endereco(idEndereco int primary key,


bairro varchar (50),
cidade varchar (50),
idAlunofk int,
foreign key(idalunofk) references aluno(idAluno));

#DER (DIAGRAMA DE ENTIDADE RELACIONAL ) _ dados ...

#ao inserir eu tenho que inserir 3 valores ...

#ORM _ (objeto)....Hibernate .... JPA

Visualizando os comando no banco MySql:


create database BDUMNOITE;

use BDUMNOITE;

WWW.COTIINFORMATICA.COM.BR 73
create table aluno(idAluno int primary key,
nome varchar (50),
email varchar (50) unique
);

create table endereco(idEndereco int primary key,


bairro varchar (50),
cidade varchar (50),
idAlunofk int,
foreign key(idalunofk) references aluno(idAluno));

Main.java
package main;

import entity.Aluno;
import entity.Endereco;

public class Main {

public static void main(String[] args) {


//ctrl + shift + o
Aluno a = new Aluno(100,"jose", "jose@gmail.com");
Endereco e = new Endereco(200,"Centro", "Rio de Janeiro",
a);
System.out.println(e); //toString
}
}

WWW.COTIINFORMATICA.COM.BR 74
Para rodar a classe.

Clique na classe com o botão direito -> run as -> java application

Coti Informática https://www.cotiinformatica.com.br


Coti EAD https://www.cotiead.com.br

WWW.COTIINFORMATICA.COM.BR 75
Java WebDeveloper Noite -
Aula 05 (Seg, Qua, Sex)

Tema da aula:
Projeto Orientação a Objetos, SimpleDateFormat

Prof Edson Belém - profedsonbelem@gmail.com Quarta, Jun 24, 2020

Estrutura do projeto feito em aula depois


de finalizado:

WWW.COTIINFORMATICA.COM.BR 76
Autor.java
package entity;

import java.util.List;

public class Autor {

private Integer idAutor;


private String nome;

public Autor() {
}

public Autor(Integer idAutor) {


super();
this.idAutor = idAutor;
this.nome = nome;
}

public Autor(Integer idAutor, String nome) {


this.idAutor = idAutor;
this.nome = nome;
}

@Override
public String toString() {
return "Autor [idAutor=" + idAutor + ", nome=" + nome +
"]";
}

public Integer getIdAutor() {


return idAutor;
}

public void setIdAutor(Integer idAutor) {


this.idAutor = idAutor;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public static void main(String[] args) {

Autor a = new Autor();


a.setIdAutor(10);
a.setNome("luciana");

System.out.println(a.getIdAutor());
System.out.println(a.getNome());

WWW.COTIINFORMATICA.COM.BR 77
}
}

Para rodar a classe.

Clique na classe Aluno.java com o botão direito -> run as -> java
application. Resultado no console.

Pessoa.java
package entity;

public abstract class Pessoa {

public abstract String getDados();


}

Post.java
package entity;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Post {

static transient SimpleDateFormat sdf =


new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

private Integer idPost;

WWW.COTIINFORMATICA.COM.BR 78
private String nome;
private String descricao;
private Date dataPost;

public Post() {
}

public Post(Integer idPost, String nome, String descricao,


Date dataPost) {
this.idPost = idPost;
this.nome = nome;
this.descricao = descricao;
this.dataPost = dataPost;
}

@Override
public String toString() {
return "Post [idPost=" + idPost + ", nome=" + nome
+ ", descricao=" + descricao + ", dataPost="
+ sdf.format(dataPost) + "]";
}

public Integer getIdPost() {


return idPost;
}

public void setIdPost(Integer idPost) {


this.idPost = idPost;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public String getDescricao() {


return descricao;
}

public void setDescricao(String descricao) {


this.descricao = descricao;
}

public Date getDataPost() {


return dataPost;
}

public void setDataPost(Date dataPost) {


this.dataPost = dataPost;
}

public static void main(String[] args) {


Post p1 = new Post(10, "arquitetura", "inovacao", new Date());
Post p2 = new Post(10, "arquitetura", "software", new Date());
Autor a = new Autor(10, "cleber");

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

Prof Edson Belém - profedsonbelem@gmail.com Sexta, Jun 26, 2020

WWW.COTIINFORMATICA.COM.BR 81
Estrutura do projeto feito em aula depois
de finalizado:

Extensão do Chrome para instalar:

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 class Aluno {

private Integer idAluno;


private String nome;
private String email;

//RELACIONAMENTO ONE TO MANY


//UNIDIRECIONAL
private List <Disciplina> disciplinas;

public Aluno() {

public Aluno(Integer idAluno, String nome, String email,


List<Disciplina> disciplinas) {
super();
this.idAluno = idAluno;
this.nome = nome;
this.email = email;
this.disciplinas = disciplinas;
}

//set e get (construtor e cheio) - toString ...

@Override
public String toString() {
return "Aluno [idAluno=" + idAluno + ", nome=" + nome
+ ", email=" + email + ", disciplinas=" + disciplinas +
"]";
}

public Integer getIdAluno() {


return idAluno;
}

public void setIdAluno(Integer idAluno) {


this.idAluno = idAluno;
}

public String getNome() {

WWW.COTIINFORMATICA.COM.BR 84
return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public String getEmail() {


return email;
}

public void setEmail(String email) {


this.email = email;
}

public List<Disciplina> getDisciplinas() {


return disciplinas;
}

public void setDisciplinas(List<Disciplina> disciplinas) {


this.disciplinas = disciplinas;
}
}

Disicplina.java
package entity;

import java.util.ArrayList;
import java.util.List;

public class Disciplina {

private Integer idDisciplina;


private String nomeDiscplina;
private Double nota1;
private Double nota2;
private Double media;

public Disciplina() {
// TODO Auto-generated constructor stub
}

public Disciplina(Integer idDisciplina, String nomeDiscplina,


Double nota1, Double nota2) {
super();
this.idDisciplina = idDisciplina;
this.nomeDiscplina = nomeDiscplina;
this.nota1 = nota1;
this.nota2 = nota2;
}

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 + "]";
}

public Integer getidDisciplina() {


return idDisciplina;
}

public void setidDisciplina(Integer idDisciplina) {


this.idDisciplina = idDisciplina;
}

public String getNomeDiscplina() {


return nomeDiscplina;
}

public void setNomeDiscplina(String nomeDiscplina) {


this.nomeDiscplina = nomeDiscplina;
}

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;
}

public Double getMedia() {


return media;
}

public void setMedia(Double media) {


this.media = media;
}

public void gerarMedia() {

WWW.COTIINFORMATICA.COM.BR 86
}

public static void main(String[] args) {

Disciplina d1 = new Disciplina(10,"java", 6., 8.);


Disciplina d2 = new Disciplina(11,"nodejs", 10., 4.);

List<Disciplina> lista = new ArrayList<Disciplina>();


lista.add(d1);
lista.add(d2);
//(rel)
Aluno a= new Aluno(1000,"jose", "jose@gmail.com",
lista);

System.out.println(a);

// caiu o microfone
}
}

Para rodar a classe:

Clicar na classe Disciplina.java com o botão direito -> run as ->


Java Application

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 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

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Jun 26, 2020

Estrutura do projeto feito em aula depois


de finalizado:

WWW.COTIINFORMATICA.COM.BR 88
Para colocar as bibliotecas no projeto

Clicar no projeto com o botão direito -> properties

WWW.COTIINFORMATICA.COM.BR 89
Clicar em Java Build Path -> Clicar na aba Libraries -> Clicar no
botão Add external jars

Adicionar a biblioteca do gson

WWW.COTIINFORMATICA.COM.BR 90
Adicionar a biblioteca do java-json

Clicar em Apply and Close

WWW.COTIINFORMATICA.COM.BR 91
Aluno.java
package projetoJson;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.json.JSONObject;

public class Aluno {

private Integer idAluno;


private String nome;
private String disciplina;
private Double nota1;
private Double nota2;
private Double media;
private String situacao;

public Aluno() {
}

public Aluno(Integer idAluno, String nome, String disciplina,


Double nota1, Double nota2, Double media, String situacao) {
this.idAluno = idAluno;
this.nome = nome;
this.disciplina = disciplina;
this.nota1 = nota1;
this.nota2 = nota2;
this.media = media;
this.situacao = situacao;
}

static DateTimeFormatter obj = DateTimeFormatter.ofPattern


("dd-MM-yyyy'T'HH:mm:ss");

public String toJSON() throws Exception{


JSONObject objeto =new JSONObject();
try {
objeto.put("idAluno",getIdAluno());
objeto.put("nome",getNome());
objeto.put("disciplina",getDisciplina());
objeto.put("nota1", getNota1());
objeto.put("nota2", getNota2());
objeto.put("media", getMedia());
objeto.put("situacao", getSituacao());
return objeto.toString();
}catch(Exception ex) {
JSONObject error = new JSONObject();
error.put("status",Boolean.FALSE);
error.put("data",obj.format(LocalDateTime.now()) );
error.put("msg", ex.getMessage());
throw new Exception(error.toString());
}
}

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;
}

public void setNota2(Double nota2) {


this.nota2 = nota2;
}
public Double getMedia() {
return media;
}
public void setMedia(Double media) {
this.media = media;
}
public String getSituacao() {
return situacao;
}
public void setSituacao(String situacao) {
this.situacao = situacao;
}

public Aluno validarNota1() {


if (this.nota1>=0 & this.nota1<=10) {
System.out.println("Nota1 Valida");
}else {
throw new IllegalArgumentException
("Fora da Faixa da Nota1");
}
return this;
}

public Aluno validarNota2() {


if (this.nota2>=0 & this.nota2<=10) {
System.out.println("Nota2 Valida");

WWW.COTIINFORMATICA.COM.BR 93
}else {
throw new IllegalArgumentException
("Fora da Faixa da Nota2");
}
return this;
}

//calcular a Media de todos


public Aluno gerarMediaFiltroAprovado() {
this.media = (this.nota1 + this.nota2)/2;
if (this.media <=7) {
throw new IllegalArgumentException
("Parou por Aqui");
}
return this;
}

public Aluno gerarSituacao() {


this.situacao = (this.media >=7)?"aprovado
":"reprovado";
return this;
}

public Aluno getMensagemFinal() {


System.out.println(" Todos Voces Sao Vitoriosos !!!!
(Meus Futuros Arquitetos)");
return this;
}

public static void main(String[] args)throws Exception {


Aluno a=new Aluno();
try {
a = new Aluno(10, "belem", "java", -1., 10., 0., "")
.validarNota1().validarNota2().gerarMediaFiltroAprovado().gerarSituacao()
.getMensagemFinal();
System.out.println(a.toJSON());
}catch(Exception ex) {
System.out.println(a.toJSON());
ex.printStackTrace();
}
}
}

WWW.COTIINFORMATICA.COM.BR 94
Para rodar a classe

Clicar na classe com o botão direito -> run as -> java application

Resultado no console. Deu erro pois a Nota1 é negativa e está fora


da regra.

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 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

Prof Edson Belém - profedsonbelem@gmail.com Sexta, Jul 07, 2020

DAO (Data Access Object)

DAO - Objeto de acesso a dados


Esse padrão tem por finalidade criar uma camada de acesso ao banco de
dados e proporcionando o isolamento da camada de persistência das
demais camadas do projeto. Essa camada e composta pela classe DAO e a
classe que terá os métodos para o CRUD (Inserir, Deletar, Excluir e Lista)
para cada entidade da camada de modelo. No exemplo abaixo a classe

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).

Objeto de acesso a dados (ou simplesmente DAO, acrônimo de Data Access


Object), é um padrão para persistência de dados que permite separar regras
de negócio das regras de acesso a banco de dados. Numa aplicação que
utilize a arquitetura MVC, todas as funcionalidades de bancos de dados, tais
como obter as conexões, mapear objetosJava para tipos de dados SQL ou
executar comandos SQL, devem ser feitas por classes DAO.

A vantagem de usar objetos de acesso a dados é a separação simples e


rigorosa entre duas partes importantes de uma aplicação que não devem e
não podem conhecer quase que nada uma da outra, e que podem evoluir
frequentemente e independentemente. Alterar a lógica de negócio podem
esperar apenas a implementação de uma interface, enquanto que
modificações na lógica de persistência não alteram a lógica de negocio,
desde que a interface entre elas não seja modificada.

 Pode ser usada em uma vasta porcentagem de aplicações;


 Esconde todos os detalhes relativos a armazenamento de dados do
resto da aplicação;
 Atua como um intermediário entre a aplicação e o banco de dados;
 Mitiga ou resolve problemas de comunicação entre a base de dados e
a aplicação, evitando estados inconsistentes de dados.

No contexto específico da linguagem de programação Java, um objeto de


acesso a dados como padrão de projeto de software pode ser
implementado de várias maneiras. Pode variar desde uma simples interface
que separa partes de acesso a dados da lógica de negócio de uma aplicação
até frameworks e produtos comerciais específicos.

O comando Class.forName() é o caminho do driver de comunicação jdbc


com o banco de dados. Cada banco de dados tem o seu driver. A primeira
String do comando DriverManager.getConnection() representa o caminho
do banco de dados, que nesse exemplo do mysql é
jdbc:mysql://localhost:3306/banco. A palavra banco no caminho ao lado tem
referencia ao banco de dados criado no mysql. A segunda String do
comando representa o usuário que irá acessar o banco de dados. A terceira
String do comando representa a senha de acesso ao banco de dados do
usuário escolhido. Após definir a classe de conexão do Banco de Dados, o

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;

public class PessoaDao extends Dao {

public void salvar(Pessoa p) throws Exception {


open();
stmt = con.prepareStatement("insert into pessoa values
(null,?,?)");
stmt.setString(1, p.getNomePessoa());
stmt.setString(2, p.getEmail());
stmt.execute();
stmt.close();
close();
}

public void delete(Pessoa p) throws Exception {

open();
stmt = con.prepareStatement("delete from Pessoa where
idPessoa = ?");
stmt.setInt(1, p.getIdPessoa());
stmt.execute();
stmt.close();
close();

public void update(Pessoa p) throws Exception {

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();

public Pessoa finallByCod(int cod) throws Exception {

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;
}

public List findAll() {


try {
open();
stmt = con.prepareStatement("select * from
pessoa");
rs = stmt.executeQuery();
List lista = new ArrayList();
while (rs.next()) {
Pessoa p = new Pessoa();
p.setIdPessoa(rs.getInt("idPessoa"));

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

# O símbolo # serve para comentar no script.sql

# Comando usado para apagar o banco


# Não utilizado em ambiente de construção de sistemas
drop database if exists aula;

# Comando usado para criar o banco


create database aula;

# Comando usado para acessar o banco


use aula;

# Comando para drop a tabela;


drop table pessoa;

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)
);

A Camada de modelo encontra-se a classe de dados que nesse exemplo é


Pessoa.

package entity;

public class Pessoa {

private Integer idPessoa;


private String nomePessoa;
private String email;

public Pessoa() {
}

public Pessoa(String nomePessoa, String email) {


super();
this.nomePessoa = nomePessoa;
this.email = email;
}

public Pessoa(Integer idPessoa, String nomePessoa, String email) {


super();
this.idPessoa = idPessoa;
this.nomePessoa = nomePessoa;
this.email = email;
}

@Override
public String toString() {
return "Pessoa [idPessoa=" + idPessoa + ", nomePessoa="
+ nomePessoa + ", email=" + email + "]";
}

public Integer getIdPessoa() {


return idPessoa;
}
public void setIdPessoa(Integer idPessoa) {
this.idPessoa = idPessoa;
}
public String getNomePessoa() {
return nomePessoa;
}
public void setNomePessoa(String nomePessoa) {
this.nomePessoa = nomePessoa;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;

WWW.COTIINFORMATICA.COM.BR 100
}
}

public static void main(String[] args) {

//Para testar a Lógica do CRUD


//A chave primaria é null porque no banco de dados está auto
increment
//Quer dizer, chave primaria está sendo incrementa pelo banco.

Pessoa p1 = new Pessoa(null, "jose", "jose@gmail.com");


Pessoa p2 = new Pessoa(null, "joao", "joao@gmail.com");
PessoaDao pd = new PessoaDao();
try {

//Comando para gravar no banco;


pd.create(p1);
pd.create(p2);

//Comando para listaTodos


System.out.println(pd.findAll());

//Comando para alterar uma pessoa;

// 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);

//Comando para listaTodos e verificar a alteração


//Varrendo a lista vinda do findAll
//e imprimindo cada linha
//Classe objeto : lista de valores
for(Pessoa p : pd.findAll()){
System.out.println(p);
}

//Comando para deletar uma pessoa;


//1º Passo : buscar o Codigo
Pessoa pessoa1 = pd.finallByCod(2);
//2º Passo
pd.delete(pessoa1);

//Comando para listaTodos


System.out.println(pd.findAll());

WWW.COTIINFORMATICA.COM.BR 101
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}

Estrutura do projeto feito em aula depois


de finalizado:

WWW.COTIINFORMATICA.COM.BR 102
Bibliotecas utilizadas no projeto:

Usuario.java
package entity;

public class Usuario {


private Integer idUsuario;
private String nome;
private String login;
private String senha;
private Integer status;

public Usuario() {
}

public Usuario(Integer idUsuario, String nome, String login,


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 + "]";
}

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 ...

mysql -u root -pcoti

create database BDUSUNOITE;

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);

set @chave='www.cotiinformatica.com.br#profedsonbelem@gmail.com#1+1=0';

select @chave;

insert into usuario (idusuario, nome, login, senha, status)


values (null,'kleber','kleber@gmail.com',
md5(concat(@chave,'123')),1);
insert into usuario (idusuario, nome, login, senha, status)
values (null,'belem','belem@gmail.com', md5(concat(chave,'123')),1);

delete from usuario where nome='belem';

select * from usuario;

select md5('alo'); # hexadecimal

select concat('java', ' criptografia');

# java criptografia

insert into usuario values


(null,'joao','joao@gmail.com',md5(concat(@chave,'123')),1);

select version();

WWW.COTIINFORMATICA.COM.BR 105
Visualizando os comando no banco MySql:
Criar o banco de dados

create database BDUSUNOITE;

Mostrar todos os bancos nessa maquina. Tenho 373 banco criados na minha
máquina.

show databases;

Entrar no banoc criado

use BDUSUNOITE;

WWW.COTIINFORMATICA.COM.BR 106
Mostrar as tabelas desse banco. Ainda não criamos nada…

show tables;

Criar a tabela usuario.

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);

Criar uma chave para concatenar com a senha

set @chave='www.cotiinformatica.com.br#profedsonbelem@gmail.com#1+1=0';

WWW.COTIINFORMATICA.COM.BR 107
Mostrar a chave criada

select @chave;

Inserindo dados na tabela usuario.

insert into usuario (idusuario, nome, login, senha, status)


values (null,'kleber','kleber@gmail.com',
md5(concat(@chave,'123')),1);
insert into usuario (idusuario, nome, login, senha, status)
values (null,'belem','belem@gmail.com', md5(concat(@chave,'123')),1);

Listando todos os usuarios.

select*from usuario;

WWW.COTIINFORMATICA.COM.BR 108
Deletando o usuario Belem

delete from usuario where nome='belem';

Listando todos os usuarios

select * from usuario;

Mostrando a palavra alo criptografada plo banco.


select md5('alo');

WWW.COTIINFORMATICA.COM.BR 109
Mostrando como se concatena (junta) palavras no banco

select concat('java', ' criptografia');

Inserindo dados na tabela com a chave criada.

insert into usuario values (null,'joao', 'joao@gmail.com', md5(concat


(@chave,'123')),1);

Mostrando a versão do 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;

public class DAO {


//jdbc:oracle:thin:@127.0.0.1:1521/XE

static Connection con;


PreparedStatement stmt;
ResultSet rs;

//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;
}
}

public static void main(String[] args) {


try {
boolean resp =DAO.openOito();
if (resp==true) {
System.out.println("1 primeira vez");
System.out.println(resp == true);
}else {
System.out.println(">1 quantidade de vezes");
System.out.println(resp == false );
}
resp =DAO.openFive();
if (resp==true) {
System.out.println("1 primeira vez");
System.out.println(resp);

WWW.COTIINFORMATICA.COM.BR 111
}else {
System.out.println(">1 quantidade de vezes");
System.out.println(resp );
}
}catch(Exception ex) {
ex.printStackTrace();
}
}
}

Para rodar a classe

Clicar na classe com o botão direito -> run as -> java application

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 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

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Jul 06, 2020

Criptografia MD5

O MD5 (Message-Digest algorithm 5) é uma função de dispersão


criptográfica (ou função hash criptográfica) de 128 bits unidirecional

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.

Em 2008, Ronald Rivest e outros, publicaram uma nova versão do algoritmo


o MD6 com hash de tamanhos 224, 256, 384 ou 512 bits. O algoritmo MD6
iria participar do concurso para ser o novo algoritmo SHA-3, porém logo
depois removeu-o do concurso por considerá-lo muito lento, anunciando
que os computadores de hoje são muito lentos para usar o MD6.

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).

Uma informação não-cifrada que é enviada de uma pessoa (ou organização)


para outra é chamada de “texto claro” (plaintext). Cifragem é o processo de
conversão de um texto claro para um código cifrado e decifragem é o
processo contrário, de recuperar o texto original a partir de um texto
cifrado. De fato, o estudo da criptografia cobre bem mais do que apenas
cifragem e decifragem. É um ramo especializado da teoria da informação
com muitas contribuições de outros campos da matemática e do
conhecimento, incluindo autores como Maquiavel, Sun Tzu e Karl von
Clausewitz. A criptografia moderna é basicamente formada pelo estudo dos
algoritmos criptográficos que podem ser implementados em computadores.

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.

Uma chave é um pedaço de informação que controla a operação de um


algoritmo de criptografia. Na codificação, uma chave especifica a
transformação do texto puro em texto cifrado, ou vice-versa, durante a
decodificação. Chaves são também usadas em outros algoritmos
criptográficos, tais como esquemas de assinatura digital e funções hash
(também conhecidas como MAC), algumas vezes para autenticaçã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.

As chaves usadas na criptografia de chave pública têm uma certa estrutura


matemática. Por exemplo, as chaves públicas usadas no sistema RSA são o
produto de doisnúmeros primos. Por isso, sistemas de chave pública
requerem chaves maiores do que os sistemas simétricos para um nível
equivalente de segurança. 3072bits é o tamanho de chave sugerido para
sistemas baseados em fatoração e algoritmos discretos inteiros que visam
ter segurança equivalente a da cifra simétrica de 128bits. A criptografia de
curva elíptica (CCE) pode permitir chaves de tamanhos menores para uma
segurança equivalente, mas estes algoritmos são conhecidos há pouco
tempo e, pelas estimativas atuais para a dificuldade de se encontrar suas
chaves, eles não devem sobreviver.

Recentemente, uma mensagem codificada usando uma chave de 109bits do


algoritmo de curva elíptica foi quebrada por força bruta. A regra atual é usar
uma chave de CCE com o dobro da segurança da chave simétrica para o
nível desejado. Exceto para o one time pad aleatório, a segurança desses
sistemas não foi provada matematicamente. Portanto, um ponto fraco
teórico poderia fazer de tudo que você codificou um livro aberto. Esta é uma
outra razão para se valorizar a escolha de chaves longas.

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.

Quando uma senha é usada como chave de codificação, os sistemas de


criptografia bem projetados primeiro usam um algoritmo de derivação da
chave, que adiciona um “sal” (salt) e o reduz ou o expande para o tamanho
de chave desejado, por exemplo, através da redução de uma frase longa a
um valor de 128bits apropriado para o uso em umbloco cifrado.

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

Sistemas Free/Open Source

 PGP
 GPG
 SSL
 IPSec / Free S/WAN

Algoritmos assimétricos ou de chave pública

 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.

A Interface tem como objetivo a padronização de métodos para sua


aplicação e o comando para representar a interface é o implements. Ela não
pode ser instanciada e sim implementada por outra classe, entretanto a
classe que a implementa tem que ser concreta. Uma classe pode
implementar varias interfaces. A Interface extends outra interface e uma
classe concreta implements uma ou mais interfaces.

A Interface é um recurso muito utilizado em Java, bem como na maioria das


linguagens orientadas a objeto, para “obrigar” a um determinado grupo de
classes a ter métodos ou propriedades em comum para existir em um
determinado contexto, contudo os métodos podem ser implementados em
cada classe de uma maneira diferente. Pode-se dizer, a grosso modo, que
uma interface é um contrato que quando assumido por uma classe deve ser
implementado.

Dentro das interfaces existem somente assinaturas de métodos e


propriedades, cabendo à classe que a utilizará realizar a implementação das
assinaturas, dando comportamentos práticos aos métodos.

WWW.COTIINFORMATICA.COM.BR 118
package entity1;

public interface IConexao {

public void open() throws Exception;


public void close() throws Exception;
}
.

package entity1;

public interface IArquivo extends Conexao {

public void write() throws Exception;

public String read() throws Exception;

}
.

package entity1;

public class ConexaoBanco implements IConexao {

@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;

public class ConexaoArquivo implements IArquivo {

@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

 nome_classe – Nome da classe a ser implementada.


 nome_Interface – Nome da interface a se implementada pela classe.

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.

Os componentes de software utilizam interfaces padronizadas para criar


uma camada de abstração que facilite a reutilização e a manutenção do
software. Neste cenário, a interface de um módulo de software deve ser
mantida em separado da sua implementação e qualquer outro módulo , que
interaja com (cliente de ), deve ser forçado a fazê-lo apenas através da
interface. Este mecanismo permite que no caso de uma alteração em , o
módulo continue funcionando; desde que a utilização do módulo pelo
módulo satisfaça as especificações da interface. (Ver também oprincípio da
substituição de Liskov).

Uma interface disponibiliza tipos variados de acesso entre componentes,


como por exemplo: constantes, tipos de dado, procedimentos, especificaçã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.

Algumas linguagens de programação orientadas a objeto exigem que a


interface do objeto seja especificada de forma separada da implementação
do objeto, enquanto outras não fazem esta exigência. Por exemplo, em
linguagens de programação como Objective-C, a classe do objeto define a
sua interface e é declarada em um arquivo de cabeçalho (header em inglês)
e, por outro lado, a implementação da classe é mantida em um arquivo
chamado de “arquivo fonte”. Devido à tipagem dinâmica existente na
Objective-C, que permite o envio de mensagens para qualquer objeto, a
interface de uma classe é importante para determinar para quais métodos
um objeto de uma classe responde.

A linguagem de programação Java, que recebeu influência da Objective-C,


utiliza outra abordagem para o conceito de interface, assim como outras
linguagens orientadas a objeto, onde a interface especifica um conjunto de
métodos ou funcionalidades comuns a um conjunto de classes. Ver interface
na linguagem Java.

Algumas linguagens de programação como D, Java e Logtalk, por exemplo,


permitem a definição de “hierarquias de interfaces”. A linguagem Logtalk
também suporta a implementação “privada” e “protegida” dos métodos de
uma interface.

A linguagem Eiffel inclui na interface de uma classe as pré e pós-condições


para execução dos seus métodos. Esta característica é essencial para a
metodologia do projeto por contrato, e pode ser entendida como uma
extensão das condições impostas pelos tipos dos argumentos. Estas regras

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.

Como gerar um JavaDoc


Javadoc é um gerador de documentação criado pela Sun Microsystems para
documentar a API dos programas em Java, a partir do código-fonte. O
resultado é expresso emHTML. É constituído, basicamente, por algumas
marcações muitos simples inseridas nos comentários do programa. Este
sistema é o padrão de documentação de classes em Java, e muitas dos IDEs
desta linguagem irão automaticamente gerar um Javadoc em HTML. Ele
também provê uma API para a criação de doclets e taglets, que permitem a
análise da estrutura de um aplicativo Java. É assim, por exemplo, que o JDiff
consegue gerar relatórios de alterações feitas entre duas versões de uma
API.

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

@author Nome do desenvolvedor

Você pode criar categorias para seus códigos, como


@category
“utilidades” ou “maipulação” ou “services”, etç,

WWW.COTIINFORMATICA.COM.BR 122
Tag Descrição

Marca o método como deprecated. Algumas IDEs exibirão um


@deprecated
alerta de compilação se o método for chamado.

Documenta uma exceção lançada por um método — veja


@exception
também @throws.

Possibilita a definição de um link para um outro documento


@link
local ou remoto através de um URL.

Define um parâmetro do método. Requerido para cada


@param
parâmetro.

Documenta o valor de retorno. Essa tag não deve ser usada


@return para construtores ou métodos definidos com o tipo de
retorno void.

@see Documenta uma associação a outro método ou classe.

@since Documenta quando o método foi adicionado a a classe.

Documenta uma exceção lançada por um método. É um


@throws
sinônimo para a @exception introduzida no Javadoc 1.2.

@version Exibe o número da versão de uma classe ou um método.

Cria um link para uma classe ou método, o nome da classe ou


{@link XX}
método deve ser colocado no lugar das letras “XX”

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:

Bibliotecas utilizadas no projeto:

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 class Usuario {


private Integer idUsuario;
private String nome;
private String login;
private String senha;
private Integer status;

public Usuario() {
}

public Usuario(Integer idUsuario, String nome, String login,

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 + "]";
}

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;
}
}

script.sql
# linha de comando ...

mysql -u root -pcoti

create database BDUSUNOITE;

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;

insert into usuario (idusuario, nome, login, senha, status)


values (null,'kleber','kleber@gmail.com',
md5(concat(@chave,'123')),1);
insert into usuario (idusuario, nome, login, senha, status)
values (null,'belem','belem@gmail.com', md5(concat(chave,'123')),1);

delete from usuario where nome='belem';

select * from usuario;

select md5('alo'); # hexadecimal

select concat('java', ' criptografia');

# java criptografia

insert into usuario values (null,'joao', 'joao@gmail.com',


md5(concat(@chave,'123')),1);

select version();

DAO.java
package persistence;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DAO {

static Connection con;

WWW.COTIINFORMATICA.COM.BR 127
PreparedStatement stmt;
ResultSet rs;

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;
}
}

/*
* (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
*
*
**/

public static void main(String[] args) {


try {
System.out.println(DAO.openFive());
System.out.println(DAO.openFive());
}catch(Exception ex) {
ex.printStackTrace();
}
}
}

Para rodar a classe

WWW.COTIINFORMATICA.COM.BR 128
Clicar na classe com o botão direito -> run as -> java application

UsuarioDao.java
package persistence;

import entity.Usuario;

public interface UsuarioDao {


/**
* Método utilizado para Gravacao
*/
public void criarUsuario(Usuario u)throws Exception;
}

UsuarioDaoImpl.java
package persistence;

import entity.Usuario;

public class UsuarioDaoImp extends DAO implements UsuarioDao{

@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

Clicar em Project -> Generate Javadoc

WWW.COTIINFORMATICA.COM.BR 130
Clicar em configure -> Indicar onde se encontra o comando do
javadoc -> abrir

Marcar a classe que servirá de base para o javadoc -> clicar em


browser e indicar onde será salvo os arquivos gerados -> next (nesse
exemplo cliquei no projeto)

WWW.COTIINFORMATICA.COM.BR 131
Next

Alterar o JRE para 1.8 -> finish

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

Foi criado a documentação em HTML

WWW.COTIINFORMATICA.COM.BR 134
Clicando no link dados

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 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

Prof Edson Belém - profedsonbelem@gmail.com Quarta, Jul 08, 2020

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 class Usuario {


private Integer idUsuario;
private String nome;
private String login;
private String senha;
private Integer status;

public Usuario() {
}

public Usuario(Integer idUsuario, String nome, String login,


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 + "]";
}

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() {

WWW.COTIINFORMATICA.COM.BR 139
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}

script.sql
# linha de comando ...

mysql -u root -pcoti

create database BDUSUNOITE;

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;

insert into usuario (idusuario, nome, login, senha, status)


values (null,'kleber','kleber@gmail.com',
md5(concat(@chave,'123')),1);

insert into usuario (idusuario, nome, login, senha, status)


values (null,'belem','belem@gmail.com', md5(concat(chave,'123')),1);

delete from usuario where nome='belem';

select * from usuario;

select md5('alo'); # hexadecimal

select concat('java', ' criptografia');


# java criptografia

insert into usuario values


(null,'joao','joao@gmail.com',md5(concat(@chave,'123')),1);

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;

public class DAO {

static Connection con;


PreparedStatement stmt;
ResultSet rs;

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;
}
}

/*
* (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
*
*
**/

public static void main(String[] args) {


try {
System.out.println(DAO.openFive());
System.out.println(DAO.openFive());
}catch(Exception ex) {
ex.printStackTrace();
}
}

WWW.COTIINFORMATICA.COM.BR 141
}

Para rodar a classe

Clicar na classe DAO.java com o botão direito -> run as -> java
application

UsuarioDao.java
package persistence;

import entity.Usuario;

public interface UsuarioDao {

public void criarUsuario(Usuario u)throws Exception;


}

UsuarioDaoImp.java
package persistence;

import entity.Usuario;

public class UsuarioDaoImp extends DAO implements UsuarioDao{

private String chave="www.cotiinformatica.com.br#


profedsonbelem@gmail.com#1+1=0";

@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();
}

public static void main(String[] args) {


UsuarioDaoImp udao = new UsuarioDaoImp();
Usuario u = new Usuario
(null,"belem","belem@gmail.com","123",1);
try {
udao.criarUsuario(u);
System.out.println("Dados Gravados ");

}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;

public class ManagerBeanUsuario {

public static List<Usuario> usuarios = new ArrayList<Usuario>();


static {
usuarios.add(new Usuario
(1, "jose", "jose@gmail.com", "123", 1));
usuarios.add(new Usuario
(2, "belem", "jose@gmail.com", "123", 1));

WWW.COTIINFORMATICA.COM.BR 143
usuarios.add(new Usuario
(3, "cleber", "cleber@gmail.com", "123", 1));
}

public void adicionar(Usuario u) {


usuarios.add(u);
}

// 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;
}

public List<String> buscarTodosLoginsESenha() {


List<String> resp = usuarios.stream().map(u ->
u.getLogin()
+ "," + u.getSenha()).collect(Collectors.toList());
return resp;
}

public Integer quantidade() {


return usuarios.size();
}

public static void main(String[] args) {


ManagerBeanUsuario obj = new ManagerBeanUsuario();
try {
obj.adicionar(new Usuario(4, "max", "max@gmail.com", "123", 1));
obj.adicionar(new Usuario(5, "carol", "carol@gmail.com", "123",
1));
System.out.println(obj.buscarCodigo(2));

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 (...)

// projeto unico ... (versionamento) ...


// (projeto 1 versionado)..
}
}

WWW.COTIINFORMATICA.COM.BR 144
Rodando a classe

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 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

Prof Edson Belém - profedsonbelem@gmail.com Sexta, Jul 10, 2020

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;

public interface IFuncionario {

public void calcularSalario();


}

Funcionario.java
package entity;

import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;

import com.google.gson.Gson;

public abstract class Funcionario {

WWW.COTIINFORMATICA.COM.BR 148
// nao gera Objeto (instancia)

private Integer idFuncionario;


private String nome;
private String setor;
private LocalDate dataCadastro;
private Double salarioBruto;
private Double salarioLiquido;

public Funcionario(Integer idFuncionario, String nome,


String setor, LocalDate dataCadastro, Double salarioBruto,
Double salarioLiquido) {
this.idFuncionario = idFuncionario;
this.nome = nome;
this.setor = setor;
this.dataCadastro = dataCadastro;
this.salarioBruto = salarioBruto;
this.salarioLiquido = salarioLiquido;
}

public Funcionario() {
}

@Override
public String toString() {
return "Funcionario [idFuncionario=" + idFuncionario
+ ", nome=" + nome + ", setor=" + setor + ", dataCadastro="
+ dataCadastro + ", salarioBruto=" + salarioBruto
+ ", salarioLiquido=" + salarioLiquido + "]";
}

public String toJson(Object obj) {


return new Gson().toJson(obj);
}

public abstract void contratoCalcularSalario();

public Integer getIdFuncionario() {


return idFuncionario;
}

public void setIdFuncionario(Integer idFuncionario) {


this.idFuncionario = idFuncionario;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public String getSetor() {


return setor;
}

public void setSetor(String setor) {

WWW.COTIINFORMATICA.COM.BR 149
this.setor = setor;
}

public LocalDate getDataCadastro() {


return dataCadastro;
}

public void setDataCadastro(LocalDate dataCadastro) {


this.dataCadastro = dataCadastro;
}

public Double getSalarioBruto() {


return salarioBruto;
}

public void setSalarioBruto(Double salarioBruto) {


this.salarioBruto = salarioBruto;
}

public Double getSalarioLiquido() {


return salarioLiquido;
}

public void setSalarioLiquido(Double salarioLiquido) {


this.salarioLiquido = salarioLiquido;
}

//
// 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 class Estagiario extends Funcionario {

public Estagiario() {
super();
}

public Estagiario(Integer idFuncionario, String nome,


String setor, LocalDate dataCadastro, Double salarioBruto,
Double salarioLiquido) {
super(idFuncionario, nome, setor, dataCadastro,
salarioBruto, salarioLiquido);
}

@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() + "]";
}

public static void main(String[] args) {


Estagiario estagiario = new Estagiario
(10, "jose", "programacao", LocalDate.of(2020, 10, 20), 0., 0.);
estagiario.contratoCalcularSalario();
System.out.println(estagiario);

}
}

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;

public class JSONFormate {

public String getConversao(Object obj) {


return new Gson().toJson(obj);
}

public Object getConversaoDados(Estagiario est) throws Exception {


JsonObject json = new JsonObject();
json.addProperty("nome", est.getNome());
json.addProperty("salario", est.getSalarioBruto());
List<String> desempenho = new ArrayList<String>();
desempenho.add("fraco");
desempenho.add("medio");
json.addProperty("desempenho", new Gson().toJson
(desempenho));
json.addProperty("regra-salario", "sl ="
+ est.getSalarioLiquido() + "-" + est.getSalarioBruto());
return json;
}

public static void main(String[] args) {

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();
}
}
}

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 153
Java WebDeveloper Noite -
Aula 12 (Seg, Qua, Sex)

Tema da aula:
Projeto JSP, Dao, Gravar, login, MySql

Prof Edson Belém - profedsonbelem@gmail.com Quarta, Jul 15, 2020

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.

Para implantar e executar JavaServer Pages, um servidor web compatível


com um container servlet, como Apache Tomcat, Jetty ou Glassfish, é
requerido. Por ser baseada na linguagem de programação Java, tem a
vantagem da portabilidade de plataforma, que permite a sua execução em
diversos sistemas operacionais, como oWindows da Microsoft, Unix e Linux.

Esta tecnologia permite ao desenvolvedor de páginas para Internet produzir


aplicações que acessem o banco de dados, manipulem arquivos no formato
texto, capturem informações a partir de formulários e captem informações
sobre o visitante e sobre o servidor.

Uma página criada com a tecnologia JSP, após instalada em um servidor de


aplicação compatível com a tecnologia Java EE, é transformada em um
Servlet.
WWW.COTIINFORMATICA.COM.BR 154
A arquitetura JSP
Arquitetonicamente, a JSP pode ser vista como uma abstração de alto nível
de servlets Java. JSPs são traduzidas em servlets em tempo de execução.
Cada servlet JSP é armazenado em cache e reutilizado até que a JSP original
seja modificada.

JSP pode ser usada independentemente ou como o componente de visão de


um projeto modelo-visão-controlador do lado do servidor, normalmente
com JavaBeans como modelo e servlets Java (ou um framework como o
Apache Struts) como o controlador. Este é um tipo de arquitetura Modelo 2.

JSP permite que o código Java e algumas ações pré-definidas sejam


intercalados com conteúdo de marcação web estático, com a página
resultante sendo compilada e executada no servidor que irá entregar um
documento. As páginas compiladas, assim como as bibliotecas Java
dependentes, utilizam o bytecode Java em vez de um formato de software
nativo. Como qualquer outro programa Java, elas devem ser executadas em
uma máquina virtual Java (JVM), que se integra com o sistema operacional
do host servidor para fornecer um ambiente de plataforma neutra abstrato.
JSPs são normalmente utilizadas para entregar documentos HTML e XML,
mas através do uso de OutputStream, elas também podem proporcionar
outros tipos de dados.

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.

A sintaxe de JSP é uma mistura de dois tipos básicos de conteúdo: scriptlet


elements e markup. Markup é tipicamente um padrão HTML ou XML,
enquanto os elementos scriptlet são blocos de código Java os quais podem
ser unidos com o tipo de marcação, markup. Quando a página é requisitada
o código Java é executado e sua saída é adicionada, in loco, com o ambiente
de marcação para gerar a página final. Códigos JSP devem ser compiladas
para criação das classes bytecodes antes de serem executadas, mas essa
compilação é necessária apenas quando é feita uma mudança no código.

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 --
%>

Este comentário só aparece do lado do servidor, não aparecendo por isso no


código-fonte do browser !!

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:

 Page - processa informação para esta página. Existem 11 atributos


opcionais. Sintaxe:

<%@ page atributo=”valor” %>

 Include – arquivos para serem incluidos. Sintaxe:

<%@ include file=”pagina.jsp” %>

 Taglib - Define uma biblioteca a ser usada. Precisa de um prefixo e de


um url: Sintaxe:

WWW.COTIINFORMATICA.COM.BR 157
<%@ taglib prefix = "prefixo" uri = "taglib.tld" %>
4 - Scriptlet tag
Todo o código entre <% %> é chamado de scriptlet. Sintaxe:

<% …código %>


5 - Action tag
Esta tag tem como principais funcionalidades:

 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:

Bibliotecas utilizadas no projeto:

Usuario.java
package entity;

public class Usuario {

private Integer idUsuario;


private String login;
private String senha;

public Usuario() {

WWW.COTIINFORMATICA.COM.BR 159
}

public Usuario(Integer idUsuario, String login, String senha) {


super();
this.idUsuario = idUsuario;
this.login = login;
this.senha = senha;
}

@Override
public String toString() {
return "Usuario [idUsuario=" + idUsuario + ", login="
+ login + ", senha=" + senha + "]";
}

public Integer getIdUsuario() {


return idUsuario;
}
public void setIdUsuario(Integer idUsuario) {
this.idUsuario = idUsuario;
}
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;
}
}

scritp.sql
mysql -u root -pcoti
create database BDDOISB;

use BDDOISB;

# drop table usuario;


create table usuario(idUsuario int primary key auto_increment,
login varchar (50) unique,
senha varchar (250)
);

show tables;

desc usuario;

WWW.COTIINFORMATICA.COM.BR 160
Visualizando os comando no banco
create database BDDOISB;

use BDDOISB;

create table usuario(idUsuario int primary key auto_increment,


login varchar (50) unique,
senha varchar (250)
);

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;

public class DAO {

public static Connection conn;


PreparedStatement stmt;
ResultSet rs;

public static void open() throws Exception {


Class.forName("com.mysql.jdbc.Driver");
if (conn==null) {
conn = DriverManager.getConnection

("jdbc:mysql://localhost:3306/BDDOISB","root","coti");
}

WWW.COTIINFORMATICA.COM.BR 162
}
}

UsuarioDao.java
package persistence;

import entity.Usuario;

public class UsuarioDao extends DAO{

public void create(Usuario u)throws Exception{


open();
stmt = conn.prepareStatement("insert into usuario values
(null,?, md5(?) ) ");
stmt.setString(1, u.getLogin());
stmt.setString(2, u.getSenha());
stmt.execute(); //insert, delete, update
stmt.close();
}

public Usuario login(Usuario u)throws Exception{


open();
stmt =conn.prepareStatement
("select * from usuario where login=? and
senha=md5(?)");
stmt.setString(1, u.getLogin()); //entrada do usuario
stmt.setString(2, u.getSenha());
rs = stmt.executeQuery(); //true false
Usuario resposta=null;
if (rs.next()) {
resposta = new Usuario(rs.getInt("idUsuario"),
rs.getString(2),rs.getString(3));
}
return resposta;
}

public static void main(String[] args) {

Usuario u = new Usuario(null, "belem@gmail.com","123456");


try {
UsuarioDao dao =new UsuarioDao();
dao.create(u);
System.out.println("dados gravados");
}catch(Exception ex) {
ex.printStackTrace();
}
}
}

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.

Verificando no banco se foi gravado.


select * from usuario;

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 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

Prof Edson Belém - profedsonbelem@gmail.com Sexta, Jul 17, 2020

WWW.COTIINFORMATICA.COM.BR 165
Criando um Dynamic Web Project

Clicar no menu file new dynamic web Project

Digitar o nome do projeto Clicar em new runtime

WWW.COTIINFORMATICA.COM.BR 166
Download do Apache TomCat

Selecionar o Apache TomCat -> next

Clicar em browser para indicar onde está o 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

No menu do Eclipe clicar em File Import.

WWW.COTIINFORMATICA.COM.BR 171
Selecionar “war file” next.

Clicar em browser para indicar onde se encontra o arquivo a ser importado.

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.

Frameworks CSS oferecem diferentes módulos e ferramentas:

Redefinição da folha de estilo

Grid especialmente para o design responsivo

Tipografia web

Conjunto de ícones em sprites ou fontes de ícone

Styling para tooltips, botões, elementos de formulários

Partes de interfaces gráficas como o acordeão, guias, slideshow ou

WWW.COTIINFORMATICA.COM.BR 174
janelas modais (Luz)

Equalizador para criar conteúdo de altura igual

Frameworks maiores usam intérpretes CSS como LESS ou SASS.

Bootstrap - https://getbootstrap.com/

Desenvolvido pela equipe do Twitter, o Bootstrap é um framework front-end


de código aberto (opensource). Em palavras simples, é um conjunto de
ferramentas criadas para facilitar o desenvolvimento de sites e sistemas web.
Compatível com HTML5 e CSS3, o framework possibilita a criação de layouts
responsivos e o uso de gris, permitindo que seu conteúdo seja organizado
em até 12 colunas e que comporte-se de maneira diferente para cada
resolução. Como qualquer outra ferramenta, possui suas vantagens e
desvantagens. É importante conhecer e entender suas funcionalidades para
saber os momentos certos de utilizá-lo.

Vantagens:

Possui documentação detalhada e de fácil entendimento;

É otimizado para o desenvolvimento de layouts responsivos;

Possui componentes suficientes para o desenvolvimento de qualquer


site ou sistema web com interface simples;

Facilita a criação e edição de layouts por manter padrões;

WWW.COTIINFORMATICA.COM.BR 175
Funciona em todos os navegadores atuais (Chrome, Safari, Firefox, IE,
Opera).

Desvantagens:

Seu código terá de seguir os “padrões de desenvolvimento Bootstrap”;

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).

A estrutura é simples e seu pacote contém três tipos diferentes de arquivos


(CSS, JavaScrpipt e Fonts), que vêm devidamente organizados em suas
pastas. Montar um layout é simples e rápido utilizando sua documentação.
Como toda a estrutura do CSS já vem definida, basta procurar o
componente necessário e adicionar seu código. Em poucos minutos seu
layout toma forma e está pronto para uso! E o mesmo acontece com o
JavaScript.

WWW.COTIINFORMATICA.COM.BR 176
Estrutura do projeto feito em aula depois
de finalizado:

Bibliotecas utilizadas no projeto:

WWW.COTIINFORMATICA.COM.BR 177
Usuario.java
package entity;

public class Usuario {

private Integer idUsuario;


private String login;
private String senha;

public Usuario() {
}

public Usuario(Integer idUsuario, String login, String senha) {


super();
this.idUsuario = idUsuario;
this.login = login;
this.senha = senha;
}

@Override
public String toString() {
return "Usuario [idUsuario=" + idUsuario + ", login="
+ login + ", senha=" + senha + "]";
}

public Integer getIdUsuario() {


return idUsuario;
}
public void setIdUsuario(Integer idUsuario) {
this.idUsuario = idUsuario;
}
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;
}
}

WWW.COTIINFORMATICA.COM.BR 178
script.sql
mysql -u root -pcoti
create database BDDOISB;

use BDDOISB;

# drop table usuario;


create table usuario(idUsuario int primary key auto_increment,
login varchar (50) unique,
senha varchar (250)
);

show tables;

desc usuario;

DAO.java
package persistence;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DAO {

public static Connection conn;


PreparedStatement stmt;
ResultSet rs;

public static void open() throws Exception {


Class.forName("com.mysql.jdbc.Driver");
if (conn == null) {
conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/BDDOISB", "root", "coti");
}
}
}

WWW.COTIINFORMATICA.COM.BR 179
UsuarioDao.java
package persistence;

import entity.Usuario;

public class UsuarioDao extends DAO {

public void create(Usuario u) throws Exception {


open();
stmt = conn.prepareStatement("insert into usuario values
(null,?," + " md5(?) ) ");
stmt.setString(1, u.getLogin());
stmt.setString(2, u.getSenha());
stmt.execute(); // insert, delete, update
stmt.close();
}

public Usuario login(Usuario u) throws Exception {


open();
stmt = conn.prepareStatement("select * from usuario where
login=? and senha=md5(?)");
stmt.setString(1, u.getLogin()); // entrada do usuario
stmt.setString(2, u.getSenha());
rs = stmt.executeQuery(); // true false
Usuario resposta = null;
if (rs.next()) {
resposta = new Usuario(rs.getInt("idUsuario"),
rs.getString(2), rs.getString(3));
}
return resposta;
}

public static void main(String[] args) {


// Fraude

Usuario u = new Usuario(null, "belem@gmail.com", "123456");


try {

//Essa é a camada mais importante de um sistema ...


UsuarioDao dao = new UsuarioDao();
dao.create(u);
System.out.println("dados gravados");
Usuario resp = dao.login(u);
if (resp != null) {
System.out.println("Logado com Sucesso"
+ resp);
} else {
throw new Exception("Usuario Nao Encontrado");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

WWW.COTIINFORMATICA.COM.BR 180
Bibliotecas online

Para ver os componentes do Bootstrap


https://getbootstrap.com/docs/4.5/components/buttons/

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>

<div class="col-md-6 offset-md-3">


<div class="card shadow border-info">
<div class="card-header text-center bg-info">
Formulário de Cadastro
</div>
<form method="post" action="#">
<div class="card-body">
<label>Login:</label>
<input type="text" name="login" placeholder="Digite seu
email"
class="form-control" required="required">

WWW.COTIINFORMATICA.COM.BR 182
<label>Senha:</label>
<input type="password" name="senha"
placeholder="Digite sua senha"
class="form-control" required="required">

<button type="submit" class="btn btn-info btn-sm mt-3">


Gravar</button>
</div>
</form>
<div class="card-footer">
${msg}
</div>
</div>
</div>
</div>
</body>
</html>

Para rodar a página


Clicar em index.jsp com o botão direito -> run as -> run on server

WWW.COTIINFORMATICA.COM.BR 183
Selecionar o Tomcat 8.0 -> NEXT

Clicar em Browser para indicar onde está o diretorio com o Tomcat

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

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 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

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Jul 20, 2020

Web service

Web service é uma solução utilizada na integração de sistemas e na


comunicação entre aplicações diferentes. Com esta tecnologia é possível

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.

Para as empresas, os Web services podem trazer agilidade para os processos


e eficiência na comunicação entre cadeias de produção ou de logística. Toda
e qualquer comunicação entre sistemas passa a ser dinâmica e
principalmente segura, pois não há intervenção humana.

Essencialmente, o Web Service faz com que os recursos da aplicação do


software estejam disponíveis sobre a rede de uma forma normalizada.
Outras tecnologias fazem a mesma coisa, como por exemplo, os browsers da
Internet acessam às páginas Web disponíveis usando por norma as
tecnologias da Internet, HTTP e HTML. No entanto, estas tecnologias não
são bem sucedidas na comunicação e integração de aplicações. Existe uma
grande motivação sobre a tecnologia Web Service pois possibilita que
diferentes aplicações comuniquem - se entre si e utilizem recursos
diferentes.

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.

Os Web Services são identificados por um URI (Uniform Resource Identifier),


descritos e definidos usando XML (Extensible Markup Language). Um dos
motivos que tornam os Web Services atractivos é o facto deste modelo ser
baseado em tecnologias standards, em particular XML e HTTP (Hypertext
Transfer Protocol). Os Web Services são utilizados para disponibilizar
serviços interactivos na Web, podendo ser acessados por outras aplicações
usando, por exemplo, o protocolo SOAP (Simple Object Access Protocol).

O objetivo dos Web Services é a comunicação de aplicações através da


Internet. Esta comunicação é realizada com intuito de facilitar a EAI
(Enterprise Application Integration) que significa a integração das aplicações
de uma empresa, ou seja, interoperabilidade entre a informação que circula
numa organização nas diferentes aplicações como, por exemplo, o comércio
electrónico com os seus clientes e seus fornecedores. Esta interação
constitui o sistema de informação de uma empresa. E para além da

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.

Segundo o W3C (World Wide Web Consortium) um Web Service define-se


como: um sistema de software projectado para suportar a interoperabilidade
entre máquinas sobre rede.

Tem uma relação descritiva num formato machine-processable,


especificamente WSDL (Webservice Description Language).
Outros sistemas interagem com o Web Service usando as mensagens SOAP,
tipicamente sobre HTTP com XML na junção com outros standards da Web.

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;

Privacidade (todas as mensagens trocadas entre o servidor e o


cliente não são interceptadas por uma pessoa não autorizada);

Integridade (as mensagens enviadas tanto pelo servidor ao cliente,


como o contrário, devem permanecer inalteradas).

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

A quantidade de dispositivos que surgem e são utilizados por consumidores


tem aumentado de forma significativa, e criar sistemas que possuem uma
única interface gráfica (GUI) pode não fazer tanto sentido como um
tempo atrás.As APIs RESTful nos permite desenvolver funcionalidades de
forma desacoplada das nossas GUIs, o que nos deixa capazes de criar um
mesmo conjunto de regras de negócios para vários dispositivos. Além disso,
a quantidade de usuários que possuem acesso à Internet é cada vez maior, e
por isso precisamos criar sistemas cada vez mais escaláveis. Pensando em
algumas dessas motivações, neste post iremos discutir alguns conceitos
primordiais e entender um pouco melhor sobre o que de fato é REST.

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:

Você entra com um endereço em seu navegador (Chrome, Firefox,


Edge, etc).

Seu navegador estabelece uma conexão TCP/IP com o servidor de


destino e envia uma requisição GET HTTP com o endereço que você digitou.

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.

A resposta retornada pode ser de sucesso, contendo alguma


representação em formato HTML, ou pode ser algum erro, como por
exemplo o famoso 404 Not Found, que indica que o endereço/recurso que
você solicitou não pôde ser encontrado.

Em caso de sucesso, o seu navegador interpreta o HTML e você


consegue navegar pela página renderizada.

Todo esse processo é repetido enquanto você está navegando em alguma


página Web. Cada link que você clica ou formulário que submete, efetua os
passos que discutimos acima.
Esses elementos são responsáveis por permitirmos criar aplicações Web da
forma que conhecemos hoje, e são esses elementos que vamos detalhar
melhor abaixo.

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.

 1XX – Informações Gerais


 2XX – Sucesso
 3XX – Redirecionamento
 4XX – Erro no cliente
 5XX – Erro no servidor

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).

Sumario das anotações

WWW.COTIINFORMATICA.COM.BR 194
Anotações Descrição

The @Path annotation’s value is a relative URI path


indicating where the Java class will be hosted: for
example, /helloworld. You can also embed variables in
@Path the URIs to make a URI path template. For example, you
could ask for the name of a user and pass it to the
application as a variable in the URI:
/helloworld/{username}.

The @GET annotation is a request method designator


and corresponds to the similarly named HTTP method.
The Java method annotated with this request method
@GET
designator will process HTTP GET requests. The behavior
of a resource is determined by the HTTP method to which
the resource is responding.

The @POST annotation is a request method designator


and corresponds to the similarly named HTTP method.
The Java method annotated with this request method
@POST
designator will process HTTP POST requests. The
behavior of a resource is determined by the HTTP
method to which the resource is responding.

The @PUT annotation is a request method designator


and corresponds to the similarly named HTTP method.
The Java method annotated with this request method
@PUT
designator will process HTTP PUT requests. The behavior
of a resource is determined by the HTTP method to which
the resource is responding.

The @DELETE annotation is a request method designator


and corresponds to the similarly named HTTP method.
The Java method annotated with this request method
@DELETE
designator will process HTTP DELETE requests. The
behavior of a resource is determined by the HTTP
method to which the resource is responding

@HEAD The @HEAD annotation is a request method designator


and corresponds to the similarly named HTTP method.

WWW.COTIINFORMATICA.COM.BR 195
Anotações Descrição

The Java method annotated with this request method


designator will process HTTP HEAD requests. The
behavior of a resource is determined by the HTTP
method to which the resource is responding.

The @PathParam annotation is a type of parameter that


you can extract for use in your resource class. URI path
parameters are extracted from the request URI, and the
@PathParam
parameter names correspond to the URI path template
variable names specified in the @Path class-level
annotation

The @QueryParam annotation is a type of parameter that


you can extract for use in your resource class. Query
@QueryParam
parameters are extracted from the request URI query
parameters

The @Consumes annotation is used to specify the MIME


@Consumes media types of representations a resource can consume
that were sent by the client

The @Produces annotation is used to specify the MIME


@Produces media types of representations a resource can produce
and send back to the client: for example, “text/plain”

The @Provider annotation is used for anything that is of


interest to the JAX-RS runtime, such as
MessageBodyReader and MessageBodyWriter. For HTTP
requests, the MessageBodyReader is used to map an
HTTP request entity body to method parameters. On the
@Provider response side, a return value is mapped to an HTTP
response entity body by using a MessageBodyWriter. If
the application needs to supply additional metadata,
such as HTTP headers or a different status code, a
method can return a Response that wraps the entity and
that can be built using Response.ResponseBuilder

WWW.COTIINFORMATICA.COM.BR 196
Anotações Descrição

The @ApplicationPath annotation is used to define the


URL mapping for the application. The path specified by
@ApplicationPath is the base URI for all resource URIs
@ApplicationPath
specified by @Path annotations in the resource class. You
may only apply @ApplicationPath to a subclass of
javax.ws.rs.core.Application

Estrutura do projeto feito em aula depois


de finalizado:

WWW.COTIINFORMATICA.COM.BR 197
WWW.COTIINFORMATICA.COM.BR 198
Bibliotecas utilizadas no projeto:

WWW.COTIINFORMATICA.COM.BR 199
Usuario.java
package entity;

public class Usuario {

private Integer idUsuario;


private String login;
private String senha;

public Usuario() {
}

public Usuario(Integer idUsuario, String login, String senha) {


super();
this.idUsuario = idUsuario;
this.login = login;
this.senha = senha;
}

@Override
public String toString() {
return "Usuario [idUsuario=" + idUsuario + ", login="
+ login + ", senha=" + senha + "]";
}

public Integer getIdUsuario() {


return idUsuario;
}

public void setIdUsuario(Integer idUsuario) {


this.idUsuario = idUsuario;
}

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;
}
}

WWW.COTIINFORMATICA.COM.BR 200
script.sql
drop database BDDOIS;

create database BDDOIS;

use BDDOIS;

create table usuario(


idUsuario int primary key auto_increment,
login varchar(50),
senha varchar(50)
);

insert into usuario values(1, "belem@gmail.com", "123");

select*from usuario;

Visualizando no banco:
drop database BDDOIS;

create database BDDOIS;

use BDDOIS;

create table usuario(


idUsuario int primary key auto_increment,
login varchar(50),
senha varchar(50)

WWW.COTIINFORMATICA.COM.BR 201
);

insert into usuario values(1, "belem@gmail.com", "123");

select*from usuario;

DAO.java
package persistence;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DAO {

public static Connection conn;


PreparedStatement stmt;
ResultSet rs;

public static void open() throws Exception {


Class.forName("com.mysql.jdbc.Driver");
if (conn == null) {

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;

public class UsuarioDao extends DAO {


public void create(Usuario u) throws Exception {
open();
stmt = conn.prepareStatement("insert into usuario values
(null,?," + " md5(?) ) ");
stmt.setString(1, u.getLogin());
stmt.setString(2, u.getSenha());
stmt.execute(); // insert, delete, update
stmt.close();
}

public Usuario login(Usuario u) throws Exception {


open();
stmt = conn.prepareStatement("select * from usuario
where login=? and senha=md5(?)");
stmt.setString(1, u.getLogin()); // entrada do usuario
stmt.setString(2, u.getSenha());
rs = stmt.executeQuery(); // true false
Usuario resposta = null;
if (rs.next()) {
resposta = new Usuario(rs.getInt("idUsuario"),
rs.getString(2), rs.getString(3));
}
return resposta;
}

public ArrayList<Usuario> findAll() throws Exception {


open();
stmt = conn.prepareStatement("select * from usuario");
rs = stmt.executeQuery();
ArrayList<Usuario> lista = new ArrayList<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>

Para rodar o projeto:

WWW.COTIINFORMATICA.COM.BR 205
Clicar no projeto com o botão direito -> run as -> run on server

Aguardar abrir o browser e digitar a URL


http://localhost:8080/projetoRestUsuario/rest/usuario

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 206
Java WebDeveloper Noite -
Aula 15 (Seg, Qua, Sex)

Tema da aula:
Projeto JSP MVC, Validação dos campos, Controller, Mostrar Dados

Prof Edson Belém - profedsonbelem@gmail.com Quarta, Jul 22, 2020

Estrutura do projeto feito em aula depois


de finalizado:

WWW.COTIINFORMATICA.COM.BR 207
Aluno.java
package entity;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Aluno {


private Integer idAluno;
private String nome; // valida
private String disciplina; // valida
private Double nota1; // valida
private Double nota2; // valida
private Double media = 0.;

public Aluno() {

public Aluno(Integer idAluno, String nome, String disciplina,


Double nota1, Double nota2, Double media) {
super();
this.idAluno = idAluno;
this.nome = nome;
this.disciplina = disciplina;
this.nota1 = nota1;
this.nota2 = nota2;
this.media = media;

WWW.COTIINFORMATICA.COM.BR 208
}

@Override
public String toString() {
return "Aluno [idAluno=" + idAluno + ", nome=" +
nome + ", disciplina=" + disciplina + ", nota1=" + nota1
+ ", nota2=" + nota2 + ", media=" + media + "]";
}

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;
}

public void setNota2(Double nota2) {


this.nota2 = nota2;
}

public Double getMedia() {


return media;
}

public void setMedia(Double media) {


this.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();
}

public Boolean isDisciplina() {


Pattern p =
Pattern.compile("java|angular|node|javascript");
Matcher m = p.matcher(this.disciplina);
return m.matches();
}

public Boolean isNota1() {


if (this.nota1 >= 0 & this.nota1 <= 10) {
return true;
} else {
return false;
}
}

public Boolean isNota2() {


if (this.nota2 >= 0 & this.nota2 <= 10) {
return true;
} else {
return false;
}
}

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;

protected void doGet(HttpServletRequest request,


HttpServletResponse response) throws ServletException, IOException {
}

WWW.COTIINFORMATICA.COM.BR 210
public static int id = 0;

protected void doPost(HttpServletRequest request,


HttpServletResponse response) throws ServletException, IOException {
// view nao fala view

Aluno a = new Aluno();


try {
a.setIdAluno(++id);
a.setNome(request.getParameter("nome"));
a.setDisciplina(request.getParameter("disciplina"));
a.setNota1(new Double(request.getParameter("nota1")));
a.setNota2(new Double(request.getParameter("nota2")));

if (a.isNome() && a.isDisciplina() && a.isNota1() && a.isNota2())


{
a.setMedia((a.getNota1() + a.getNota2()) / 2);
request.setAttribute("msg", "ok Dados Enviados :" + a);
} else {
request.setAttribute("msg", "Dados Invalidos");
}
} catch (Exception ex) {
request.setAttribute("msg", "error :" + ex.getMessage());
} finally {
request.getRequestDispatcher("sistemaaluno.jsp").forward
(request, response);
}
}
}

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

Aguardar abrir o browser

WWW.COTIINFORMATICA.COM.BR 213
Preencher as informações

Clicar em enviar os dados

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 214
Java WebDeveloper Noite -
Aula 16 (Seg, Qua, Sex)

Tema da aula:
Projeto JSP, Junit Teste, Relacionamento OneToMany, Calculo, @Before,
AssertTrue

Prof Edson Belém - profedsonbelem@gmail.com Sexta, Jul 24, 2020

JUNIT Test
https://junit.org/junit5/

É um framework open-source para construção de testes automatizados em


Java, hospedado no Github, em que se verifica as funcionalidades de classes
e seus métodos. Além disso, podemos automatizar também a execução de
todos os testes de forma que quando há uma nova versão estável do

WWW.COTIINFORMATICA.COM.BR 215
sistema, o framework execute todos os testes para garantir a integridade e
estabilidade do que foi desenvolvido.

O jUnit funciona com base em anotações (Annotations) e essas anotações


indicam se um método é de teste ou não, se um método deve ser executado
antes da classe e/ou depois da classe. As anotações também indicam se o
teste deve ou não ser ignorado e se a classe em questão é uma suíte de
teste, ou seja, se a partir desta classe é disparada a execução das demais
classes de teste, entre outras anotações menos utilizadas.

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

Indica que um método é um método de teste.


Diferentemente da @Testanotação do JUnit 4 ,
essa anotação não declara nenhum atributo, pois
@Test as extensões de teste no JUnit Jupiter operam com
base em suas próprias anotações dedicadas. Tais
métodos são herdados, a menos que sejam
substituídos.

Indica que um método é um teste parametrizado.


@ParameterizedTest Tais métodos são herdados, a menos que sejam
substituídos.

Indica que um método é um modelo de teste para


@RepeatedTest um teste repetido. Tais métodos são herdados, a
menos que sejam substituídos.

WWW.COTIINFORMATICA.COM.BR 217
Anotação Descrição

Indica que um método é uma fábrica de testes


@TestFactory para testes dinâmicos. Tais métodos são herdados,
a menos que sejam substituídos.

Indica que um método é um modelo para casos de


teste projetados para serem chamados várias
vezes, dependendo do número de contextos de
@TestTemplate
chamada retornados pelos provedores registrados.
Tais métodos são herdados, a menos que sejam
substituídos.

Usado para configurar a ordem de execução do


método de teste para a classe de teste anotada;
@TestMethodOrder
semelhante ao JUnit 4 @FixMethodOrder. Tais
anotações são herdadas.

Usado para configurar o ciclo de vida da instância


@TestInstance de teste para a classe de teste anotada. Tais
anotações são herdadas.

Declara um nome de exibição personalizado para


@DisplayName a classe ou método de teste. Tais anotações não
são herdadas.

Declara um gerador de nome para exibição


@DisplayNameGeneration personalizado para a classe de teste. Tais
anotações são herdadas.

Denota que o método anotado deve ser


executado antes de cada @Test , @RepeatedTest,
@ParameterizedTest, ou @TestFactorymétodo na
@BeforeEach
classe atual; análogo ao JUnit 4 @Before. Tais
métodos são herdados, a menos que sejam
substituídos.

@AfterEach Denota que o método anotado deve ser


executado após cada @Test , @RepeatedTest,

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.

Denota que o método anotado deve ser


executado antes de tudo @Test , @RepeatedTest,
@ParameterizedTest, e @TestFactorymétodos na
classe atual; análogo ao JUnit 4 @BeforeClass.
@BeforeAll
Esses métodos são herdados (a menos que
estejam ocultos ou substituídos ) e devem ser
static(a menos que o ciclo de vida da instância de
teste “por classe” seja usado).

Denota que o método anotado deve ser


executado depois de tudo @Test ,
@RepeatedTest, @ParameterizedTest, e
@TestFactorymétodos na classe atual; análogo ao
@AfterAll
JUnit 4 @AfterClass. Esses métodos são herdados
(a menos que estejam ocultos ou substituídos ) e
devem ser static(a menos que o ciclo de vida da
instância de teste “por classe” seja usado).

Indica que a classe anotada é uma classe de teste


aninhada não estática . @BeforeAlle
@AfterAllmétodos não podem ser usados
@Nested diretamente em uma @Nestedclasse de teste, a
menos que o ciclo de vida da instância de teste
“por classe” seja usado. Tais anotações não são
herdadas .

Usado para declarar tags para testes de filtragem ,


no nível da classe ou do método; análogo aos
@Tag grupos de teste em TestNG ou Categorias na JUnit
4. Essas anotações são herdadas no nível da
classe, mas não no nível do método.

WWW.COTIINFORMATICA.COM.BR 219
Anotação Descrição

Usado para desativar uma classe ou método de


@Disabled teste; análogo ao JUnit 4 @Ignore. Tais anotações
não são herdadas.

Usado para falhar em um teste, fábrica de teste,


modelo de teste ou método de ciclo de vida se
@Timeout
sua execução exceder uma determinada duração.
Tais anotações são herdadas

Usado para registrar extensões declarativamente .


@ExtendWith
Tais anotações são herdadas.

Usado para registrar extensões


programaticamente por meio de campos. Tais
@RegisterExtension
campos são herdados, a menos que estejam
sombreados.

Usado para fornecer um diretório temporário via


injeção de campo ou injeção de parâmetro em um
@TempDir
método de ciclo de vida ou método de teste;
localizado na org.junit.jupiter.api.ioembalagem.

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 class Aluno {

private Integer idAluno;


private String nomeAluno;
private String disciplina;
private Double media;
// ManyToOne
private Turma turma; // Nasce a chave estrangeira

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 + "]";
}

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 String getDisciplina() {


return disciplina;
}

public void setDisciplina(String disciplina) {


this.disciplina = disciplina;
}

public Double getMedia() {


return media;
}

public void setMedia(Double media) {


this.media = media;
}

public Turma getTurma() {


return turma;
}

public void setTurma(Turma turma) {


this.turma = turma;
}
}

WWW.COTIINFORMATICA.COM.BR 222
Turma.java
package entitty;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Turma {

private Integer idTurma;


private String nomeTurma;
private Date dataInicio;
/**
* Test mediaTurma (soma de todas as Meddias)/quantidade
*/
private Double mediaTurma;
/**
* Test de quantidade de Alunos ..
*/
private List<Aluno> alunos;

public Turma() {
}

public Turma(Integer idTurma, String nomeTurma, Date dataInicio,


Double mediaTurma) {
super();
this.idTurma = idTurma;
this.nomeTurma = nomeTurma;
this.dataInicio = dataInicio;
this.mediaTurma = mediaTurma;
}

@Override
public String toString() {
return "Turma [idTurma=" + idTurma + ", nomeTurma="
+ nomeTurma + ", dataInicio=" + dataInicio + ", mediaTurma="
+ mediaTurma + "]";
}

public Integer getIdTurma() {


return idTurma;
}

public void setIdTurma(Integer idTurma) {


this.idTurma = idTurma;
}

public String getNomeTurma() {


return nomeTurma;
}

public void setNomeTurma(String nomeTurma) {


this.nomeTurma = nomeTurma;

WWW.COTIINFORMATICA.COM.BR 223
}

public Date getDataInicio() {


return dataInicio;
}

public void setDataInicio(Date dataInicio) {


this.dataInicio = dataInicio;
}

public Double getMediaTurma() {


return mediaTurma;
}

public void setMediaTurma(Double mediaTurma) {


this.mediaTurma = mediaTurma;
}

public List<Aluno> getAlunos() {


return alunos;
}

public void setAlunos(List<Aluno> alunos) {


this.alunos = alunos;
}

public void adicionarAluno(Aluno a) {


if (alunos == null) {
this.alunos = new ArrayList<Aluno>();
}
this.alunos.add(a);
}

// null
public Boolean isAlunos() {
if (this.alunos != null) {
return true;
} else {
return false;
}
}

public Integer gerarQuantidade() {


return this.alunos.size();
}

public Double somarMedia() {


this.alunos.forEach(x -> this.mediaTurma += x.getMedia());
return (this.mediaTurma / this.alunos.size());
}
}

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;

public class TestTurma {

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

Resultado no console. Os teste deram certo, todos verdes.

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 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

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Jul 27, 2020

Estrutura do projeto depois de finalizado

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 {

private static final long serialVersionUID = 1L;

@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() {
}

public Livro(Long id, String nomeLivro, Double precoLivro,


String imagem) {
super();
this.id = id;
this.nomeLivro = nomeLivro;
this.precoLivro = precoLivro;
this.imagem = imagem;
}

@Override
public String toString() {
return "Livro [id=" + id + ", nomeLivro=" + nomeLivro
+ ", precoLivro=" + precoLivro + ", imagem=" + imagem +
"]";
}

public Long getId() {


return id;
}

WWW.COTIINFORMATICA.COM.BR 229
public void setId(Long id) {
this.id = id;
}

public String getNomeLivro() {


return nomeLivro;
}

public void setNomeLivro(String nomeLivro) {


this.nomeLivro = nomeLivro;
}

public Double getPrecoLivro() {


return precoLivro;
}

public void setPrecoLivro(Double precoLivro) {


this.precoLivro = precoLivro;
}

public String getImagem() {


return imagem;
}

public void setImagem(String imagem) {


this.imagem = imagem;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

application.properties

Atenção para as linhas 1 e 2, têm que estar juntas. O mesmo para


as linhas 4 e 5.

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 {

public static void main(String[] args) {


SpringApplication.run(Application.class, args);
}
}

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

Abrir o browser e digitar a URL


http://localhost:7744/livro

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 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

Prof Edson Belém - profedsonbelem@gmail.com Quarta, Jul 29, 2020

Comandos para instalar

Instalar o Angular
Este comando instala a versão mais recente

npm install -g @angular/cli


Este comando é para escolher a versão que queremos instalar, colocamos o
“@” e o numero da versão desejada.

npm install -g @angular/cli@8.3.19

WWW.COTIINFORMATICA.COM.BR 234
As versões que estamos usando no curso:

Outros comandos

Verficar a versão do Angular.

ng v

Criar um projeto.

ng new nome_do_projeto

Criação de diretorio e classe


Para criar o diretório:
Clicar com o botão direito em “app” -> new folder -> digitar o nome do

WWW.COTIINFORMATICA.COM.BR 235
diretorio

Para criar a classe:


Clicar com o botão direito em app -> new file…

Node js

WWW.COTIINFORMATICA.COM.BR 236
https://nodejs.org/en/

Node.js é uma plataforma construída sobre o motor JavaScript do Google


Chrome para facilmente construir aplicações de rede rápidas e
escaláveis. Node.js usa um modelo de I/O direcionada a evento não
bloqueante que o torna leve e eficiente, ideal para aplicações em tempo real
com troca intensa de dados através de dispositivos distribuídos.

Node.js é um interpretador, com código aberto, de código JavaScript de


modo assíncrono e orientado a eventos, focado em migrar a programação
do Javascript do lado do cliente para os servidores, criando assim aplicações
de alta escalabilidade (como um servidor web), capazes de manipular
milhares de conexões/requisições simultâneas em tempo real, numa única
máquina física. O Node.js é baseado no interpretador V8 JavaScript Engine
(interpretador de JavaScript open source implementado pelo Google em
C++ e utilizado pelo Chrome). Foi criado por Ryan Dahl em 2009, e seu
desenvolvimento é mantido pela fundação Node.js em parceria com a Linux
Foundation.

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

Uma classe é uma forma de definir um tipo de dado em uma linguagem


orientada a objeto. Ela é formada por dados e comportamentos.

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

A associação de classes indica quando uma classe tem um tipo de


relacionamento “tem um” com outra classe como, por exemplo, uma pessoa
tem um carro e isso indica que a classe Pessoa tem uma associação com a
classe Carro. Esse tipo de relacionamento entre classes é importante, porque
define como as classes interagem entre elas nas aplicações.

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.

Herança é um princípio de orientação a objetos, que permite que classes


compartilhem atributos e métodos, através de “heranças”. Ela é usada na
intenção de reaproveitar código ou comportamento generalizado ou
especializar operações ou atributos. O conceito de herança de várias classes
é conhecido como herança múltipla. Como exemplo pode-se observar as
classes ‘aluno’ e ‘professor’, onde ambas possuem atributos como nome,
endereço e telefone. Nesse caso pode-se criar uma nova classe chamada por
exemplo, ‘pessoa’, que contenha as semelhanças entre as duas classes,
fazendo com que aluno e professor herdem as características de pessoa,
desta maneira pode- se dizer que aluno e professor são subclasses de
pessoa. Também podemos dizer que uma classe pode ser abstrata(abstract)
ou seja ela não pode ter uma instância, ela apenas “empresta” seus atributos
e metódos como molde para novas classes.

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.

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.

Algumas linguagens de programação orientadas a objeto exigem que a


interface do objeto seja especificada de forma separada da implementação
do objeto, enquanto outras não fazem esta exigência. Por exemplo, em
linguagens de programação como Objective-C, a classe do objeto define a
sua interface e é declarada em um arquivo de cabeçalho (header em inglês)
e, por outro lado, a implementação da classe é mantida em um arquivo
chamado de “arquivo fonte”. Devido à tipagem dinâmica existente na
Objective-C, que permite o envio de mensagens para qualquer objeto, a
interface de uma classe é importante para determinar para quais métodos
um objeto de uma classe responde.
A linguagem de programação Java, que recebeu influência da Objective-C,
utiliza outra abordagem para o conceito de interface, assim como outras
linguagens orientadas a objeto, onde a interface especifica um conjunto de

WWW.COTIINFORMATICA.COM.BR 241
métodos ou funcionalidades comuns a um conjunto de classes. Ver interface
na linguagem Java.

Desenvolvimento de Software

Em arquitetura de software há muitas camadas entre o hardware e o usuário


final. Cada uma pode ser dita como tendo um front-end e um back-end. O
front-end é uma abstração, simplificando o componente subjacente pelo
fornecimento de uma interface amigável, como por um exemplo um
navegador de Internet, ou um formulário para um determinado usuário.

Em projetos de software, por exemplo, a arquitetura modelo-visão-


controlador fornece o -end e o back-end para o banco de dados, o usuário e
para os componentes de processamento. A separação de sistemas de
software em front-end e back-end simplifica o desenvolvimento e separa a
manutenção. Uma regra de ouro é que o lado frontal (ou “cliente”) é
qualquer componente manipulado pelo usuário. O código do lado do
servidor (ou back-end) reside no servidor. A confusão surge quando alguém
tem que fazer edições na parte frontal para arquivos do lado servidor.
Muitos projetistas HTML, por exemplo, não precisam estar no servidor
quando eles estão desenvolvendo o HTML. Reciprocamente, engenheiros do
lado servidor, por definição, nunca estão em qualquer coisa, mas num
servidor. Considera-se os dois para, finalmente, fazer um site web funcional
e interativo.

Para subsistemas de computação maiores, um gerenciador de arquivos


gráfico é um front-end para o sistema de arquivos do computador e um

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

Arquitetura Modelo-Visão-Controlador (do inglês: Model-View-Controller


- MVC) é um padrão de arquitetura de software (não confundir com design
pattern) que separa a representação da informação da interação do usuário
com ela. Normalmente usado para o desenvolvimento de interfaces de
usuárioque divide uma aplicação em três partes interconectadas. Isto é feito
para separar representações de informação internas dos modos como a
informação é apresentada para e aceita pelo usuário. O padrão de projeto
MVC separa estes componentes maiores possibilitando a reutilização de
código e desenvolvimento paralelo de maneira eficiente.

O modelo (model) consiste nos dados da aplicação, regras de negócios,


lógica e funções. Uma visão (view) pode ser qualquer saída de represenção
dos dados, como uma tabela ou um diagrama. É possível ter várias visões do
mesmo dado, como um gráfico de barras para gerenciamento e uma visão
tabular para contadores. O controlador (controller) faz a mediação da
entrada, convertendo-a em comandos para o modelo ou visão. As ideias
centrais por trás do MVC são a reusabilidade de código e separação de
conceitos.

Tradicionalmente usado para interfaces gráficas de usuário (GUIs), esta


arquitetura tornou-se popular para projetar aplicações web e até mesmo
para aplicações móveis, para desktop e para outros clientes. Linguagens de
programação populares como Java, C#, Ruby, PHP e outras possuem

WWW.COTIINFORMATICA.COM.BR 243
frameworks MVC populares que são atualmente usados no
desenvolvimentos de aplicações web.

Camada de apresentação ou visualização (View) - Não se dedica em saber


como o conhecimento foi retirado ou de onde ela foi obtida, apenas mostra
a referência. Segundo Gamma et al (2006), ”A abordagem MVC separa a
View e Model por meio de um protocolo inserção/notificação
(subscribe/notify). Uma View deve garantir que sua expressão reflita o
estado do Model. Sempre que os dados do Model mudam, o Model altera as
Views que dependem dele. Em resposta, cada View tem a oportunidade de
modificar-se”. Adiciona os elementos de exibição ao usuário : HTML, ASP,
XML, Applets. É a camada de interface com o usuário. É utilizada para
receber a entrada de dados e apresentar visualmente o resultado.

Camada de lógica da aplicação (Model) - É o coração da execução,


responsável por tudo que a aplicação vai fazer a partir dos comandos da
camada de controle em um ou mais elementos de dados, respondendo a
perguntas sobre o sua condição e a instruções para mudá-las. O modelo
sabe o que o aplicativo quer fazer e é a principal estrutura computacional da
arquitetura, pois é ele quem modela o problema que está se tentando
resolver. Modela os dados e o comportamento por atrás do processo de
negócios. Se preocupa apenas com o armazenamento, manipulação e
geração de dados. É um encapsulamento de dados e de comportamento
independente da apresentação.

Camada de controle (Control) - É responsável por interpretar as ações de


entrada através do mouse e teclado realizadas pelo usuário. O Controle
(Controller) envia essas ações para o Modelo (Model) e para a janela de
visualização (View) onde serão realizadas as operações necessárias.

Arrays, Vetor e Matriz

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.

No geral, os arrays possuem tamanho fixo, ou seja, número de posições


definida; em algumas linguagens de programação, existem estruturas de
arrays que possuem tamanho variável. Vamos estudar aqui os arrays
tradicionais, de tamanho especificado.

Classificação dos arrays


Os arrays são classificados de acordo com a sua dimensão de
armazenamento de dados, como segue:

 Unidimensional: Vetor
 Bidimensional: Matriz
 Tridimensional: Cubo

Uma matriz é uma coleção de variáveis de mesmo tipo, acessíveis com um


único nome e armazenados contiguamente na memória. A individualização
de cada variável de um vetor é feita através do uso de índices.

Os Vetores são matrizes de uma só dimensão.

Um vetor é um array unidimensional, ou seja, de uma única dimensão; é


análogo a uma linha única de dados em uma planilha ou tabela. A figura a
seguir ilustra a estrutura interna de um vetor de quatro posições, que

WWW.COTIINFORMATICA.COM.BR 245
permite portanto armazenar até quatro dados, de nome Notas.

No geral a contagem das posições se inicia em zero (0), de modo que a


primeira posição do vetor será a posição 0, a segunda posição será 1, e
assim por diante; a última posição do vetor será a de número n – 1, onde n é
o número total de posições disponíveis (tamanho do array). Assim, em um
vetor de 4 posições a última posição será 4 – 1 = 3. As posições em um
vetor são sempre indicadas pelo número da posição entre colchetes [ ].

Declaração de vetores
Podemos declarar um vetor em português estruturado usando a seguinte
sintaxe:
nomeVetor: vetor [i…f] de Tipo_Dados
Onde:

 nomeVetor é o nome escolhido para o vetor, que deve seguir as regras de


nomeação de variáveis.
 i = Valor da primeira posição do vetor (preferencialmente zero)
 F = Valor da última posição do vetor (tamanho do vetor – 1)
 Tipo_Dados = tipo dos dados que serão armazenados nas posições do vetor

Declaração de Matrizes

int Vetor[5]; // declara um vetor de 5 posições


int Matriz[5][3]; // declara uma matriz de 5 linhas e 3 colunas
Acesso aos elementos do vetor
Para acessar os elementos de um vetor usa-se índices. O índice define a
posição da variável dentro do vetor. Em todos os vetores tem o primeiro
elemento na posição 0(zero). Assim, se tomarmos “K” como sendo o
tamanho do vetor a última posição é a de índice “K-1”

Vetor[0] = 4; // Coloca 4 na primeira posição de "Vetor"


Vetor[4] = 8; // Coloca 8 na última posição de "Vetor"
Exemplos com Vetores

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

Vetor[0] = 9; // coloca 9 na primeira posição do vetor


Vetor[4] = 30 // coloca 30 na última posição do vetor

Matriz[0][1] = 15; // coloca 15 na célula que está na primeira linha


// e na segunda coluna da matriz

Operador ternário

No desenvolvimento de uma aplicação, é muito comum utilizarmos


estruturas condicionais como, por exemplo, ifs e elses ou switch case.
Porém, em algum momento da nossa vida, provavelmente, um desses testes
que realizamos é tão simples que retorna um valor para apenas duas
possibilidades.

Por exemplo, suponhamos que precisamos criar uma funcionalidade para


gerar uma bonificação e a regra para essa funcionalidade é a seguinte:

 Se o salário for maior que R$ 1000, o bônus é de 10%


 Se o salário for menor ou igual a R$ 1000, o bônus é de 15%

Uma solução seria utilizar um if e else como já conhecemos, como por


exemplo no Java:

WWW.COTIINFORMATICA.COM.BR 247
double salario = 1000;
double bonus = 0.0;

if (salario > 1000) {


bonus = salario * 0.10;
} else {
bonus = salario * 0.15;
}

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%.

Entretanto, perceba que o que estamos fazendo é apenas um teste bem


básico que tem apenas uma única linha de código dentro do if ou do else.
Será que não existe uma maneira mais simples de resolver o mesmo
problema?

Em um cenário similar a esse, podemos também utilizar o operador ternário


que funciona com o mesmo conceito do if e else, porém, a única diferença é
que precisamos devolver um valor após o teste estritamente em uma única
linha!

double salario = 1000;


double bonus = salario * (salario > 1000 ? 0.10 : 0.15);
System.out.println(bonus);
Com esse código acima temos o mesmo resultado de antes, ou seja, 150.0.
Mas como funciona esse operador ternário? A estrutura de um operador
ternário é compreendida da seguinte forma:

Condição? valor se for verdareiro : valor se for falso


Portanto, inicialmente temos um teste (podemos adicionar um teste
qualquer), ou seja, qualquer teste devolve um valor booleano, então,
definimos o primeiro parâmetro que é justamente o valor que será
retornado caso o teste for verdadeiro e o segundo que será retornado caso
for falso!

Justamente pelo fato de realizar essas 3 operações, o chamamos de


operador ternário. Mas isso é só em Java? Não! Diversas linguagens
implementam esse mesmo recurso!

WWW.COTIINFORMATICA.COM.BR 248
Vejamos alguns exemplos:
JavaScript:

var salario = 1000;


var bonus = salario * (salario > 1000 ? 0.10 : 0.15);

Angular

Angular (comumente referido como “Angular 2+” ou “Angular 2”) é uma


plataforma de aplicações web de código-fonte aberto e front-end baseado
em TypeScript liderado pela Equipe Angular do Google e por uma
comunidade de indivíduos e corporações. Angular é uma reescrita completa
do AngularJS, feito pela mesma equipe que o construiu.

Diferenças entre Angular e AngularJS

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.

 Angular não tem um conceito de “escopo” ou controladores, em vez disso,


ele usa uma hierarquia de componentes como o seu principal conceito
arquitetônico.
 Angular tem uma expressão diferente de sintaxe, concentrando-se no uso
de “[ ]” para a propriedade de ligação, e no uso de “( )” para ligação do
evento
 Modularidade – muito das funcionalidades principais foram movidas para os
módulos
 Angular recomenda o uso da linguagem da Microsoft, o TypeScript, que
apresenta as seguintes características:
o É baseado em classes de Programação Orientada a Objeto
o Tipagem Estática
o Programação genérica
 O TypeScript é um superconjunto do ECMAScript 6 (ES6), e é compatível
com ECMAScript 5 (i.e.: JavaScript). Angular também inclui ES6:
o Lambdas
o Iteradores
o For/Of loops
 Carregamento dinâmico
 Modelo de compilação assíncrono
 A substituição de controladores e $escopo com componentes e diretrizes –
um componente é uma directiva com um modelo
 Programação reativa de suporte usando RxJS

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

TypeScript é um superconjunto de JavaScript


Isso significa que o TypeScript estende JavaScript com funcionalidade extra
que não está presente na versão atual do JavaScript suportada pela maioria
dos navegadores. Então, quais são esses recursos?
Se você estiver familiarizado com linguagens como Java ou C #,
provavelmente sabe que cada variável requer um tipo e esse tipo deve ser
declarado antecipadamente . JavaScript é uma linguagem fracamente tipada
ou digitada dinamicamente. As variáveis em JavaScript não estão
diretamente associadas a nenhum tipo de valor específico, e qualquer
variável pode ser atribuída (e reatribuída) a todos os tipos de valores:

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:

[ts] Subsequent variable declarations must have the same type.


Variable ‘foo’ must be of type ‘number’, but here has type ‘boolean’.
A vantagem de uma linguagem fortemente tipada é que você é forçado a
tornar explícito o comportamento do seu programa . Se você quiser
adicionar um número e uma string ao seu código, você deve traduzir a
string em um número a ser usado como um operando do operador de
adição. Isso torna o código mais fácil de entender porque não há
comportamento (ou menos) oculto . Isso também torna seu código mais
detalhado.

Lembrar:

A tipificação forte é opcional no TypeScript, mas o uso desse recurso torna


seu aplicativo mais previsível e facilita a depuração, portanto, você deve
definitivamente usá-lo.

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)

Erro de tempo de compilação


Deixe-me explicar primeiro o que run-time error é como este é um caso
comum. Estamos falando sobre run-time error quando enfrentamos
qualquer problema ao usar nosso aplicativo. Em outras palavras - se você
cometer um erro ao criar seu site e escrever algum código, você o verá
apenas enquanto estiver usando o aplicativo / site. Por exemplo, se você
cometer um erro de digitação em um arquivo de página da Web, o console
do seu navegador mostrará um erro quando você carregar essa página.

Devido à fraca tipagem em JavaScript, muitas vezes acontece que tentamos


realizar operações em uma variável com um tipo diferente. Se a nossa lógica
de aplicativo for complexa, talvez não percebamos que estamos tentando
atribuir elementos de um tipo diferente uns aos outros. Em JavaScript, só
saberemos sobre o erro quando alguém acionar um código e ele falhar . Por
outro lado, o TypeScript pode nos fornecer erros de tempo de compilação, o
que significa que ele pode detectar erros ao compilar código para JavaScript
e corrigi-lo antes de implantar na produção. Claro que não vai pegá-los
todos, mas ainda muito.

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.

var num: number = 30; //variable num is of type number


Abaixo está a lista de tipos primitivos disponíveis no TypeScript:

 Number: “ number” É um tipo de número primitivo em TypeScript. Não


existe um tipo diferente para float ou double no TypeScript
 Boolean: O boolean tipo " " representa true ou false condição
 String: O " string" representa uma seqüência de caracteres semelhantes ao
C#
 Null: “ null” É um tipo especial que atribui null valor a uma variável
 Undefined: O “ undefined” também é um tipo especial e pode ser atribuído
a qualquer variável

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".

Estrutura do projeto Angular depois de


finalizado

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 constructor(idAluno?: number,


nome?: string, nota1?: number,
nota2?: number, disciplina?: string) {
this.idAluno = idAluno;
this.nome = nome;
this.nota1 = nota1;
this.nota2 = nota2;
this.disciplina = disciplina;
}

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 {

public gerarMedia(aluno: Aluno): number {


aluno.media = (+aluno.nota1 + +aluno.nota2) / 2;
return aluno.media;
}

public gerarSituacao(aluno: Aluno): string {


return (aluno.media >= 7) ? "aprovado" : "repovado";
}

WWW.COTIINFORMATICA.COM.BR 257
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';


import { AppComponent } from './app.component';
import { AlunoComponent } from './aluno/aluno.component';
import { AlunoService } from './service/aluno.service';
import { FormsModule } from '@angular/forms';
import { MDBBootstrapModule } from 'angular-bootstrap-md';

@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[] = [];

constructor(private service: AlunoService) {


this.aluno = new Aluno();
}

ngOnInit() {

}
}

Instalar o Material Design Bootstrap


https://mdbootstrap.com/

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/

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 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

Prof Edson Belém - profedsonbelem@gmail.com Sexta, Jul 31, 2020

Estrutura do projeto depois de finalizado

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 {

private static final long serialVersionUID = 1L;

@Column(name = "clienteid")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idCliente;

@NotNull(message = "Email nao pode ser NUllo")


@Email(message = "fora do padrao do Email")
@Column(length = 50)
private String email;

@Pattern(regexp = "[a-z A-Z]{2,50}", message = "Nome Invalido")


@Column(length = 50)
private String nome;

@Column
private Double valorPlano;
@Column(length = 60)
private String nomePlano;
@Column()
private Double taxaPlano;

@OneToOne(mappedBy = "cliente", cascade = { CascadeType.ALL })


@JsonManagedReference
private Endereco endereco;

public Cliente() {

public Cliente(Long idCliente,


@NotNull(message = "Email nao pode ser NUllo") @Email(message =
"fora do padrao do Email") String email,
@Pattern(regexp = "[a-z A-Z]{2,50}", message = "Nome Invalido")
String nome, Double valorPlano, String nomePlano, Double
taxaPlano) {
super();
this.idCliente = idCliente;
this.email = email;

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 + "]";
}

public Long getIdCliente() {


return idCliente;
}

public void setIdCliente(Long idCliente) {


this.idCliente = idCliente;
}

public String getEmail() {


return email;
}

public void setEmail(String email) {


this.email = email;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public Double getValorPlano() {


return valorPlano;
}

public void setValorPlano(Double valorPlano) {


this.valorPlano = valorPlano;
}

public String getNomePlano() {


return nomePlano;
}

public void setNomePlano(String nomePlano) {


this.nomePlano = nomePlano;
}

public Double getTaxaPlano() {


return taxaPlano;
}

public void setTaxaPlano(Double taxaPlano) {

WWW.COTIINFORMATICA.COM.BR 265
this.taxaPlano = taxaPlano;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

public Endereco getEndereco() {


return endereco;
}

public void setEndereco(Endereco endereco) {


this.endereco = endereco;
}

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 {

private static final long serialVersionUID = 1L;


@Column(name = "Enderecoid")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idEndereco;
@Column
private String logradouro;
@Column
private String bairro;
@Column
private String cidade;
@Column
private String estado;
@Column
private String cep;

WWW.COTIINFORMATICA.COM.BR 266
@Column
private String latitude;
@Column
private String longitude;
@OneToOne
@JsonBackReference
@JoinColumn(name = "clienteidfk", referencedColumnName =
"clienteid")
private Cliente cliente;

public Long getIdEndereco() {


return idEndereco;
}

public void setIdEndereco(Long idEndereco) {


this.idEndereco = idEndereco;
}

public String getLogradouro() {


return logradouro;
}

public void setLogradouro(String logradouro) {


this.logradouro = logradouro;
}

public String getBairro() {


return bairro;
}

public void setBairro(String bairro) {


this.bairro = bairro;
}

public String getCidade() {


return cidade;
}

public void setCidade(String cidade) {


this.cidade = cidade;
}

public String getEstado() {


return estado;
}

public void setEstado(String estado) {


this.estado = estado;
}

public String getCep() {


return cep;
}

public void setCep(String cep) {


this.cep = cep;
}

WWW.COTIINFORMATICA.COM.BR 267
public String getLatitude() {
return latitude;
}

public void setLatitude(String latitude) {


this.latitude = latitude;
}

public String getLongitude() {


return longitude;
}

public void setLongitude(String longitude) {


this.longitude = longitude;
}

public Cliente getCliente() {


return cliente;
}

public void setCliente(Cliente cliente) {


this.cliente = cliente;
}

application.properties

As linhas 5 e 6 tem que ficar juntas, na mesma linha


spring.jpa.hibernate.ddl-auto= update
spring.datasource.username=root
spring.datasource.password=coti
spring.jpa.show-sql=true
spring.datasource.url=jdbc:mysql://localhost:3306/SPRINGBD02?
createDatabaseIfNotExist=true
server.port=1237
spring.thymeleaf.enabled=false

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;

@PostMapping(value = "cliente", consumes =


MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> cadastrarCliente(@RequestBody Cliente
cliente) {
try {

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 {

public static void main(String[] args) {


SpringApplication.run(Application.class, args);
}

WWW.COTIINFORMATICA.COM.BR 270
Rodar o projeto
Clicar na classe application.java com o botão direito -> run as -> java
application

Aguardar o servidor iniciar. Visualizar no console.

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:

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 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

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Ago 08, 2020

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() {
}

public Users(Long id,


@NotBlank(message = "nao pode deixar o nome vazio")
@Pattern(regexp = "[a-z A-Z]{2,50}", message = "nome fora do
padrao")
String nome,
@Email(message = "o Login deve estar no padrao de email") String
login,
@Size(min = 6, max = 15, message = "Faixa de 6 a 15") String
password) {
super();
this.id = id;
this.nome = nome;
this.login = login;
this.password = password;
}

WWW.COTIINFORMATICA.COM.BR 278
@Override
public String toString() {
return "Users [id=" + id + ", nome=" + nome + ", login=" +
login
+ ", password=" + password + "]";
}

public Long getId() {


return id;
}

public void setId(Long id) {


this.id = id;
}

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 getPassword() {


return password;
}

public void setPassword(String password) {


this.password = password;
}

public static long getSerialversionuid() {


return serialVersionUID;
}
}

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 {

public static void main(String[] args) {


SpringApplication.run(ProjetologinApplication.class,
args);
}

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 281
Java WebDeveloper Noite -
Aula 21 (Seg, Qua, Sex)

Tema da aula:

 Projeto Maven Springboot, Mysql, Junit, Annotations, Pattern,


JpaRepository, Controller, Rotas, Listar, Buscar pelo id, Logar, Gravar,
CorsFilter.
 Projeto Angular, Serviço, listar

Prof Edson Belém - profedsonbelem@gmail.com Quarta, Ago 05, 2020

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() {
}

public Users(Long id,


@NotBlank(message = "nao pode deixar o nome vazio")
@Pattern(regexp = "[a-z A-Z]{2,50}",
message = "nome fora do padrao") String nome,
@Email(message = "o Login deve estar no padrao de email")
String login,
@Size(min = 6, max = 15, message = "Faixa de 6 a 15")
String password) {
super();
this.id = id;
this.nome = nome;
this.login = login;
this.password = password;
}

@Override

WWW.COTIINFORMATICA.COM.BR 286
public String toString() {
return "Users [id=" + id + ", nome=" + nome + ", login="
+ login + ", password=" + password + "]";
}

public Long getId() {


return id;
}

public void setId(Long id) {


this.id = id;
}

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 getPassword() {


return password;
}

public void setPassword(String password) {


this.password = password;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

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() {

public void destroy() {

public void doFilter(ServletRequest request,


ServletResponse response, FilterChain chain) throws

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);
}

public void init(FilterConfig fConfig) throws ServletException {


// TODO Auto-generated method stub
}

ProjetoLoginApplication.java
package br.com.coti;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ProjetologinApplication {

public static void main(String[] args) {


SpringApplication.run(ProjetologinApplication.class, args);
}

WWW.COTIINFORMATICA.COM.BR 290
Rodar o projeto
Clicar em ProjetoLoginApplication.java com o botão direito -> run as ->
java application

Aguadar o servidor iniciar

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

Estrutura do projeto client Angular depois


de finalizado:

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;

constructor(id?:number, nome?:string, login?:string,


password?:string){
this.id=id;
this.nome=nome;
this.login=login;
this.password=password;
}
}

UsersService.ts
import { Users } from './../model/Users';
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

const URL = 'http://localhost:3322/users/';

@Injectable()
export class UsersService {

constructor(private http: HttpClient) {

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';

import { AppRoutingModule } from './app-routing.module';


import { AppComponent } from './app.component';
import { HttpClientModule } from '@angular/common/http';

@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 {

usuarios: Users[] = [];

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

<ul *ngFor='let usu of usuarios'>


<li> {{usu.nome}} - {{usu.login}}</li>
</ul>

Rodar o projeto
Digitar no terminal

ng s -o

Abrindo o browser
http://localhost:4200/

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 296
Java WebDeveloper Noite -
Aula 22 (Seg, Qua, Sex)

Tema da aula:
 Projeto server node, instalação json-server
 Projeto angular, calculo

Prof Edson Belém - profedsonbelem@gmail.com Sexta, Ago 07, 2020

Estrutura do projeto server Node depois


de finalizado

Para criar o package.json, digitar no terminal. E ir preenchendo as


informações ou somente dar ENTER.
npm init

WWW.COTIINFORMATICA.COM.BR 297
https://www.npmjs.com/package/json-server

Instalar a dependencia do json-server


Digitar no terminal:

npm i json-server

readme.md
npm init
package.json (A partir)
posso instalar qualquer coisa

npm i json-server -g (global)


npm i json-server

json-server --port 3004 ciente.json


--runing (roda e para)

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

Estrutura do projeto client Angular depois


de finalizado

WWW.COTIINFORMATICA.COM.BR 301
Para criar o projeto, digitar no terminal:

ng new nome_do_projeto

 y para a criação das rotas


 css para o estilo

cliente.ts
export class Cliente {
id: number;
nome: string;
login: string;
senha: string;
plano: string;
valor: number;

constructor(id?: number, nome?: string,


login?: string, senha?: string,
plano?: string) {
this.id = id;
this.nome = nome;
this.login = login;
this.senha = senha;
this.plano = plano;
this.valor = 0;
}

public definirValorPlano(): Cliente {


if (this.plano === 'planoum') {
this.valor = 300;
} else if (this.plano === 'planodois') {
this.valor = 400;
} else if (this.plano === 'planotres') {
this.valor = 500;
}
return this;
}

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(){
}

CONTINUA NA PROXIMA AULA


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 303
Java WebDeveloper Noite -
Aula 23 (Seg, Qua, Sex)

Tema da aula:
Projeto Jboss, Annotations, Habilitar Jboss, Jpa, Administrador Jboss

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Ago 10, 2020

Estrutura do projeto depois de finalizado

WWW.COTIINFORMATICA.COM.BR 304
JBoss Application Server

JBoss é um servidor de aplicação de código fonte aberto baseado na


plataforma JEE e implementado completamente na linguagem de
programação Java. Em virtude disso, ele pode ser usado em qualquer
Sistema Operacional que suporte a referida linguagem. O JBoss Application
Server 7, utiliza os arquivos: standalone.bat (ou standalone.sh) para prover a
sua inicialização.

Os desenvolvedores responsáveis estão em uma empresa de serviços


chamada “JBoss Inc.” fundada por Marc Fleury, o criador da primeira versão
do JBoss. O projeto é custeado por uma rede mundial de colaboradores. Em
Abril de 2006, foi anunciada sua aquisição pela Red Hat.

A partir da versão 8 o JBoss passou a se chamar Wildfly, além da troca de


nomes teve várias melhorias e mudanças como a troca do container que era
o JBossWeb para o Undertow.

Como alternativa open-source ao JBoss, temos o GlassFish, que é a


implementação de referência de toda a especificação Java EE.

O JBoss Application Server 7 é uma das primeiras plataformas de uma nova


etapa de projetos da JBoss, que visam ambientes como Cloud, passando por
pequenos dispositivos a grandes servidores. O JBoss AS 7 traz inúmeras
inovações. Dentre elas podemos destacar uma incrível rapidez de
aproximadamente 4 segundos na inicialização, baixíssimo consumo de

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).

A Tecnologia da Informação mudou drasticamente nestes últimos anos. Se


considerarmos hardware, por exemplo, é fato que existem muito mais
celulares hoje em dia do que computadores. É possível encarar smartphones
como computadores, pois sua capacidade de processamento e memória são
incrivelmente altas. Hoje em dia é comum encontrarmos processadores em
câmeras, Smartphones, Kindles, iPads, ou até mesmo em máquinas de café e
geladeiras. Podemos dizer também que estes equipamentos são
equivalentes a supercomputadores de 20 anos atrás, ou até mesmo
desktops de 10 anos atrás, e ainda assim, muitos deles estão presentes em
nossos bolsos. Estes tipos de dispositivos já estão aqui há algum tempo e
vieram para ficar.

Quando a Apple criou um segmento de mercado completamente novo, o


iPad, já existe mais de 20 milhões deles por aí e a utilização de smartphones
vem crescendo ainda mais. Em nossas casas, mais e mais dispositivos estão
se conectando e se comunicando, desde XBox ou PlayStation 3, até
aparelhos de TV e home theaters. Atualmente é comum armazenarmos
informações em Cloud, como simples scores de um videogame ou até
mesmo documentos usando serviços do Google, e isto tudo ocorre de forma
natural. Sem falar das redes sociais estourando em nosso cotidiano, é
notável que interagir neste mundo que vivemos se tornou muito mais fácil.

O JBoss Application Server 7 é a primeira plataforma desta nova etapa, que


traz inúmeras inovações, como rapidez na inicialização, baixíssimo consumo
de recursos, serviços iniciando on-demand, entre tantas outras, pensando no
que estamos vivendo hoje e o que poderá vir para amanhã, adaptando-se a
ambientes nas nuvens com clusters elásticos ou até mesmo a dispositivos
que cabem em nossos bolsos.

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.

Outra vantagem é executar o JBoss AS 7 em diversos ambientes como cloud,


pois caso surja uma grande demanda de acessos, um novo servidor poderá
ser iniciado de forma extremamente rápida. Com o baixo consumo de
memória, quem sabe até mesmo rodar o JBoss AS 7 em ambientes portáteis,
como smartphones ou tablets. Já para ambientes comuns como de
desenvolvimento, se for necessário parar o servidor por algum motivo
qualquer, você poderá inicializá-lo em poucos segundos, aumentando sua
produtividade.

Além de todas estas vantagens, ainda torna-se extremamente fácil rodar


diversas instâncias em seu próprio laptop.

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:

• appclient: contém a configuração de um Application Client Container –


ACC. Trata-se de um container pré-configurado usado quando se deseja
acessar recursos Java EE remotos (EJB, Filas JMS, etc.) a partir de aplicações
standalone (aplicação Desktop Swing);
• bin: contém vários scripts para manutenção e gerenciamento da instalação
do servidor de aplicação, que estão disponíveis para as plataformas Linux
(.sh) e Windows (.bat). Também são fornecidos scripts utilitários, como por
exemplo, para acesso à CLI;
• bundles: contém os bundles (serviços) OSGi que fazem parte do
subsistema OSGi fornecido pelo AS 7. Como veremos mais adiante, o AS 7
fornece suporte ao deployment de bundles OSGi;
• docs: ao contrário do que parece, não contém a documentação do
servidor de aplicação. A documentação oficial está disponível online no site
do JBoss AS. Este diretório é dividido três subdiretórios:
• examples: contém alguns exemplos de configuração de profiles (conjunto
de subsistemas) específicos;

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.

Após instalarmos o JBoss AS 7 e realizarmos um tour inicial em sua estrutura


de diretórios, vamos conhecer alguns detalhes e novidades desta versão.

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.

Embora seja possível formar um cluster de alta disponibilidade utilizando


várias instâncias em modo standalone, não será possível ter este ponto
único de gerenciamento, portanto, a administração de cada nó é feita de
forma isolada e repetitiva. O deploy de uma aplicação, por exemplo, deve
ser feita em todos os nós do cluster.
No AS 7 os serviços são chamados de subsistemas, e no modo Standalone
estes serviços estão configurados em um único arquivo denominado
standalone.xml, localizado no diretório
AS7_HOME/standalone/configuration. Desta forma, torna-se muito mais fácil
qualquer tipo de manutenção ou configuração em qualquer um dos
subsistemas. A Listagem 3 mostra a definição do subsistema de logging.

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.

Basicamente um domínio pode ser interpretado como uma unidade


administrativa. Um conjunto de instâncias do servidor de aplicação que
compartilham configurações comuns e que são coordenadas por um ponto
central – o Domain Controller.

Em versões anteriores do JBoss AS, caso o administrador quisesse iniciar


várias instâncias com exatamente as mesmas configurações, era necessário
realizar cópias do diretório referente ao profile utilizado para cada instância.
Por exemplo, caso fosse necessário iniciar três instâncias do profile default,
era necessário copiar o diretório deste profile três vezes (default-1, default-2
e default-3) e iniciar três processos da JVM utilizando o script run.sh:
Também não era possível compartilhar e nem gerenciar as configurações
das três instâncias de forma centralizada, dificultando a manutenção e
criação de novas instâncias. Era preciso replicar a mesma configuração em
vários pontos manualmente ou usando alguma ferramenta externa ao
servidor de aplicação, como o RHQ ou sua versão Enterprise, chamada JBoss
Operations Network (JON). Qualquer alteração feita em uma das instâncias
teria que ser copiada para as outras, tornando a manutenção em grandes
parques de servidores muito tediosa. É para lidar com esse tipo de situação
que o modo Domain, implementado no AS 7, se aplica.

A melhor forma de compreender a estrutura lógica de um domínio é


visualizar seus elementos como processos em execução. Estruturalmente,
um domínio é composto por quatro elementos:

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.

Quando se inicia o AS em modo Domain no mínimo três processos Java


(JVM) são criados no sistema operacional: um Host Controller (que também
pode agir como Domain Controller no mesmo processo), um Process
Controller e um Server Node. Relatamos no mínimo três porque
dependendo da configuração definida o domínio pode possuir três ou mais
processos executando em um mesmo host (físico ou virtual). A configuração
padrão do modo Domain fornecida pelo AS 7 é composta pela topologia
mostrada na Figura 9. Observe que nesta estrutura tanto o Host Controller

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 {

private static final long serialVersionUID = 1L;

@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 + "]";
}

public Integer getIdCliente() {


return idCliente;
}

public void setIdCliente(Integer idCliente) {


this.idCliente = idCliente;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public String getEmail() {


return email;
}

public void setEmail(String email) {


this.email = email;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

WWW.COTIINFORMATICA.COM.BR 313
Para colocar o Servidor JBOSS no worspace

Clicar no menu -> WINDOW -> PREFERENCES

WWW.COTIINFORMATICA.COM.BR 314
Clicar em SERVER -> Clicar em RUNTIME ENVIRONMENTS -> clicar
no botão ADD

Selecionar o RED HAT JBOSS MIDDLEWARE -> Clicar na versão 6.1


-> NEXT

WWW.COTIINFORMATICA.COM.BR 315
Clicar em BROWSER -> selecionar o diretório onde se encontram
os arquivos do JBOSS

Selecionar o diretório -> Clicar em OK

WWW.COTIINFORMATICA.COM.BR 316
Em RUNTIME JRE, selecionar o JAVASE1.8 -> Clicar em FINISH

Selecionar APPLY AND CLOSE

WWW.COTIINFORMATICA.COM.BR 317
Para habilitar o JSF e JPA

Clicar no projeto com o botão direito -> properties

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

Clicar em ADD -> Digitar a URL: *.jsf -> clicar em OK

WWW.COTIINFORMATICA.COM.BR 319
Clicar em OK

Clicar em APPLY

WWW.COTIINFORMATICA.COM.BR 320
Clicar em JPA -> clicar em FUTHER CONFIGURATION

Em TYPE, selecionar DISABLE LIBRARY CONIGURATION -> clicar em


OK

WWW.COTIINFORMATICA.COM.BR 321
Clicar em APPLY AND CLOSE

Será gerado o diretório META-INF e será gerado o arquivo


persistence.xml

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

Clicar na aba SERVER -> Clicar no link para adicionar

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

Clicar no JBOSS com o botão direito -> cliar em START

WWW.COTIINFORMATICA.COM.BR 326
Aguardar iniciar. Servidor inciado

Para abrir o administrador do JBOSS

Digitar a URL: localhost:9990


Usuario: coti

WWW.COTIINFORMATICA.COM.BR 327
Senha: coti@110

Na pagina principal

WWW.COTIINFORMATICA.COM.BR 328
Clicar na aba DEPLOYMENTS

Clicar em ADD para adicionar o banco de dados

WWW.COTIINFORMATICA.COM.BR 329
Escolher o driver do mysql 5.1.6

Clicar em NEXT

WWW.COTIINFORMATICA.COM.BR 330
Clicar em ENABLE

Clicar na aba CONFIGURATION

WWW.COTIINFORMATICA.COM.BR 331
Adicionar a conexão com o banco do projeto. Clicar em ADD

Digitar os dados de conexão.


Name: PUpopaye
JNDI: java:/melhor
Clicar em NEXT

WWW.COTIINFORMATICA.COM.BR 332
Clicar no conector do MYSQL -> Clicar em NEXT

Digitar as informações -> Conection


URL: jdbc:mysql://localhost:3306/bancojboss?createDatabaseIfNotExist=true
-> Username: root -> Password: coti-> clicar em TEST CONECTION

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

CONTINUA NA PROXIMA AULA


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 336
Java WebDeveloper Noite -
Aula 24 (Seg, Qua, Sex)

Tema da aula:
Projeto Jboss, Annotations, Habilitar Jboss, Jpa, Persistence.xml, session,
Administrador Jboss

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Ago 10, 2020

Estrutura do projeto depois de finalizado

WWW.COTIINFORMATICA.COM.BR 337
Para colocar o Servidor JBOSS no worspace

Clicar no menu -> WINDOW -> PREFERENCES

WWW.COTIINFORMATICA.COM.BR 338
Clicar em SERVER -> Clicar em RUNTIME ENVIRONMENTS -> clicar
no botão ADD

Selecionar o RED HAT JBOSS MIDDLEWARE -> Clicar na versão 6.1


-> NEXT

WWW.COTIINFORMATICA.COM.BR 339
Clicar em BROWSER -> selecionar o diretório onde se encontram
os arquivos do JBOSS

Selecionar o diretório -> Clicar em OK

WWW.COTIINFORMATICA.COM.BR 340
Em RUNTIME JRE, selecionar o JAVASE1.8 -> Clicar em FINISH

Selecionar APPLY AND CLOSE

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 {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(length = 50, unique = true)
private String login;
@Column
private String password;

public User() {

public User(Integer id, String login, String password) {


super();
this.id = id;
this.login = login;
this.password = password;
}

@Override
public String toString() {
return "User [id=" + id + ", login=" + login
+ ", password=" + password + "]";
}

public Integer getId() {


return id;
}

public void setId(Integer id) {


this.id = id;
}

public String getLogin() {


return login;
}

public void setLogin(String login) {

WWW.COTIINFORMATICA.COM.BR 342
this.login = login;
}

public String getPassword() {


return password;
}

public void setPassword(String password) {


this.password = password;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

Para habilitar o JSF e JPA

Clicar no projeto com o botão direito -> properties

WWW.COTIINFORMATICA.COM.BR 343
Clicar em Project Facest -> Marcar JAVA SERVER FACES -> Clicar
em Futher Configuration

Em TYPE, selecionar DISABLE LIBRARY CONFIGURATIONA.


Em URL MAPPING PATTERNS -> clicar em /FACES/* -> clicar em REMOVE

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

Clicar em JPA -> clicar em FUTHER CONFIGURATION

WWW.COTIINFORMATICA.COM.BR 346
Em TYPE, selecionar DISABLE LIBRARY CONIGURATION -> clicar em
OK

Clicar em APPLY AND CLOSE

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 {

private static final long serialVersionUID = 1L;

private User user; // inclusao e update


private List<User> uses;

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);
}

public List<User> findAll() {


query = em.createQuery("select obj from User as obj",
User.class);
return query.getResultList();
}

public User login(User user) {


queryUm = em.createQuery("select obj from User as obj
where login=:param1 and password=:param2 ");
queryUm.setParameter("param1", user.getLogin());
queryUm.setParameter("param2", user.getPassword());
return (User) queryUm.getSingleResult();
}

public User loginDois(User user) {


query = em.createQuery("select obj from User as obj where
login=:param1 and password=:param2 ", User.class).setParameter
("param1", user.getLogin()).setParameter("param2",
user.getPassword());
return query.getSingleResult();
}
}

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

Clicar na aba SERVER -> Clicar no link para adicionar

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

Clicar no JBOSS com o botão direito -> cliar em START

WWW.COTIINFORMATICA.COM.BR 353
Aguardar iniciar. Servidor inciado

Para abrir o administrador do JBOSS

Digitar a URL: localhost:9990


Usuario: coti

WWW.COTIINFORMATICA.COM.BR 354
Senha: coti@110

Na pagina principal

WWW.COTIINFORMATICA.COM.BR 355
Clicar na aba DEPLOYMENTS

Clicar em ADD para adicionar o banco de dados

WWW.COTIINFORMATICA.COM.BR 356
Escolher o driver do mysql 5.1.6

Clicar em NEXT

WWW.COTIINFORMATICA.COM.BR 357
Clicar em ENABLE

Clicar na aba CONFIGURATION

WWW.COTIINFORMATICA.COM.BR 358
Adicionar a conexão com o banco do projeto. Clicar em ADD

Digitar os dados de conexão.


Name: unidadejavapool
JNDI: java:/unidadejava

WWW.COTIINFORMATICA.COM.BR 359
Clicar em NEXT

Clicar no conector do MYSQL -> 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

Clicar em ENABLE para habilitar a conexão

WWW.COTIINFORMATICA.COM.BR 362
Clicar em CONFIRM

Conexão habilitada

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 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

JavaServer Faces (JSF) é uma especificação Java para a construção JavaServer


Faces (JSF) é uma especificação Java para a construção de interfaces de
usuário baseadas em componentes paraaplicações web. Possui um modelo
de programação dirigido a eventos, abstraindo os detalhes da manipulação
dos eventos e organização dos componentes, permitindo que o
programador se concentre na lógica da aplicação.

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

JavaServer Faces é baseada em um modelo de desenho de IU (interface de


usuário) baseada em componentes, usando arquivos XML chamados de
modelos de visão ouFacelets views. Os pedidos são processados pelo
FacesServlet, que carrega o modelo de visão adequado, constrói uma árvore
de componentes, processa os eventos e apresenta a resposta, normalmente
na linguagem HTML, para o cliente. O estado de componentes de interface
do usuário e outros objetos de interesse de escopo, é salvo no final de cada
pedido em um processo chamado stateSaving (nota: transiente true) e

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

Permite que o desenvolvedor crie UIs através de um conjunto de


componentes UIs pré-definidos;

Fornece um conjunto de tags JSP para acessar os componentes;

Reutiliza componentes da página;

Associa os eventos do lado cliente com os manipuladores dos


eventos do lado do servidor (os componentes de entrada possuem um valor
local representando o estado no lado servidor);

Fornece separação de funções que envolvem a construção de


aplicações Web.

WWW.COTIINFORMATICA.COM.BR 366
Utiliza Ajax em alguns de seus componentes tornando alguns
processos mais rápidos e eficientes.

Ciclo de vida

Diagrama mostrando o fluxo do ciclo de vida do JSF.


Ciclo de vida do JSF é o nome dado à sequência de processamento realizada
na implementação JSF para a geração das visões. O JSF, diferente de outros
frameworks, possui um processamento de requisição dividido em seis fases:

1. Restauração da visão - o objetivo principal desta fase é construir a árvores


de componentes.Ela utiliza o template e cria a árvore inicial através da
análise da requisição. Após isto, ela salva o estado da árvore no objeto
FacesContext. Nas requisições subsequentes, ela cria a árvore do estado e
procede a execução do resto do ciclo de vida.
2. Aplicação dos valores de requisição - o JSF pega cada componente da
árvore começando com a raiz e a cria ou recupera do objeto FacesContext.
Cada componente na árvore gerencia seus próprios valores e toma-os dos
parâmetros, cookies e cabeçalhos da requisição HTTP.
3. Validações de processo - o JSF realiza a conversão e validação sobre todos
os componentes começando com o raiz. O valor submetido de cada
componente é convertido em um objeto e validado chamando-se o
validador registrado. O JSF salva o valor submetido. Se ocorrer um erro

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:

 Folhas de estilo (CSS);


 Comandos em JavaScript;
 Metodologia Ajax.

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”

Clicar em “url mapping” -> clicar em “remove”

WWW.COTIINFORMATICA.COM.BR 371
Clicar em “add”

Escrever a “url pattern” -> ok

WWW.COTIINFORMATICA.COM.BR 372
Clicar em “ok”

Clicar em “apply and close”

WWW.COTIINFORMATICA.COM.BR 373
Prof Edson Belém - profedsonbelem@gmail.com Sexta, Ago 14, 2020

Estrutura do projeto depois de finalizado

Bibliotecas utilizadas no projeto:

WWW.COTIINFORMATICA.COM.BR 374
Aluno.java
package entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Aluno implements Serializable {

private static final long serialVersionUID = 1L;

private Integer idCliente;


private String nome;
private String email;
private Double soma = 0.;

// OneToOne
private List<Disciplina> disciplinas;

public Aluno() {
}

public Aluno(Integer idCliente, String nome, String email) {


super();
this.idCliente = idCliente;
this.nome = nome;
this.email = email;
}

@Override
public String toString() {
return "Aluno [idCliente=" + idCliente + ", nome="
+ nome + ", email=" + email + ", soma=" + soma + "]";
}

public Integer getIdCliente() {


return idCliente;
}

public void setIdCliente(Integer idCliente) {


this.idCliente = idCliente;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public String getEmail() {


return email;
}

WWW.COTIINFORMATICA.COM.BR 375
public void setEmail(String email) {
this.email = email;
}

public List<Disciplina> getDisciplinas() {


return disciplinas;
}

// substituir ...
public void setDisciplinas(List<Disciplina> disciplinas) {
this.disciplinas = disciplinas;
}

// uM UNICO somaTORIO DE TODAS AS mEDIAS


public void gerarSoma(Disciplina disciplina) {
this.soma += disciplina.getMedia();
}

public void adicionar(Disciplina disciplina) {


if (this.disciplinas == null) {
this.disciplinas = new ArrayList<Disciplina>();
}
// adicionar com total ....
this.gerarSoma(disciplina);
this.disciplinas.add(disciplina);
}

public static long getSerialversionuid() {


return serialVersionUID;
}

public Double getSoma() {


return soma;
}

public void setSoma(Double soma) {


this.soma = soma;
}

public static void main(String[] args) {


try {
Aluno a = new Aluno(100, "gilvan", "gilvan@gmail.com");
Disciplina d1 = new Disciplina(400, "java", 10., 10.);
d1.gerarMedia();
d1.setAluno(a);
Disciplina d2 = new Disciplina(500, "angular", 9., 9.);
d2.gerarMedia();
d2.setAluno(a);
Disciplina d3 = new Disciplina(600, "arquitetura", 8., 10.);
d3.gerarMedia();
d3.setAluno(a);
List<Disciplina> lista = new ArrayList<Disciplina>();

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 class Disciplina {

private Integer idDisciplina;


private String disciplina;
private Double nota1;
private Double nota2;
private Double media = 0.;

private Aluno aluno;

public Disciplina() {
}

public Disciplina(Integer idDisciplina, String disciplina,


Double nota1, Double nota2) {
super();
this.idDisciplina = idDisciplina;
this.disciplina = disciplina;
this.nota1 = nota1;
this.nota2 = nota2;
}

// 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 + "]";
}

public Integer getIdDisciplina() {


return idDisciplina;
}

public void setIdDisciplina(Integer idDisciplina) {


this.idDisciplina = idDisciplina;
}

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;
}

public void setNota2(Double nota2) {


this.nota2 = nota2;
}

public Aluno getAluno() {


return aluno;
}

public void setAluno(Aluno aluno) {


this.aluno = aluno;
}

public Double getMedia() {


return media;
}

public void setMedia(Double media) {


this.media = media;
}

public void gerarMedia() {

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 {

private Aluno aluno;


private List<Aluno> alunos;
private List<Disciplina> disciplinas;

@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());
}

public Aluno getAluno() {


return aluno;
}

public void setAluno(Aluno aluno) {


this.aluno = aluno;
}

public List<Aluno> getAlunos() {


return alunos;
}

public void setAlunos(List<Aluno> alunos) {


this.alunos = alunos;
}

public List<Disciplina> getDisciplinas() {


return disciplinas;
}

public void setDisciplinas(List<Disciplina> disciplinas) {


this.disciplinas = disciplinas;
}

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>

<h:outputText value="Nome Disciplina"></h:outputText>


<p:inputText value="#{mb.disciplinas[0].disciplina}">

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="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>

<p:commandButton value="gravar" update=":form2" ajax="true">


</p:commandButton>

<p:messages></p:messages>
</p:panelGrid>
</h:form>
</p:panel>

<p:panel header="Lista de alunos">


<h:form id="form2">
<p:dataList value="#{mb.alunos}" var="linha">
#{linha.nome} - #{linha.email}
</p:dataList>
</h:form>
</p:panel>
</h:body>
</html>

WWW.COTIINFORMATICA.COM.BR 382
Rodar o projeto
Clicar na pagina sistema.xhtml com o botão direito -> run as -> run on
server

Selecionar o Tomcat -> FINISH

WWW.COTIINFORMATICA.COM.BR 383
http://localhost:8080/projetoJSFsemjboss/sistema.jsf

Preencher os dados para gravar

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 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

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Ago 17, 2020

Estrutura do projeto depois de finalizado

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;

public class Aluno implements Serializable {

private static final long serialVersionUID = 1L;

private Integer idCliente;


private String nome;
private String email;
private Double soma = 0.;

// OneToOne
private List<Disciplina> disciplinas;

public Aluno() {
}

public Aluno(Integer idCliente, String nome, String email) {


super();
this.idCliente = idCliente;
this.nome = nome;
this.email = email;
}

WWW.COTIINFORMATICA.COM.BR 386
@Override
public String toString() {
return "Aluno [idCliente=" + idCliente + ", nome="
+ nome + ", email=" + email + ", soma=" + soma + "]";
}

public Integer getIdCliente() {


return idCliente;
}

public void setIdCliente(Integer idCliente) {


this.idCliente = idCliente;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public String getEmail() {


return email;
}

public void setEmail(String email) {


this.email = email;
}

public List<Disciplina> getDisciplinas() {


return disciplinas;
}

// substituir ...
public void setDisciplinas(List<Disciplina> disciplinas) {
this.disciplinas = disciplinas;
}

// uM UNICO somaTORIO DE TODAS AS mEDIAS


public void gerarSoma(Disciplina disciplina) {
this.soma += disciplina.getMedia();
}

public void adicionar(Disciplina disciplina) {


if (this.disciplinas == null) {
this.disciplinas = new ArrayList<Disciplina>();
}
// adicionar com total ....
this.gerarSoma(disciplina);
this.disciplinas.add(disciplina);
}

public static long getSerialversionuid() {


return serialVersionUID;
}

public Double getSoma() {

WWW.COTIINFORMATICA.COM.BR 387
return soma;
}

public void setSoma(Double soma) {


this.soma = soma;
}

public static void main(String[] args) {


try {
Aluno a = new Aluno(100, "gilvan", "gilvan@gmail.com");
Disciplina d1 = new Disciplina(400, "java", 10., 10.);
d1.gerarMedia();
d1.setAluno(a);
Disciplina d2 = new Disciplina(500, "angular", 9., 9.);
d2.gerarMedia();
d2.setAluno(a);
Disciplina d3 = new Disciplina(600, "arquitetura", 8., 10.);
d3.gerarMedia();
d3.setAluno(a);
List<Disciplina> lista = new ArrayList<Disciplina>();

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;

public class Disciplina {

private Integer idDisciplina;


private String disciplina;
private Double nota1;
private Double nota2;
private Double media = 0.;

WWW.COTIINFORMATICA.COM.BR 388
private Aluno aluno;

public Disciplina() {
}

public Disciplina(Integer idDisciplina, String disciplina,


Double nota1, Double nota2) {
super();
this.idDisciplina = idDisciplina;
this.disciplina = disciplina;
this.nota1 = nota1;
this.nota2 = nota2;
}

// 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 + "]";
}

public Integer getIdDisciplina() {


return idDisciplina;
}

public void setIdDisciplina(Integer idDisciplina) {


this.idDisciplina = idDisciplina;
}

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;
}

WWW.COTIINFORMATICA.COM.BR 389
public Double getNota2() {
return nota2;
}

public void setNota2(Double nota2) {


this.nota2 = nota2;
}

public Aluno getAluno() {


return aluno;
}

public void setAluno(Aluno aluno) {


this.aluno = aluno;
}

public Double getMedia() {


return media;
}

public void setMedia(Double media) {


this.media = media;
}

public void gerarMedia() {


this.media = (this.getNota1() + this.getNota2()) / 2;
}
}

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 {

private static final long serialVersionUID = 1L;


private Aluno aluno;
HttpSession session;

public static List<Aluno> carga = new ArrayList<Aluno>();


public static List<Aluno> alunos = new ArrayList<Aluno>();
// mockado
static {

WWW.COTIINFORMATICA.COM.BR 391
}

private List<Disciplina> disciplinas;

@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();
}

public void load() {


HttpSession session = (HttpSession) FacesContext
.getCurrentInstance().getExternalContext().getSession(true);
}

public Aluno getAluno() {


return aluno;
}

public void setAluno(Aluno aluno) {


this.aluno = aluno;
}

public List<Disciplina> getDisciplinas() {


return disciplinas;
}

public void setDisciplinas(List<Disciplina> disciplinas) {


this.disciplinas = disciplinas;
}

public HttpSession getSession() {


return session;
}

public void setSession(HttpSession session) {


this.session = session;
}

public static List<Aluno> getCarga() {


return carga;
}

public static void setCarga(List<Aluno> carga) {

WWW.COTIINFORMATICA.COM.BR 392
ManagerBean.carga = carga;
}

public List<Aluno> getAlunos() {


return alunos;
}

public static void setAlunos(List<Aluno> alunos) {


ManagerBean.alunos = alunos;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

public void gravar() {


FacesContext fc = FacesContext.getCurrentInstance();
try {
if (session.getAttribute("lista") == null) {
this.aluno.setDisciplinas(this.disciplinas);
alunos.add(this.aluno);
session.setAttribute("lista", alunos);
} else {
carga = (List<Aluno>) session.getAttribute("lista");
this.aluno.setDisciplinas(this.disciplinas);
carga.add(this.aluno);
session.setAttribute("lista", carga);
}
this.aluno = new Aluno(); // nao (REGISTRO)
this.disciplinas = new ArrayList<Disciplina>();
this.disciplinas.add(new Disciplina());
this.disciplinas.add(new Disciplina());
fc.addMessage(null, new FacesMessage("Dados Gravados"));
} catch (Exception ex) {
ex.printStackTrace();
}
}

public void cargaAlunos() {


alunos = (List<Aluno>) session.getAttribute("lista");
System.out.println(alunos);
}
}

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="Nome Disciplina"></h:outputText>


<p:inputText value="#{mb.disciplinas[0].disciplina}">
</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="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>

WWW.COTIINFORMATICA.COM.BR 394
<h:outputText value="Nota2"></h:outputText>
<p:inputText
value="#{mb.disciplinas[1].nota2}"></p:inputText>

<p:commandButton value="gravar" update=":form2" ajax="true">


</p:commandButton>

<p:messages></p:messages>
</p:panelGrid>
</h:form>
</p:panel>

<p:panel header="Lista de alunos">


<h:form id="form2">
<p:dataList value="#{mb.alunos}" var="linha">
#{linha.nome} - #{linha.email}
</p:dataList>
</h:form>
</p:panel>
</h:body>
</html>

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

Aguardar o projeto abrir no browser


http://localhost:8080/projetoJSFsemjboss/sistema.jsf

WWW.COTIINFORMATICA.COM.BR 396
Preencher os dados para gravar

Clicar em GRAVAR. Mostra a lista

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 397
Java WebDeveloper Noite -
Aula 27 (Seg, Qua, Sex)

Tema da aula:

 Continuação, Projeto JSF, Primefaces5.0, calculo, Relacionamento


OneToMany, lista, Panel, Panelgrid, Messages, Datalist.
 Projeto Ionic, Data, Serviço contador, adicionar clique

Prof Edson Belém - profedsonbelem@gmail.com Quarta, Ago 19, 2020

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.

Esta ferramenta é foca em casos em que é necessário testes rápidos, sem a


necessidade de diversas dependências como XCode, Android SDK, Cordova,
etc. adequadamente configurados pra o seu dispositivo.

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

Angular & Ionic


No Angular temos um algo chamado Service, já no IONIC extamente a
mesma coisa se chama Provider.

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:

 Estabilidade na criação de aplicações híbridas: Apesar de utilizar


HTML, CSS e JS para o desenvolvimento das aplicações, o Ionic
entrega um produto altamente estável e com desempenho similar ao
de aplicativos nativos;
 Multiplataforma: Com o Ionic, podemos desenvolver um único código
que seja executado em diferentes sistemas operacionais, diminuindo
o tempo de desenvolvimento de novas aplicações.

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.

A ion-grid é usado para adicionar um invólucro em torno linhas e colunas


da grade. Sob o invólucro da grade, as linhas são adicionadas como
estruturas verticais, que são divididas em colunas para ocupar espaço
horizontal para preencher a área da linha.

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.

Por padrão, as colunas na linha podem ocupar espaço total horizontalmente


e agrupar as colunas na próxima linha, se compactadas. Usando as
propriedades abaixo, podemos modificar as propriedades do CSS flexbox
para substituir o comportamento padrão.

Comando Descrição

assume valor booleano; Se definido como true a grade,


fixed
terá uma largura fixa no tamanho da tela.

Quebra de coluna:

Comando Descrição

Se a nowrap propriedade for adicionada na linha de íons,


nowrap as colunas não cairão para a próxima linha; Adiciona
propriedade CSS flex-wrap: nowrap.

wrap- as colunas serão quebradas inversamente. Adiciona


reverse propriedade css flex-wrap: wrap-reverse.

WWW.COTIINFORMATICA.COM.BR 403
Alinhamento vertical de colunas

Comando Descrição

todas as colunas serão alinhadas verticalmente na parte


align-items- superior, a menos que especifiquem seu próprio
start alinhamento. Adiciona propriedade css flex-wrap:
nowrap.

todas as colunas serão alinhadas verticalmente no


align-items- centro, a menos que especifiquem seu próprio
center alignment. Adiciona a propriedade CSS flex-wrap:
nowrap.

todas as colunas serão alinhadas verticalmente na parte


align-items- inferior, a menos que especifiquem seu próprio
end alinhamento. Adiciona propriedade css flex-wrap:
nowrap.

todas as colunas serão esticadas para ocupar toda a


align-items- altura da linha, a menos que especifiquem seu próprio
stretch alinhamento. Adiciona propriedade CSS align-items:
stretch.

todas as colunas serão alinhadas verticalmente em suas


align-items- linhas de base, a menos que especifiquem seu próprio
baseline alinhamento. Adiciona propriedade CSS align-items:
baseline.

Alinhamento horizontal de colunas:

Comando Descrição

todas as colunas serão alinhadas horizontalmente no


justify-
início. Adiciona propriedade CSS justify-content:
content-start
start.

WWW.COTIINFORMATICA.COM.BR 404
Comando Descrição

justify- todas as colunas serão alinhadas horizontalmente no


content- centro. Adiciona propriedade CSS justify-content:
center center.

justify- todas as colunas serão alinhadas horizontalmente no


content-end final. Adiciona propriedade CSS justify-content: end.

adiciona justify-content: space-around. Todas as


justify-
colunas serão alinhadas horizontalmente com espaço
content-
igual ao seu redor. Adiciona propriedade CSS justify-
around
content: space-around.

adiciona justify-content: space-between. Todas as


justify- colunas serão alinhadas horizontalmente com um
content- espaço de meio tamanho em cada extremidade.
between Adiciona propriedade CSS justify-content: space-
between.

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.

O alinhamento da coluna pode ser modificado usando as propriedades


abaixo:

Comando Descrição

align-self- a coluna será alinhada verticalmente na parte superior;


start Adiciona propriedade CSS align-self: flex-start.

align-self- a coluna será alinhada verticalmente no centro; Adiciona


center propriedade CSS align-self: center.

WWW.COTIINFORMATICA.COM.BR 405
Comando Descrição

align-self- a coluna será alinhada verticalmente na parte inferior;


end Adiciona propriedade CSS align-self: flex-end.

align-self- a coluna será esticada para ocupar toda a altura da


stretch linha; Adiciona propriedade CSS align-self: stretch.

align-self- a coluna será alinhada verticalmente em sua linha de


baseline base; Adiciona propriedade CSS align-self: baseline.

o número de espaço da coluna que ocupará do total de


slots de colunas disponíveis é 12. O padrão é definido
size
como automático para ajustar automaticamente de
acordo com o espaço disponível na linha.

quantidade de margem adicionada no início da coluna


offset
com base no total de colunas disponíveis nessa linha.

isso adiciona a propriedade CSS correta para puxar a


pull
coluna para o início do total disponível

Isso adiciona a propriedade CSS esquerda à coluna e


push
empurra para o final da linha.

Alguns Comandos

https://ionicframework.com/docs/v3/cli/

https://github.com/orgs/ionic-team/projects

WWW.COTIINFORMATICA.COM.BR 406
Comando Descrição

Listar os tipos disponiveis de


ionic start –list
projeto

ionic start nome_do_projeto blank – Criar projeto em branco em


type=react React

Criar projeto em branco em


ionic start nome_do_projeto blank
Angular

ionic start nome_do_projeto tabs Criar projeto com abas

ionic start
Criar projeto com menu lateral
nome_do_projeto sidemenu

Criar projeto completo de


ionic start nome_do_projeto super
exemplo

ionic start nome_do_projeto tutorial Criar projeto com tutorial

ionic start
Criar projeto real
nome_do_projeto conference

ionic serve Iniciar o projeto

WWW.COTIINFORMATICA.COM.BR 407
Estrutura do projeto server Java depois de
finalizado

Bibliotecas utilizadas no projeto:

WWW.COTIINFORMATICA.COM.BR 408
Aluno.java
package entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Aluno implements Serializable {

private static final long serialVersionUID = 1L;

private Integer idCliente;


private String nome;
private String email;
private Double soma = 0.;

// OneToOne
private List<Disciplina> disciplinas;

public Aluno() {
}

public Aluno(Integer idCliente, String nome, String email) {


super();
this.idCliente = idCliente;
this.nome = nome;
this.email = email;
}

@Override
public String toString() {
return "Aluno [idCliente=" + idCliente + ", nome="
+ nome + ", email=" + email + ", soma=" + soma + "]";
}

public Integer getIdCliente() {


return idCliente;
}

public void setIdCliente(Integer idCliente) {


this.idCliente = idCliente;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public String getEmail() {


return email;
}

WWW.COTIINFORMATICA.COM.BR 409
public void setEmail(String email) {
this.email = email;
}

public List<Disciplina> getDisciplinas() {


return disciplinas;
}

// substituir ...
public void setDisciplinas(List<Disciplina> disciplinas) {
this.disciplinas = disciplinas;
}

// uM UNICO somaTORIO DE TODAS AS mEDIAS


public void gerarSoma(Disciplina disciplina) {
this.soma += disciplina.getMedia();
}

public void adicionar(Disciplina disciplina) {


if (this.disciplinas == null) {
this.disciplinas = new ArrayList<Disciplina>();
}
// adicionar com total ....
this.gerarSoma(disciplina);
this.disciplinas.add(disciplina);
}

public static long getSerialversionuid() {


return serialVersionUID;
}

public Double getSoma() {


return soma;
}

public void setSoma(Double soma) {


this.soma = soma;
}

public static void main(String[] args) {


try {
Aluno a = new Aluno(100, "gilvan", "gilvan@gmail.com");
Disciplina d1 = new Disciplina(400, "java", 10., 10.);
d1.gerarMedia();
d1.setAluno(a);
Disciplina d2 = new Disciplina(500, "angular", 9., 9.);
d2.gerarMedia();
d2.setAluno(a);
Disciplina d3 = new Disciplina(600, "arquitetura", 8., 10.);
d3.gerarMedia();
d3.setAluno(a);
List<Disciplina> lista = new ArrayList<Disciplina>();

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 class Disciplina {

private Integer idDisciplina;


private String disciplina;
private Double nota1;
private Double nota2;
private Double media = 0.;

private Aluno aluno;

public Disciplina() {
}

public Disciplina(Integer idDisciplina, String disciplina,


Double nota1, Double nota2) {
super();
this.idDisciplina = idDisciplina;
this.disciplina = disciplina;
this.nota1 = nota1;
this.nota2 = nota2;
}

// 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 + "]";
}

public Integer getIdDisciplina() {


return idDisciplina;
}

public void setIdDisciplina(Integer idDisciplina) {


this.idDisciplina = idDisciplina;
}

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;
}

public void setNota2(Double nota2) {


this.nota2 = nota2;
}

public Aluno getAluno() {


return aluno;
}

public void setAluno(Aluno aluno) {


this.aluno = aluno;
}

public Double getMedia() {


return media;
}

public void setMedia(Double media) {


this.media = media;
}

public void gerarMedia() {

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 {

private static final long serialVersionUID = 1L;


private Aluno aluno; // A unidade (registro) --> gravacao
private HttpSession session;

public static List<Aluno> carga = new ArrayList<Aluno>();


public static List<Aluno> alunos = new ArrayList<Aluno>();

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);
}

private List<Disciplina> disciplinas;

@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);
}

public Aluno getAluno() {


return aluno;
}

public void setAluno(Aluno aluno) {


this.aluno = aluno;
}

public List<Disciplina> getDisciplinas() {


return disciplinas;
}

public void setDisciplinas(List<Disciplina> disciplinas) {


this.disciplinas = disciplinas;
}

public HttpSession getSession() {


return session;
}

public void setSession(HttpSession session) {


this.session = session;
}

public static List<Aluno> getCarga() {


return carga;
}

public static void setCarga(List<Aluno> carga) {


ManagerBean.carga = carga;
}

public List<Aluno> getAlunos() {


return alunos;
}

public static void setAlunos(List<Aluno> alunos) {


ManagerBean.alunos = alunos;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

public void gravar() {


FacesContext fc = FacesContext.getCurrentInstance();
try {
// primeira vez
if (session.getAttribute("lista") == null) {
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);

alunos.add(this.aluno); // (alunos e duas notas)


session.setAttribute("lista", alunos); // gravacao final ...

this.aluno = new Aluno(); // zero limpo objeto


this.disciplinas = new ArrayList<Disciplina>();
this.disciplinas.clear(); // zero disciplinas ...
this.disciplinas.add(new Disciplina());
this.disciplinas.add(new Disciplina());
fc.addMessage(null, new FacesMessage("Dados Gravados (ok)"));
} else {
// protecao dos dados descarrego para carga
carga = (List<Aluno>) session.getAttribute("lista");
this.disciplinas.get(0).gerarMedia();
this.disciplinas.get(1).gerarMedia();
this.aluno.setDisciplinas(this.disciplinas); // prende
alunos.add(this.aluno); // static ..
carga.add(this.aluno);// carga ==lista (session)
session.setAttribute("lista", carga); // substituindo a
sessao ADD

this.aluno = new Aluno(); // nao (REGISTRO)


this.disciplinas = new ArrayList<Disciplina>();
this.disciplinas.add(new Disciplina());
this.disciplinas.add(new Disciplina());
fc.addMessage(null, new FacesMessage("Dados Gravados
(novamente)"));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

public void cargaAlunos() {


alunos = (List<Aluno>) session.getAttribute("lista");
System.out.println(alunos);
}
}

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="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="idDisciplina"></h:outputText>
<p:inputText
value="#{mb.disciplinas[0].idDisciplina}"></p:inputText>

<h:outputText value="Nome Disciplina"></h:outputText>


<p:inputText
value="#{mb.disciplinas[0].disciplina}"></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>

<p:commandButton value="Gravar Dados" update=":form1,:form2"


action="#{mb.gravar}"
ajax="true"></p:commandButton>
<p:growl></p:growl>
<p:messages></p:messages>
</p:panelGrid>
</h:form>
</p:panel>

<p:panel header="Lista de alunos">


<h:form id="form2">
<p:dataList value="#{mb.alunos}" var="linha">
#{linha}
</p:dataList>
</h:form>
</p:panel>
</h:body>
</html>

WWW.COTIINFORMATICA.COM.BR 418
Rodar o projeto
Clicar na pagina sistema.xhtml com o botão direito -> run as -> run on
server

Selecionar o Tomcat -> FINISH

WWW.COTIINFORMATICA.COM.BR 419
Aguardar o projeto abrir no browser
http://localhost:8080/projetoJSFsemjboss/sistema.jsf

Preencher os dados para gravar

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

Para criar o projeto Ionic


Digitar no terminal:

ionic start nome_do_projeto blank

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;

public toString(): string {


return this.idProduto + "," + this.nome + "," + this.preco
+ "," + this.quantidade + "," + this.imagem;
}
}

venda.ts
import { Produto } from './produto';

export class Venda {

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 {

count: Subject<number> = new Subject<number>();


vetor: Produto[] = [];

constructor() {

public contar(produto: Produto) {


this.vetor.push(produto);

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;

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);
}
}

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

Clicar no botão adicionar

WWW.COTIINFORMATICA.COM.BR 426
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 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

Prof Edson Belém - profedsonbelem@gmail.com Segunda, Ago 24, 2020

WWW.COTIINFORMATICA.COM.BR 428
Estrutura do projeto Ionic depois de
finalizado

readme.md
INCIAR O PROJETO APP:
ionic serve

ionic generate page login

WWW.COTIINFORMATICA.COM.BR 429
produto.ts
export class Produto {

idProduto: number;
nome: string;
preco: number;
quantidade: number;
imagem: string;

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;

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;

constructor(id?: number, email?: string, senha?: string) {


this.id = id;
this.email = email;
this.senha = senha;
}

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';

export class Venda {

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';

export const usuarios = [


{
"id": 1,
"email": "renato@gmail.com",
"senha": "123456"
},
{
"id": 2,
"email": "cleber@gmail.com",
"senha": "123456"
},
{
"id": 3,
"email": "gilvan@gmail.com",
"senha": "123456"
}
] as 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-button routerLink='/login' color='primary' size='block'>


Login</ion-button>

</ion-card>

<!-- <div id="container">


<ion-button (click)="adicionar()">Adicionar</ion-button>
{{quantidadeglobal}}
</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;
}

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 {

listaUsuario: Usuario[] = usuarios;

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>

<ion-button color='success' size='block'


(click)="tempo()">Logar</ion-button>
<br />
Logado :{{logado | json}}
<br />
Usuario:{{usuario | json}}
</ion-card-content>
</ion-card>
</ion-content>

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

Digitar os dados para logar

WWW.COTIINFORMATICA.COM.BR 437
Logado

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 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

Prof Edson Belém - profedsonbelem@gmail.com Quarta, Ago 26, 2020

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

ionic generate page login

ionic generate page produtos

produto.ts
export class Produto {

idProduto: number;
nome: string;
preco: number;
quantidade: number;
imagem: string;

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;

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;

constructor(id?: number, email?: string, senha?: string) {


this.id = id;
this.email = email;
this.senha = senha;
}

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';

export class Venda {

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';

export const usuarios = [


{
"id": 1,
"email": "renato@gmail.com",
"senha": "123456"
},
{
"id": 2,
"email": "cleber@gmail.com",
"senha": "123456"
},
{
"id": 3,
"email": "gilvan@gmail.com",
"senha": "123456"
}
] as Usuario[];

mock-produto.ts
import { Produto } from '../model/produto';

export const produtos =[


{
"idProduto" : 1,
"nome" : "havaiana",
"preco" : 50,
"quantidade" : 1,
"imagem" : "https://abrilmdemulher.files.wordpress.com/2019/09
/havaianas-modelo-slide.jpg"
},
{
"idProduto" : 2,
"nome" : "xingling",
"preco" : 1500,
"quantidade" : 1,
"imagem" : "https://www.hardware.com.br/fit-
in/768x0/@/static/20170527/xingg.jpg"
},
{
"idProduto" : 3,
"nome" : "relogio",
"preco" : 550,
"quantidade" : 1,

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 {

count: Subject<number> = new Subject<number>();


vetor: Produto[] = [];

constructor() {

public contar(produto: Produto) {


this.vetor.push(produto);
this.count.next(this.vetor.length);
}

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-button routerLink='/login' color='primary' size='block'>


Login</ion-button>

</ion-card>

<!-- <div id="container">


<ion-button (click)="adicionar()">Adicionar</ion-button>
{{quantidadeglobal}}

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 {

listaUsuario: Usuario[] = usuarios;

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>

<ion-button color='success' size='block'


(click)="tempo()">Logar</ion-button>
<br />
Logado :{{logado | json}}
<br />
Usuario:{{usuario | json}}
</ion-card-content>
</ion-card>
</ion-content>

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[] = [];

constructor(private service: ProdutoService) {

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-list *ngFor='let p of produtos'>


<ion-item>
<ion-grid>
<ion-row>
<ion-col size='2'>
<div>
<ion-thumbnail slot='start'>
<img [src]='p.imagem'>
</ion-thumbnail>
</div>
</ion-col>

<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

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 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

Prof Edson Belém - profedsonbelem@gmail.com Sexta, Ago 28, 2020

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 {

private static final long serialVersionUID = 1L;


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotEmpty(message = "Nao pode ser Null")
@Pattern(regexp = "[a-z A-Z]{2,50}",
message = " O nome nao pode ter numero")
@Column(length = 50)
private String nome;
@Column(length = 50, unique = true)
private String email;

@ManyToMany(mappedBy = "alunos", cascade = { CascadeType.ALL })


private Set<Curso> cursos = new HashSet<Curso>();

public Aluno() {

public Aluno(Long id, String nome, String email) {


this.id = id;
this.nome = nome;
this.email = email;
}

WWW.COTIINFORMATICA.COM.BR 459
@Override
public String toString() {
return "Aluno [id=" + id + ", nome=" + nome + ", email="
+ email + "]";
}

public Long getId() {


return id;
}

public void setId(Long id) {


this.id = id;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public String getEmail() {


return email;
}

public void setEmail(String email) {


this.email = email;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

public Set<Curso> getCursos() {


return cursos;
}

public void setCursos(Set<Curso> cursos) {


this.cursos = cursos;
}

public void adicionarCurso(Curso c) {


if (this.cursos == null) {
this.cursos = new HashSet<Curso>();
}
this.cursos.add(c);
}

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 {

private static final long serialVersionUID = 1L;


// MappedBy
// JoinColumn
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idCurso;
@Column(length = 50)
private String nomeCurso;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "CursoAluno", joinColumns =
@JoinColumn(name = "idCurso"), inverseJoinColumns =
@JoinColumn(name = "id"))

private Set<Aluno> alunos = new HashSet<Aluno>();

public Curso() {
}

public Curso(Long idCurso, String nomeCurso, Set<Aluno> alunos) {


super();
this.idCurso = idCurso;
this.nomeCurso = nomeCurso;
this.alunos = alunos;
}

public Curso(Long idCurso, String nomeCurso) {


super();
this.idCurso = idCurso;
this.nomeCurso = nomeCurso;
}

WWW.COTIINFORMATICA.COM.BR 461
@Override
public String toString() {
return "Curso [id=" + idCurso + ", nomeCurso=" + nomeCurso
+ "]";
}

public Long getIdCurso() {


return idCurso;
}

public void setIdCurso(Long idCurso) {


this.idCurso = idCurso;
}

public String getNomeCurso() {


return nomeCurso;
}

public void setNomeCurso(String nomeCurso) {


this.nomeCurso = nomeCurso;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

public Set<Aluno> getAlunos() {


return alunos;
}

public void setAlunos(Set<Aluno> alunos) {


this.alunos = alunos;
}

public void adicionarAluno(Aluno a) {


if (this.alunos == null) {
this.alunos = new HashSet<Aluno>();
}
this.alunos.add(a);
}
}

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 {

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 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

Prof Edson Belém - profedsonbelem@gmail.com Quarta, Set 02, 2020

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 {

private static final long serialVersionUID = 1L;


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotEmpty(message = "Nao pode ser Null")
@Pattern(regexp = "[a-z A-Z]{2,50}",
message = " O nome nao pode ter numero")
@Column(length = 50)
private String nome;
@Column(length = 50, unique = true)
private String email;

@ManyToMany(mappedBy = "alunos", cascade = { CascadeType.PERSIST,


CascadeType.MERGE })
private Set<Curso> cursos = new HashSet<Curso>();

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 + "]";
}

public Long getId() {


return id;
}

public void setId(Long id) {


this.id = id;
}

public String getNome() {


return nome;
}

public void setNome(String nome) {


this.nome = nome;
}

public String getEmail() {


return email;
}

public void setEmail(String email) {


this.email = email;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

public Set<Curso> getCursos() {


return cursos;
}

public void setCursos(Set<Curso> cursos) {


this.cursos = cursos;
}

public void adicionarCurso(Curso c) {


if (this.cursos == null) {
this.cursos = new HashSet<Curso>();
}
this.cursos.add(c);
}
}

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 {

private static final long serialVersionUID = 1L;

@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"))

private Set<Aluno> alunos = new HashSet<Aluno>();

public Curso() {
}

public Curso(Long idCurso, String nomeCurso, Set<Aluno> alunos) {


super();
this.idCurso = idCurso;
this.nomeCurso = nomeCurso;
this.alunos = alunos;
}

public Curso(Long idCurso, String nomeCurso) {


super();
this.idCurso = idCurso;
this.nomeCurso = nomeCurso;
}

WWW.COTIINFORMATICA.COM.BR 470
@Override
public String toString() {
return "Curso [id=" + idCurso + ", nomeCurso="
+ nomeCurso + "]";
}

public Long getIdCurso() {


return idCurso;
}

public void setIdCurso(Long idCurso) {


this.idCurso = idCurso;
}

public String getNomeCurso() {


return nomeCurso;
}

public void setNomeCurso(String nomeCurso) {


this.nomeCurso = nomeCurso;
}

public static long getSerialversionuid() {


return serialVersionUID;
}

public Set<Aluno> getAlunos() {


return alunos;
}

public void setAlunos(Set<Aluno> alunos) {


this.alunos = alunos;
}

public void adicionarAluno(Aluno a) {


if (this.alunos == null) {
this.alunos = new HashSet<Aluno>();
}
this.alunos.add(a);
}

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

Atenção! As linhas 5 e 6 têm que ficar juntas na mesma linha.


spring.jpa.hibernate.ddl-auto= update
spring.datasource.username=root
spring.datasource.password=coti
spring.jpa.show-sql=true
spring.datasource.url=jdbc:mysql://localhost:3306/BDfinal01
?createDatabaseIfNotExist=true
server.port=1237
spring.thymeleaf.enabled=false

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;

public void run(String... args) throws Exception {

adao.deleteAllInBatch(); // comeca apang


udao.deleteAllInBatch();

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);
}

public static void main(String[] args) {


SpringApplication.run(Application.class, args);
}
}

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

Visualizar as inserções no banco

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

Você também pode gostar