Escolar Documentos
Profissional Documentos
Cultura Documentos
Spring para Matar PDF
Spring para Matar PDF
Sobre os autores
Normandes Jos Moreira Junior
Scio e instrutor da AlgaWorks. Graduado em
Engenharia Eltrica pela Universidade Federal de
Uberlndia e detentor das certificaes LPIC-1, SCJP
e SCWCD. Palestrante da maior conferncia de Java
do mundo (JavaOne San Francisco), autor e co-autor
de vrios livros e instrutor de cursos de Java, JPA,
TDD, Design Patterns, Spring Framework, etc.
LinkedIn: https://www.linkedin.com/in/normandesjr
Twitter: @normandesjr
Alexandre Afonso
Instrutor Java na AlgaWorks, graduado em Sistemas
de Informao, est no mercado de programao
Java h mais de 8 anos, principalmente no
desenvolvimento de sistemas corporativos.
LinkedIn: https://www.linkedin.com/in/alexandreafon
Twitter: @alexandreafon
Antes de comear...
Antes que voc comece a ler esse livro, eu gostaria de combinar algumas coisas
com voc, para que tenha um excelente aproveitamento do contedo. Vamos l?
Sumrio
1 Introduo
2 O Spring
2.1
Introduo ................................................................................................... 12
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
O Thymeleaf ............................................................................................... 20
Funcionamento ........................................................................................... 24
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
4 Publicando a aplicao
4.1
Introduo ................................................................................................... 52
4.2
4.3
4.4
4.5
4.6
4.7
5 Concluso
5.1
Captulo 1
Introduo
s vezes a parte mais difcil para quem est comeando uma nova aplicao Java
web, mesmo se esse programador j conhece a linguagem, justamente comear!
Voc precisa criar a estrutura de diretrios para os vrios arquivos, alm de criar
e configurar o build file com as dependncias.
Se voc j programador Java para web, sempre que precisa criar um novo
projeto, o que voc faz? possvel que sua resposta seja: eu crio um novo projeto
e vou copiando as configuraes de outro que j est funcionando.
Se voc iniciante, seu primeiro passo ser procurar algum tutorial que te ensine
a criar o projeto do zero, e ento copiar e colar todas as configuraes no seu
ambiente de desenvolvimento at ter o hello world funcionando.
Esses so cenrios comuns no desenvolvimento web com Java quando estamos
usando ferramentas como Eclipse e Maven simplesmente, mas existem
alternativas a este castigo inicial da criao de um novo projeto, e esse um
dos objetivos desse livro, mostrar um caminho mais fcil e prazeroso para criar
um projeto web em Java com Spring Framework.
Ns vamos criar uma aplicao simples com Spring Boot, Spring MVC, Spring
Data JPA, Spring Security e Thymeleaf usando o Spring Tool Suite (STS), uma
IDE baseada no Eclipse que vem com o Spring Initializr (no est escrito errado,
Initializr mesmo), uma ferramenta muito til para criar nossos projetos com
Spring.
www.algaworks.com
11
Captulo 2
O Spring
2.1. Introduo
O Spring no um framework apenas, mas um conjunto de projetos que
resolvem vrias situaes do cotidiano de um programador, ajudando a criar
aplicaes Java com simplicidade e flexibilidade.
Existem muitas reas cobertas pelo ecossistema Spring, como Spring Data para
acesso a banco de dados, Spring Security para prover segurana, e diversos
outros projetos que vo de cloud computing at big data.
O Spring surgiu como uma alternativa ao Java EE, e seus criadores sempre se
preocuparam para que ele fosse o mais simples e leve possvel.
Desde a sua primeira liberao, em Outubro de 2002, o Spring tem evoludo
muito, com diversos projetos maduros, seguros e robustos para utilizarmos em
produo.
Os projetos Spring so Open Source, voc pode ver o cdigo-fonte no GitHub.
www.algaworks.com
12
www.algaworks.com
13
www.algaworks.com
14
@Autowired
private RepositorioCliente repositorio;
...
}
A priore pode parecer insignificante, mas o Spring no para por ai. Tem vrias
outras funcionalidades que so possveis ou, pelo menos, facilitadas por causa da
injeo de dependncias.
www.algaworks.com
15
www.algaworks.com
16
www.algaworks.com
17
www.algaworks.com
18
19
2.9. O Thymeleaf
A view ir retornar apenas um HTML para o browser do cliente, mas isso deixa
uma dvida: Como ela recebe os objetos Java, enviados pelo controller, e os
transforma em HTML?
Nessa hora que entra em ao o Thymeleaf!
Teremos um cdigo HTML misturado com alguns atributos do Thymeleaf, que
aps processado, ser gerado apenas o HTML para ser renderizado no browser
do cliente.
O Thymeleaf no um projeto Spring, mas uma biblioteca que foi criada para
facilitar a criao da camada de view com uma forte integrao com o Spring, e
uma boa alternativa ao JSP.
O principal objetivo do Thymeleaf prover uma forma elegante e bem formatada
para criarmos nossas pginas. O dialeto do Thymeleaf bem poderoso, como
voc ver no desenvolvimento da aplicao, mas voc tambm pode estend-lo
para customizar de acordo com suas necessidades.
Para voc ver como ele funciona, vamos analisar o cdigo abaixo.
<tr th:each="convidado : ${convidados}">
<td th:text="${convidado.nome}"></td>
<td th:text="${convidado.quantidadeAcompanhantes}"></td>
</tr>
www.algaworks.com
20
2.10. O Maven
O Maven uma ferramenta muito importante no dia a dia do desenvolvedor
Java, porque com ele ns conseguimos automatizar uma srie de tarefas.
Mas talvez o que mais fez o Maven ter sucesso, foi o gerenciamento de
dependncias. muito bom poder escrever algumas linhas e j ter a biblioteca
disponvel para o nosso projeto.
www.algaworks.com
21
www.algaworks.com
22
Nesse site voc consegue quase a mesma facilidade que vamos alcanar
utilizando o STS. Nele voc informa os dados do projeto, frameworks e
bibliotecas que deseja ter como dependncia, ento um projeto Maven ser
gerado para ser importado na sua IDE.
O que informar e o que selecionar, vamos ver nos prximos captulos.
www.algaworks.com
23
Captulo 3
O projeto de gesto de
convidados
3.1. Funcionamento
Bora colocar a mo na massa?
Vamos criar uma aplicao simples, do zero e passo a passo para voc ver como
o Spring Boot, o Spring MVC, o Spring Data JPA, o Spring Security e o Thymeleaf
funcionam juntos, e para isso vamos usar o Spring Tool Suite e o Maven.
Nossa aplicao ser til para a gesto de convidados em uma festa. Precisamos
do nome do convidado principal e a quantidade de acompanhantes que vm com
ele.
Na aplicao, teremos uma nica tela com dois campos de texto de entrada,
um para informar o nome do convidado e o outro para dizer a quantidade
de acompanhantes. Por exemplo, podemos cadastrar que o Joo levar 2
acompanhantes.
Tambm teremos um boto Adicionar e uma tabela para mostrar o que j foi
cadastrado. Veja como ser a verso final na imagem abaixo.
www.algaworks.com
24
25
www.algaworks.com
26
www.algaworks.com
27
Ateno: Se essa for a primeira vez que voc faz este procedimento, pode
demorar um pouco, pois muitas bibliotecas sero baixadas da internet.
Depois de criado, voc ver no Package Explorer, posicionado do lado
esquerdo no STS, uma estrutura como mostrado na imagem abaixo.
www.algaworks.com
28
Em
package com.algaworks.festa;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GestaoFestaApplication {
public static void main(String[] args) {
SpringApplication.run(GestaoFestaApplication.class, args);
}
}
www.algaworks.com
29
Ela diz que a classe faz parte da configurao do Spring. Poderamos adicionar
configuraes customizadas, por exemplo, definir o idioma ou at fazer
redirecionamentos caso no encontre uma pgina, mas como j vimos, o Spring
Boot define muitos comportamentos padronizados, e no precisaremos alterar
nada para ter a aplicao funcionando.
Tambm define o ponto de partida para a procura dos demais componentes
da aplicao, ou seja, todas as classes dos pacotes descendentes de
com.algaworks.festa sero escaneadas e, se algum componente Spring for
encontrado, ser gerenciado, e isso facilitar muito a nossa vida (voc ver no
desenvolvimento da aplicao).
www.algaworks.com
30
www.algaworks.com
31
O cdigo muito simples. Primeiro vamos anotar a classe com @Controller para
dizer que ela um componente Spring, e que um controller.
package com.algaworks.festa.controller;
import org.springframework.stereotype.Controller;
@Controller
public class ConvidadosController {
}
www.algaworks.com
32
Vamos chamar este mtodo de listar(), pois ele ser responsvel por listar os
convidados para mostrarmos na view mais a frente.
Esse mtodo pode retornar uma String, que o nome da view que iremos criar
daqui a pouco, chamada de ListaConvidados.
public String listar() {
return "ListaConvidados";
}
Ok. Mas agora surge uma dvida: qual URL que podemos digitar no browser
para esse mtodo ser chamado?
A que entra o papel da anotao @GetMapping. Vamos mapear para que a
requisio /convidados caia nesse mtodo. Para isso, s fazer como o cdigo
abaixo.
@GetMapping("/convidados")
public String listar() {
return "ListaConvidados";
}
www.algaworks.com
33
www.algaworks.com
34
Para vermos algo funcionando o mais rpido possvel, vamos criar uma pgina
simples com o Thymeleaf.
Para deixar nosso sistema mais bonito, vamos usar o Bootstrap. Iremos usar
tambm a biblioteca WebJars, que vai nos permitir gerenciar os recursos (CSS e
JS) necessrios do Bootstrap atravs do nosso arquivo pom.xml.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width" />
<title>Lista de Convidados</title>
<link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}"
rel="stylesheet"/>
<link th:href="@{/webjars/bootstrap/css/bootstrap-theme.min.css}"
rel="stylesheet"/>
</head>
<body>
<h1>AlgaWorks!</h1>
</body>
</html>
www.algaworks.com
35
www.algaworks.com
36
www.algaworks.com
37
Vamos testar?
Abra o browser e digite http://localhost:8080/convidados.
Essa URL far com que o Spring MVC chame o mtodo listar() do controller
ConvidadosController, que por sua vez retorna ListaConvidados, que o nome
da view ListaConvidados.html, que enviar para o cliente a pgina HTML.
www.algaworks.com
38
www.algaworks.com
39
package com.algaworks.festa.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.algaworks.festa.model.Convidado;
public interface Convidados extends JpaRepository<Convidado, Long> {
}
@Repository
que geralmente
Convidado
Convidados,
fazem
www.algaworks.com
40
@Autowired
private Convidados convidados;
@GetMapping("/convidados")
public ModelAndView listar() {
ModelAndView modelAndView = new ModelAndView("ListaConvidados");
modelAndView.addObject("convidados", convidados.findAll());
return modelAndView;
}
}
Repare que com @Autowired, podemos injetar o repositrio no controller, e isso nos
livra da preocupao de como receber esse objeto na classe.
Veja tambm a anotao @GetMapping que anota o nosso mtodo listar(). Ela
diz que nosso mtodo ir responder a requisio HTTP do tipo GET para
/convidados.
J dentro de listar(), o construtor de ModelAndView recebe o nome da view e com
o mtodo addObject() podemos adicionar objetos para a view.
www.algaworks.com
41
<div class="panel-body">
<table class="table">
<thead>
<tr>
<th>Nome</th>
<th>Acompanhantes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Joo</td>
<td>3</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
Repare que na tag tbody existe uma linha tr, mas o que queremos iterar sobre a
lista que o controller disponibilizou para a view, ao invs de deixar fixo como est.
Precisamos de algo que itere e gere vrias linhas (tr) e, nas colunas (td), permita
inserir o nome e a quantidade de acompanhantes do convidado.
Agora que o Thymeleaf entra em ao! Vamos usar dois atributos, o
th:each
www.algaworks.com
42
Antes dos dois pontos, criamos uma varivel local para podermos usar na
iterao. Repare que nas colunas, no atributo th:text usamos ${convidado.nome}
para mostrar o nome do convidado no contedo da coluna.
Para vermos a propriedade th:each em ao agora, vamos criar o arquivo
main/resources/import.sql e adicionar alguns registros dentro dele:
src/
S precisamos criar o arquivo import.sql e mais nada. Isso porque o Spring Boot
vai se encarregar de repassar esse arquivo ao Hibernate (nossa implementao de
JPA) para que ele o execute.
Reinicie o servidor e acesse novamente a URL http://localhost:8080/convidados,
voc dever ver a lista dos convidados.
www.algaworks.com
43
Agora que nosso HTML est pronto, vamos comear as modificaes para o
Thymeleaf e o Spring conseguirem salvar um novo convidado.
A primeira alterao ser no mtodo listar() do controller. Vamos adicionar um
objeto do tipo Convidado no ModelAndView.
Esse objeto chamado de command object, que o objeto que modela o formulrio,
ou seja, ele que ser setado com os valores das tags input da pgina.
Adicione simplesmente a linha abaixo no mtodo
ConvidadosController.
listar()
da classe
mv.addObject(new Convidado());
www.algaworks.com
44
*{}
A expresso
@{},
queremos utilizar links no nosso HTML, pois ela ir resolver o context path da
aplicao automaticamente.
Nosso formulrio est pronto, podemos ver que ele ser enviado via POST para
o endereo /convidados.
No nosso controller no existe um mtodo capaz de receber uma requisio POST
em /convidados. Vamos cri-lo agora:
@PostMapping("/convidados")
public String salvar(Convidado convidado) {
}
45
No mtodo acima, a string redirect:/convidados faz com que o browser faa uma
nova requisio GET para /convidados, fazendo com que a tabela seja atualizada
com a nova pesquisa.
Talvez voc esteja pensando que ficou repetido o mapeamento em @GetMapping
e @PostMapping nos mtodos listar e salvar, e esteja perguntando: tem como
melhorar?
A resposta sim, podemos adicionar o @RequestMapping na classe do controller.
@Controller
@RequestMapping("/convidados")
public class ConvidadosController {
@GetMapping
public ModelAndView listar() {
// ...
}
@PostMapping
public String salvar(Convidado convidado) {
www.algaworks.com
46
// ...
}
}
Agora as anotaes
/convidados.
@GetMapping
@PostMapping
www.algaworks.com
47
Depois voc configura a URL, o usurio e a senha do seu banco no arquivo src/
main/resources/application.properties:
spring.datasource.url=jdbc:mysql://localhost/comecandocomspringmvc
spring.datasource.username=root
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop
foi
www.algaworks.com
48
S de adicion-la, j criado o usurio user com uma senha que temos que copiar
do console toda vez que subimos a aplicao.
www.algaworks.com
49
package com.algaworks.festa.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication
.builders.AuthenticationManagerBuilder;
@Configuration
public class InMemorySecurityConfig {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder builder)
throws Exception {
builder
.inMemoryAuthentication()
.withUser("normandes").password("123").roles("USER")
.and()
.withUser("alexandre").password("123").roles("USER")
.and()
.withUser("thiago").password("123").roles("USER");
}
}
Observe
que
www.algaworks.com
50
www.algaworks.com
51
Captulo 4
Publicando a aplicao
4.1. Introduo
Esse captulo ser como a cereja do bolo. Veremos como fazer a publicao do
nosso projeto na nuvem, simulando que estamos colocando ele em produo.
Iremos utilizar a nuvem do Heroku e teremos a vantagem de ter toda a
plataforma configurada pelo mesmo. S precisamos enviar nossa aplicao.
Mas para isso, precisamos realizar algumas pequenas adaptaes para
compatibilizar o nosso projeto.
Basicamente, teremos que preparar nosso projeto para funcionar com o banco
de dados Postgres. Depois iremos precisar de duas instalaes sobre as quais
rodaremos os comandos para publicao do projeto.
Talvez voc se pergunte: Por que utilizar o Postgres? No Heroku no tem
MySQL?.
O Heroku tem sim o MySQL, mas para colocar ele em nossa aplicao ser
preciso fazer a confirmao da nossa conta.
Essa confirmao feita com a incluso do carto de crdito. Como muitos no
tem ou no querem informar um carto, ento vamos remover essa barreira
colocando o Postgres do Heroku, que no exige uma conta confirmada.
www.algaworks.com
52
Quem quiser confirmar a conta para utilizar o MySQL, pode ficar tranquilo
que no ser cobrado imediatamente por isso. A cobrana vir somente se for
feito um upgrade explcito no dashboard do Heroku ou atravs de comandos de
alterao dos tipos de hospedagem.
Para os que preferirem o MySQL, iremos tambm, nesse captulo, ver sobre as
adaptaes que sero necessrias.
www.algaworks.com
53
Essa nova estratgia vai, simplesmente, fazer uma consulta na base de dados do
tipo max(id) + 1 para buscar a prxima primary key. Com isso o problema anterior
eliminado.
Essa foi a forma escolhida para resolver essa questo, mas existem algumas
outras.
www.algaworks.com
54
heroku-db.properties
que
est sendo passado. No podemos esquecer dele, pois ele carrega a nossa
configurao para o banco de dados.
www.algaworks.com
55
De qualquer forma, os comandos que vou apresentar agora devero ser dados
pelo terminal (ou cmd do Windows), mais especificamente, de dentro da pasta
do projeto.
$ cd /pasta/do/projeto/gestao-festa
Ainda ser dado mais um comando com o Git, mas antes precisamos configurar
nossa aplicao no Heroku.
www.algaworks.com
56
Ser pedido um usurio e senha para voc. So os mesmos que voc informou no
cadastro dentro do site.
Agora podemos criar nossa aplicao l dentro do Heroku.
$ heroku create aw-gestao-festa
Usamos o comando create para isso. O parmetro passado o nome que nossa
aplicao ir ter no Heroku. O nome no obrigatrio e se no for passado, um
aleatrio ser gerado para voc.
O nome de uma aplicao no Heroku deve ser nico em todo o mundo! Caso
voc utilize um que j existe, receber uma mensagem de erro. A dica voc ter
um prefixo seu assim como foi feito acima. Veja que foi utilizado o prefixo aw
de AlgaWorks juntamente com o nome que gestao-festa.
Criamos a aplicao, mas o banco de dados ainda precisa ser adicionado. Como
voc j sabe, ns vamos adicionar o Postgres:
$ heroku addons:create heroku-postgresql:hobby-dev
Para quem confirmou a conta e quer utilizar o MySQL, basta adicionar o addon:
$ heroku addons:create cleardb:ignite
www.algaworks.com
57
At aqui temos a aplicao e o banco configurados, basta enviar ela agora com o
comando push do Git. J vamos fazer isso.
No momento em que criamos a nossa aplicao com heroku create foi adicionado
um repositrio remoto, de nome heroku, nas configuraes do nosso repositrio
local do Git.
Logo depois desse comando, o que voc deve ver no seu terminal algo parecido
com a figura abaixo:
Espere o processo acima encerrar e acesse o endereo https://nome-daaplicacao.herokuapp.com/convidados. Para facilitar, voc pode executar o
www.algaworks.com
58
comando open do Heroku CLI, que ele j abre o browser no endereo correto para
voc.
$ heroku open
Lembrando que, depois que o browser se abrir, voc ainda deve acessar o
contexto /convidados.
Tenho s mais dois comandos do Heroku que acho interessante que voc
conhea. Um o logs --tail e o outro o ps.
O comando
logs --tail,
Por ltimo, o comando ps serve para que voc veja alguns detalhes sobre a sua
hospedagem. Ao execut-lo:
$ heroku ps --app aw-gestao-festa
www.algaworks.com
59
www.algaworks.com
60
Captulo 5
Concluso
Que legal ter chegado ao final da leitura, estamos felizes por voc ter cumprido
mais essa etapa na sua carreira.
Esperamos que tenha colocado em prtica tudo que aprendeu. No se contente
em apenas ler esse livro. Pratique, programe, implemente cada detalhe, caso
contrrio, em algumas semanas j ter esquecido grande parte do contedo.
Afinal de contas, nada melhor do que colocar a mo na massa, no mesmo?! :)
Se voc gostou desse livro, por favor, ajude a manter esse trabalho. Recomende
para seus amigos de trabalho, faculdade e/ou compartilhe no Facebook e
Twitter.
61