Programação para a Web
Tópico 6 - Java Web
Prof. Hudson Silva Borges
[Link]@[Link]
Tópicos
● Introdução
● Plataforma Java
● Protocolo HTTP
● Java para WEB
● Spring Framework
○ Arquitetura
○ Conceitos Básicos
○ Acesso a dados
○ MVC vs cliente-servidor
● Conclusões e Referências
2
Programação para Web
Plataforma
Java
3
Plataforma Java
● Plataforma de desenvolvimento
● Linguagem Java
● Três sub-plataformas principais
○ Java SE
○ Java ME
○ Java EE
4
Plataforma Java
5
6
Certificações Java
7
JavaEE
● Plataforma para o desenvolvimento de
aplicações comerciais
● Aplicações executadas em Servidores de
Aplicação
● Suporte para:
○ Desenvolvimento de aplicações WEB
○ Conexão com banco de dados
○ Desenvolvimento baseado em componentes
○ Controle de transações
○ Outros…
8
JavaEE
● Principais APIs
○ JDBC e JPA: API para a conexão com bancos de dados e
mapeamento objeto relacional
○ Servlets: API para o desenvolvimento de aplicações WEB
○ EJB: API para o desenvolvimento baseado em componentes
○ JAX-RS: API para criação de RESTful Web Services
○ CDI: Injeção de dependências e contextos
○ WebSockets: API para comunicação usando sockets
○ outros ….
9
HTTP
10
Protocolo para Web
● HTTP:
○ Protocolo de transferência de arquivos hipertexto
○ Cliente/Servidor
○ Requisição → Resposta
11
12
13
Protocolo para Web
● Métodos HTTP
○ GET: solicita ao servidor o envio de um recurso.
○ HEAD: variante de GET que solicita ao servidor o envio apenas
de informações sobre o recurso.
○ PUT: permite que o cliente autorizado armazene ou altere o
conteúdo de um recurso mantido pelo servidor.
○ POST: permite que o cliente envie mensagens e conteúdo de
formulários para servidores que irão manipular a informação de
maneira adequada.
○ DELETE: permite que o cliente autorizado remova um recurso
mantido pelo servidor.
14
Protocolo para Web
● Métodos HTTP
○ GET: solicita ao servidor o envio de um recurso.
15
Protocolo para Web
● Métodos HTTP
○ POST: permite que o cliente envie mensagens e conteúdo de
formulários para servidores
16
Protocolo para Web
● Métodos HTTP
○ GET: solicita ao servidor o envio de um recurso.
○ HEAD: variante de GET que solicita ao servidor o envio apenas
de informações sobre o recurso.
○ POST: permite que o cliente envie mensagens e conteúdo de
formulários para servidores que irão manipular a informação de
maneira adequada.
○ PUT: permite que o cliente autorizado armazene ou altere o
conteúdo de um recurso mantido pelo servidor.
○ PATCH: parecido com o PUT, mas permite atualizar somente
parte do conteúdo.
○ DELETE: permite que o cliente autorizado remova um recurso
mantido pelo servidor. 17
Java para Web
18
Java para WEB
● Desenvolvimento de aplicações web completas e robustas e
de fácil manutenção
19
Construção de páginas dinâmicas
● JSP (Java Server Pages) é uma tecnologia para criação
de páginas com conteúdos dinâmicos
● Processamento feito pelo servidor
● Usado muitas vezes incorretamente como
controladores
● Atualmente existem alternativas mais eficientes para
construção de páginas web a partir de templates, como
Thymeleaf ou FreeMarker
20
Servlets
● Java Servlets são classes capazes de receber
requisições e responder às mesmas
● É executado pelo servidor ao receber requisições
● Devem estender a classe [Link]
● Permite o tratamento de requisições GET, POST, PUT,
DELETE, etc.
21
Java para WEB
● Servidor Web para uma aplicação escrita em Java
22
Java para WEB
● Na figura podemos observar:
○ Um cliente (Web Client), normalmente um navegador Web
○ Um servidor (Web Server), normalmente uma máquina com
alto poder de processamento e de armazenamento
○ Uma requisição HTTP (HTTP Request) sendo enviada pelo
cliente
○ O processamento da requisição pelo servidor
○ Uma resposta (HTTP Response) sendo enviada de volta ao
cliente
23
Java para WEB
● Arquitetura Clássica de Aplicações Web Java
24
Spring
Framework
25
Spring Framework
● Framework de desenvolvimento Java mais popular
● Possui um conjunto extenso de bibliotecas e plugins
● Aumenta a produtividade por meio de
configurações simplificadas
● Segurança em primeiro lugar
● Grande comunidade de desenvolvedores
26
Spring Framework
● Integra diversas bibliotecas da API do Java EE
○ Servlet API (JSR 340)
○ WebSocket API (JSR 356)
○ Concurrency Utilities (JSR 236)
○ JSON Binding API (JSR 367)
○ Bean Validation (JSR 303)
○ JPA (JSR 338)
○ JMS (JSR 914)
○ as well as JTA/JCA setups for transaction
coordination, if necessary.
27
Módulos do Spring Framework
28
Arquitetura do Spring Framework
29
Lidando com
Controllers requisições de
usuários
30
Spring Controllers
Controllers são classes com as seguintes responsabilidades:
● Interceptar requisições de usuários
● Converter os dados da requisição
● Enviar o Model para processamento
● Obter dados do Model e enviar para a View
31
Spring Controllers
32
Spring Controllers
● Controllers são definidos como classes em Java
● O framework consegue identificar automaticamente
● São responsáveis por tratar de requisições para
determinados caminhos
33
Spring Controllers
@Controller
Anotação que indica que a classe é uma controladora
@RequestMapping
Mapeia um caminho no qual ela irá responder
34
Spring Controllers
● Controladores devem responder à métodos de requisição
HTTP (GET, POST, PATCH, etc.)
● Além de @RequestMapping, podemos usar anotações
específicas como no exemplo abaixo.
[Link] 35
Spring Controllers
● A anotação @RequestBody indica que o conteúdo será
retornado diretamente a quem fez a requisição.
● Se omitir essa anotação, o Spring buscará pela visão com o
nome fornecido (abordaremos isso adiante)
[Link] 36
Colocando em
Controllers prática o nosso
“Hello world!”
37
Preparando o VSCode
● Extensões recomendadas:
○ Extension Pack for Java
■ Language Support for Java(TM) by Red Hat
■ Debugger for Java
■ Test Runner for Java
■ Maven for Java
■ Project Manager for Java
■ Visual Studio IntelliCode
○ Spring Boot Extension Pack
○ Copilot
38
Criando um projeto Spring Boot
[Link]
39
Prática: Primeiro app web
● Vamos colocar a mão na massa!
● Abra o endereço e configure a aplicação:
○ URL: [Link]
○ Pacotes: Spring Boot DevTools, Spring Web e Thymeleaf
○ Tipo de projeto: Gradle
● No VSCode, abra o projeto que acabou de baixar e:
○ ./gradlew bootRun
● Pronto, você já tem seu projeto base!
40
Prática: Primeiro app web
[Link] 41
Explorando ainda
Controllers mais o potencial
42
Lidando com informações da requisição
● Podemos receber informações de diferentes formas:
○ Valores via URL
○ Valores no caminho requisitado
○ Valores no header da requisição
○ Valores de cookies
○ Valores no corpo da requisição
○ Requisição original via Servlet
○ outros ….
● Esses meios serão abordados a seguir
43
Valores via querystring (URL)
● Querystring é a parte da URL que fica após o símbolo de
interrogação (?)
● Podemos obter tais informações com a anotação
@RequestParam
44
Valores via caminho na URL
● Muitas vezes a melhor solução é a construção de URLs com
valores dinâmicos.
● Por exemplo, lojas podem indicar nomes ou identificadores
de produtos, tal como [Link]
● Podemos mapear tais caminhos em @GetMapping e obter
seus valores com @PathVariable
45
Obtendo dados do header da requisição
● Podemos obter informações enviadas pelo navegador no
header da requisição com @RequestHeader
● Por exemplo, podemos verificar qual navegador o usuário
está usando.
46
Usando cookies (salvando e recuperando)
● Cookies permitem que aplicações web salvem informações
nos navegadores de seus usuários
● Tipicamente, são informações compartilhadas com as
próprias aplicações a cada requisição
● No Spring podemos usar RespondeCookie e @CookieValue
para enviar e receber valores de cookies, respectivamente.
47
Usando cookies (salvando e recuperando)
48
Dados no corpo da requisição
● Requisições do tipo POST, PUT e PATCH, as informações são
enviadas no corpo da requisição.
● Podemos usar de @RequestParam para obter dados
individuais ou podemos usar de @RequestBody para obter
um modelo (com validação) dos dados da requisição.
● O @RequestBody pode ser usado em conjunto com todos
os demais métodos de obtenção de informações.
49
Refinando resposta com ResponseEntity
● Ao usarmos a anotação @ResponseBody, estamos
indicando o retorno do conteúdo da resposta.
● Contudo, podemos refinar as respostas retornando uma
instância de ResponseEntity<T>.
● Podemos retornar códigos de resposta específicos e
informações adicionais no cabeçalho (header).
50
Praticando
@Atividade uso de
Controllers
51
Atividade prática
Imagine que você é responsável por implementar uma
aplicação web simples que faz operações básicas, como soma
e subtração, mas você deverá registrar quantas vezes o usuário
realizou a requisição.
Objetivo específico: Implementar a operação de soma usando
os métodos GET e POST e salvar a quantidade de vezes nos
cookies dos usuários.
52
Construção de
View páginas dinâmicas
com Thymeleaf
53
Construção de página dinâmicas
● Aplicações (web) lidam com dados e informações
● Tais informações precisam ser apresentadas para usuários
● HTML permite a estruturação de informações, mas são
conteúdos estáticos
● Aplicações que possuem informações dinâmicas ou
customizadas, precisam construir as páginas (HTML) antes
de enviá-las para os clientes
54
Template Engines
● Template engines permitem construir modelos (templates)
de páginas de forma estática que são usados, em tempo de
execução, para construção de páginas HTML finais
● Para isso, as aplicações substituem variáveis (marcações)
inseridas nestes modelos por conteúdos fornecidos pela
aplicação
● O resultado são páginas HTML (ou até mesmo outros tipos)
que são enviadas aos clientes para visualização.
55
Template Engines e View (MVC)
● Template engines permitem construções de visões no estilo
arquitetural MVC
56
Template Engines para Java
57
[Link]
● Thymeleaf é uma template engine moderna
● Oferece formas naturais e elegantes de construir templates
● Pode ser aberto diretamente em navegadores em tempo de
desenvolvimento
[Link]
58
Expression Syntax
59
Expression Syntax
60
Expression Syntax
61
Expression Syntax
62
Iteração e condicionais
[Link]
[Link]
63
Retornando uma visão pelo @Controller
64
Passando atributos para a Visão
65
Passando atributos para a Visão
66
Exemplo: Thymeleaf + Spring boot
67
Lidando com dados em
JDBC & JPA aplicações Web
68
JDBC (Java DataBase Connectivity)
● API para conexão com o banco de dados
● É um conjunto de classes e interfaces (API) escritas em Java
que fazem o envio de instruções SQL para qualquer banco
de dados relacional
● Cada banco de dados possui um driver para conexão
69
JPA (Java Persistence API)
● API para comunicação com banco de dados do EJB
● É uma API padrão do java para persistência que deve ser
implementada por frameworks que queiram seguir o padrão
● A JPA define um meio de mapeamento objeto-relacional
para objetos Java simples e comuns (POJOs), denominados
beans de entidade (Entity Beans)
● O JPA usa o JDBC para se comunicar com o banco de dados
70
JPA (Java Persistence API)
● Diversos frameworks de mapeamento objeto/relacional
implementam a JPA
○ Hibernate, OpenJPA, Oracle TopLink
● Também gerencia o desenvolvimento de entidades do
Modelo Relacional usando a plataforma nativa Java SE e
Java EE
71
JPA (Java Persistence API)
● Java Persistence API: Primeira especificação (padrão) de
mapeamento de objetos Java para base de dados relacional
○ Integração com outros frameworks
■ Hibernate é uma implementação de JPA
■ TopLink Essencials é uma implementação de JPA (RI)
● POJO (Plain Old Java Objects) → Entidades
○ Mapeamento via metadados (annotation Java 5)
● Pode ser utilizado fora de containers EJBs (lightweight
container)
● Uso de injeção de dependência ao invés de lookups JNDI
72
JPA (Java Persistence API)
73
JPA & Entidades
74
JPA & Entidades - Ciclo de Vida
75
JPA & Entidades - Ciclo de Vida
[A] new / create – criação/instanciação do
objeto
[B] find / query – busca no banco de dados
com o retorno do objeto
[C] persist – o objeto novo é armazenado no
banco de dados
[D] alter– alguma propriedade do objeto foi
alterada, fazendo com que o mesmo fique em
um estado diferente do armazenado no banco
de dados
[E] merge/update – o objeto é novamente
persistido e suas alterações são armazenadas no
banco de dados
[F] remove/ delete – o objeto é apagado do
banco de dados, mas ainda existe em memória
[G] [H] o objeto em memória é coletado pelo
garbage collector
76
JPA & Entidades - Elementos importantes
● Entidades (@Entity)
● Identificadores (@ID)
● Colunas (@Column)
● Relacionamentos (@OneToOne, @ManyToOne)
● Herança (@Inheritance)
77
Lidando com dados em
Spring Data aplicações Web
(JPA) com Spring Framework
78
Spring Data
● Repositórios e mapeamento de objetos
● Consulta dinâmica a partir dos nomes dos métodos
● Suporte para auditoria transparente (criada, última alterada)
● Integração fácil com Spring
● Integração avançada com controladores Spring MVC
● Suporte experimental para persistência cruzada de
armazenamento
79
Spring Data JPA
● Biblioteca do Spring Framework que implementa as
especificações do JPA e é facilmente integrável a projetos
do Spring.
[Link]
80
Spring Data JPA
81
Spring Data JPA
82
Spring Data Começando a usar o
Spring Data JPA …
(JPA)
83
Spring Data JPA - Prática
● Crie um projeto Spring Boot e inclua:
○ Spring Boot DevTools
○ Spring Web
○ Spring Data JPA
○ H2 Database
● Não criaremos interfaces, logo não é necessária template
engines
84
Spring Data JPA - Prática
● Configure o arquivo [Link] com:
85
Spring Data JPA - Prática
● Crie uma classe Aluno
86
Spring Data JPA - Prática
● Crie um controlador e disponibilize um endpoint para
consulta de alunos e outro para contagem de alunos por
curso.
87
RESTful Migrando para arquiteturas
distribuídas
Applications
88
Evolução das Aplicações Web
● Aplicações web evoluíram em complexidade e formas de
acesso;
● Como criar aplicações web que permitam o acesso a partir
de diferentes dispositivos?
89
Web Application >> Web Services
● Web Service é um sistema para distribuição de
componentes, objetos ou serviços;
● Objetiva prover suporte nas interações entre sistemas
diferentes ligados em rede;
● A ideia básica é disponibilizar uma plataforma distribuída,
independente de linguagem e baseada em padrões Web
90
Web Application >> Web Services
Servidor Web
Aplicação
Mobile
Aplicação
incluirCliente
Aplicação
fazerPedido Desktop
listarContasPagar
Aplicação
Web
91
API para RESTful Web Services (JAX-RS)
● REST (REpresentational State Transfer) é um estilo de
arquitetura para sistemas distribuídos
● Alternativa popular ao uso de tecnologias baseadas em
SOAP
● Leve e com capacidade de transmitir dados via requisições
HTTP
● JSR 311 - API Java para Web services RESTful (JAX-RS)
92
API para RESTful Web Services (com Spring)
● O Spring Framework oferece uma implementação própria
baseada no JAX-RS
● Oferece integração bem mais simplificada
93
API para RESTful Web Services (com Spring)
● O Spring Framework oferece uma implementação própria
baseada no JAX-RS
● Oferece integração bem mais simplificada
94
REST API com @RestController
● Podemos usar de @RestController para criar RESTful
Applications com Spring framework;
● Pode ser considerado uma simplificação para o uso de
@Controller + @ResponseBody nos endpoints;
● O resultado será application/json por padrão.
95
REST API com @RestController
● Além de respostas em JSON, requisições também deve ser
realizadas com dados codificados no mesmo formato
96
IoC Transferindo o controle dos
objetos para o container
(Inversion of Control)
97
Inversão de Controle
● Princípio amplamente usado por aplicações Java onde o
desenvolvedor transfere a responsabilidade de gestão
destes para o container;
● Vantagens:
○ Desacoplamento entre implementação e uso
○ Fácil alternação entre implementações
○ Aumento da modularidade da aplicação
○ Facilita testes e criação de mocks
98
Inversão de Controle no Spring
● No Spring, o container é responsável por inicializar,
configurar e conectar objetos conhecidos como beans.
99
Dependency Injection (DI)
● Injeção de Dependência é o processo de injeção de objetos,
gerenciados pelo container, via propriedades, construtores
ou métodos ao criar um objeto;
● Esse processo facilita o desacoplamento entre objetos.
100
Dependency Injection (DI)
● @Component é uma anotação que permite o Spring
detectar automaticamente um bean que será gerenciado
pelo container;
● @Autowired faz a injeção da dependência a partir da
instância gerenciada pelo container.
101
Dependency Injection (DI) - Tipos
● @Component estereótipo genérico para um componente
gerenciável;
● @Repository componente da camada de persistência;
● @Controller componente da camada Web;
● @Service componente da camada de serviço
● @Configuration permite a instanciação de componentes
(beans) customizados.
102
Dependency Injection (DI) - @Service
● @Service componente da camada de serviço
○ Serviços são abstrações que permitem o encapsulamento da
lógica de negócio em um componente compartilhável;
○ Eles seguem o princípio de criação de fachadas em aplicações
de software (a.k.a. Facade Design Pattern);
○ São formas de extrair a lógica do negócio de componentes
que lidam com requisições web (@Controller);
○ A proposta é fazer com que controladores passem sempre
pela camada de serviços, sem acessar a camada de dados
diretamente.
103
Dependency Injection (DI) - @Service
● @Service componente da camada de serviço
104
Dependency Injection (DI) - @Service
● @Service componente da camada de serviço
105
Dicas de técnicas para
melhorar a qualidade da
Boas Práticas aplicação
106
Padrões e princípios de desenvolvimento
● O Spring framework é uma ferramenta bastante flexível e
customizável;
● Desenvolvedores podem projetar e desenvolver seus
projetos seguindo princípios nos quais julgam serem
adequados para seus projetos;
● Contudo, existem alguns padrões bastante conhecidos e
frequentemente aplicados em aplicações web, inclusive
desenvolvidos em outras linguagens/frameworks.
107
Controller-Service-Repository
108
Controller-Service-Repository
Controller: Camada responsável por lidar com requisições
dos usuários e especificidades do protocolo
usado (e.g., REST);
Service: Implementação da lógica de negócio que pode
ser reutilizada por outros componentes, inclusive
outras camadas com diferentes protocolos;
Repository: Camada responsável por lidar com as entidades
de dados
109
Controller-Service-Repository
110
DTO - Data Transfer Object
● Entidades do domínio muitas vezes são carregadas de
informações de interesse próprio da aplicação e até mesmo
estruturadas de forma específica;
● Esses detalhes muitas vezes não podem, devem, ou são
adequados de serem compartilhados;
● É muito frequente a necessidade de criar entidades
derivadas mais simples para comunicação com clientes.
111
DTO - Data Transfer Object
[Link]
[Link]
112
DTO - Data Transfer Object
113
Estrutura do projeto
● No desenvolvimento de aplicações web, a organização dos
arquivos desenvolvidos também é importante
● No geral, existem duas formas principais de organizar os
arquivos de um projeto: por camada ou por funcionalidade
● As duas formas são frequentemente usadas de acordo com
a preferência do desenvolvedor/time
● Ao longo do tópico, as aplicações usadas como exemplo
foram organizadas por funcionalidade
114
Estrutura do projeto - Por camada
115
Estrutura do projeto - Por funcionalidade
116
Estrutura do projeto
● As duas formas são frequentemente usadas de acordo com
a preferência do desenvolvedor/time
● Ao longo do tópico, as aplicações usadas como exemplo
foram organizadas por funcionalidade
117
Documentação de APIs
● Documentação impacta diretamente no uso e adoção de
APIs
● Porque devemos documentar APIs?
○ Melhoria da adoção por usuários
○ Maior conscientização
○ Redução do tempo de suporte e custos
○ Melhoria da manutenção
118
Documentação de APIs
● SpringDoc ([Link]) é uma biblioteca para geração
automatizada de documentação de APIs usando Spring Boot
119
Documentação de APIs
120
Testes Aproveitando o melhor do
framework, que são seus
e pacotes para atividades
críticas …
Segurança
121
Testes em aplicações web
● Testes são atividades conduzidas com intuito de evitar que
erros cheguem ao usuário final e causem prejuízos
● Com métodos ágeis, testes tornaram-se uma das práticas
de programação mais valorizadas em desenvolvimento
moderno de software
● “Code without tests is bad code.” – Michael Feathers
122
Testes com Spring framework
● O Spring framework possui uma biblioteca de testes que
acompanha o pacote Spring MVC e REST
● Basicamente, ele inclui bibliotecas que permite aos
desenvolvedores testarem suas aplicações (e.g., JUnit).
123
Testes com Spring framework
124
Testes com Spring framework
125
Segurança em aplicações
● Aplicações web tipicamente lidam com informações críticas,
que devem ser protegidas por diversos motivos
● Tais informações devem ser compartilhadas somente com
usuários que tenham permissão para tal
● No desenvolvimento, requisitos relacionados à autenticação
e autorização são muito frequentes
● Além disso, devemos proteger aplicações contra diferentes
ataques que tentam acessar indevidamente tais informações
126
Segurança no Spring framework
● O framework Spring oferece um pacote de segurança que
possibilidade a proteção de aplicações desenvolvidas
usando Spring
[Link]
127
Segurança no Spring framework
● Para usar o pacote é necessário que desenvolvedores
adicionem a dependência e façam a configuração do mesmo
em suas aplicações
128
Segurança no Spring framework
129
Segurança no Spring framework
● O pacote permite a configuração a partir de diversas fontes,
como banco de dados, sistemas externos, e inclusive
processos simples como autenticação pré-definidas
130
Segurança no Spring framework
● Se tentarmos acessar um caminho protegido, seremos
impedidos e redirecionados para a página de autenticação
● Se não tivermos permissão, seremos impedidos de acessar
o recurso
131
Programação para a Web
Tópico 6 - Java Web
Prof. Hudson Silva Borges
[Link]@[Link]