You are on page 1of 64

Produtividade no Desenvolvimento de Aplicaes

Web com Spring Boot


por Normandes Junior e Alexandre Afonso
2 Edio, 10/01/2017

2017 AlgaWorks Softwares, Treinamentos e Servios Ltda. Todos os direitos


reservados.
Nenhuma parte deste livro pode ser reproduzida ou transmitida em qualquer
forma, seja por meio eletrnico ou mecnico, sem permisso por escrito da
AlgaWorks, exceto para resumos breves em revises e anlises.
AlgaWorks Softwares, Treinamentos e Servios Ltda
www.algaworks.com
contato@algaworks.com
+55 (11) 2626-9415

Siga-nos nas redes sociais e fique por dentro de tudo!

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?

O que voc precisa saber?


Voc s conseguir absorver o contedo desse livro se j conhecer pelo menos o
bsico de Java, Orientao a Objetos e HTML. Caso voc ainda no domine esses
assuntos, pode ser interessante estudar por nossos cursos online.

Como obter ajuda?


Durante os estudos, muito comum surgir vrias dvidas. Ns gostaramos
muito de te ajudar pessoalmente nesses problemas, mas infelizmente no
conseguimos fazer isso com todos os leitores do livro, afinal, ocupamos grande
parte do dia ajudando os alunos de cursos online na AlgaWorks.
Ento, quando voc tiver alguma dvida e no conseguir encontrar a soluo no
Google ou com seu prprio conhecimento, nossa recomendao que voc poste
na nossa Comunidade Java no Facebook. s acessar:
http://alga.works/comunidadejava/

Como sugerir melhorias ou reportar erros sobre este


livro?
Se voc encontrar algum erro no contedo desse livro ou se tiver alguma
sugesto para melhorar a prxima edio, vamos ficar muito felizes se voc
puder nos dizer.
Envie um e-mail para livros@algaworks.com.

Onde encontrar o cdigo-fonte do projeto?


Neste livro, ns vamos desenvolver um pequeno projeto passo a passo. O link
para baixar o cdigo-fonte foi enviado para seu e-mail quando voc se inscreveu
para receber o livro.
Caso voc tenha perdido esse link, acesse http://alga.works/livro-spring-boot/
para receb-lo novamente.

Ajude na continuidade desse trabalho


Escrever um livro (mesmo que pequeno, como esse) d muito trabalho, por isso,
esse projeto s faz sentido se muitas pessoas tiverem acesso a ele.
Ajude a divulgar esse livro para seus amigos que tambm se interessam por
programao Java. Compartilhe no Facebook e Twitter!

Sumrio
1 Introduo
2 O Spring
2.1

Introduo ................................................................................................... 12

2.2

Spring vs Java EE ....................................................................................... 12

2.3

O Spring Framework ................................................................................. 13

2.4

Injeo de dependncias com Spring ...................................................... 14

2.5

O Spring MVC ............................................................................................ 15

2.6

O Spring Data JPA ..................................................................................... 17

2.7

O Spring Security ....................................................................................... 18

2.8

O Spring Boot ............................................................................................. 19

2.9

O Thymeleaf ............................................................................................... 20

2.10 O Maven ...................................................................................................... 21


2.11 O Spring Tool Suite - STS .......................................................................... 21

3 O projeto de gesto de convidados


3.1

Funcionamento ........................................................................................... 24

3.2

Criando o projeto no STS .......................................................................... 25

3.3

Criando o controller .................................................................................. 30

3.4

Criando a pgina ........................................................................................ 33

3.5

Rodando o projeto pela primeira vez ..................................................... 37

3.6

Repositrio de convidados ....................................................................... 38

3.7

Enviando um objeto do Controller para a View ................................... 40

3.8

Listando objetos com o Thymeleaf .......................................................... 41

3.9

Adicionando um convidado ..................................................................... 44

3.10 Escolhendo o banco de dados .................................................................. 47


3.11 Deixando a aplicao segura .................................................................... 49

4 Publicando a aplicao
4.1

Introduo ................................................................................................... 52

4.2

Usando o Postgres ..................................................................................... 53

4.3

Alterao de estratgia para chave primria ......................................... 54

4.4

Criando o arquivo de inicializao .......................................................... 55

4.5

Instalando o Git .......................................................................................... 55

4.6

Configurando a aplicao no Heroku ..................................................... 56

4.7

Enviando a aplicao ................................................................................. 58

5 Concluso
5.1

Prximos passos ......................................................................................... 61

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.

2.2. Spring vs Java EE


O Spring no chega a ser 100% concorrente do Java EE, at porque, com Spring,
voc tambm usa tecnologias que esto dentro do Java EE.

www.algaworks.com

12

Mas existem programadores que preferem trabalhar com os projetos do Spring, e


outros que preferem trabalhar com as especificaes do Java EE, sem Spring.
Como o Spring independente de especificao, novos projetos so lanados e
testados muito mais rapidamente.
De fato, existem vrios projetos que so lanados em beta para a comunidade, e
caso exista uma aceitao geral, ele vai pra frente, com o apoio de uma grande
massa de desenvolvedores.

2.3. O Spring Framework


fcil confundir todo o ecossistema Spring com apenas o Spring Framework.
Mas, o Spring Framework apenas um, dentre o conjunto de projetos, que o
Spring possui.
Ele o projeto do Spring que serve de base para todos os outros, talvez por isso
haja essa pequena confuso.
Ele foi pensado para que nossas aplicaes pudessem focar mais na regra de
negcio e menos na infraestrutura.
Dentre suas principais funcionalidades, podemos destacar:
O Spring MVC
Suporte para JDBC, JPA
Injeo de dependencias (Dependency injection DI)
O Spring MVC, que falaremos melhor mais para frente, um framework para
criao de aplicaes web e servios RESTful. Ele bastante conveniente, pois,
muitas das aplicaes que construmos hoje em dia precisam atender requisies
web.
Com o mesmo pensamento do Spring MVC, temos o suporte para JDBC e JPA.
Isso porque persistncia tambm um recurso muito utilizado nas aplicaes.
difcil conceber uma aplicao hoje que no grave ou consulte algum banco de
dados.

www.algaworks.com

13

Por ltimo, assim como o Spring Framework a base do ecossistema, a injeo


de dependncias a base do Spring Framework. Imagino que os projetos Spring
seriam quase que uma baguna caso esse conceito no tivesse sido
implementado.

2.4. Injeo de dependncias com Spring


Injeo de dependncias (ou Dependency Injection DI) um tipo de inverso
de controle (ou Inversion of Control IoC) que d nome ao processo de prover
instncias de classes que um objeto precisa para funcionar.
A grande vantagem desse conceito que ns conseguimos programar voltados
para interfaces e, com isso, manter o baixo acoplamento entre as classes de um
mesmo projeto.
Com certeza, essa caracterstica uma grande vantagem para a arquitetura do
seu sistema assim como para o prprio Spring.
Como foi dito mais no incio, essa pequena-grande funcionalidade a base
de todo o ecossistema Spring. difcil pensar em Spring sem a injeo de
dependncias. Sendo assim, esse um conceito que merece a ateno da sua
parte.
Para entender um pouco de como na prtica, ao invs de voc fazer isso:
public class ServicoCliente {
// Nesse exemplo estou supondo que "RepositorioCliente" uma
// interface. Mas poderia ser uma classe abstrata ou
// mesmo uma classe concreta.
private RepositorioCliente repositorio = new RepositorioClienteImpl();
...
}

Voc vai fazer isso:


public class ServicoCliente {

www.algaworks.com

14

@Autowired
private RepositorioCliente repositorio;
...
}

A anotao @Autowired avisa ao Spring Framework para injetar uma instncia


de alguma implementao da interface RepositorioCliente na propriedade
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.

2.5. O Spring MVC


Dentre os projetos Spring, o Spring MVC o framework que te ajuda no
desenvolvimento de aplicaes web robustas, flexveis e com uma clara
separao de responsabilidades nos papis do tratamento da requisio.
MVC acrnimo de Model, View e Controller, e entender bem o que cada um
deve fazer na aplicao importante para termos uma aplicao bem escrita e
fcil para dar manuteno.
Vamos parar um pouco e pensar no que fazemos todos os dias quando estamos
na internet.
Primeiro abrimos um browser (Chrome, Safari, Firefox), digitamos um endereo
na barra de endereos, clicamos no Enter e pronto, se nada der errado, uma
pgina HTML ser renderizada para ns.
Mas, o que acontece entre o Enter e a pgina HTML ser renderizada? Claro que
existem centenas de linguagens de programao e frameworks diferentes, mas
ns vamos pensar no contexto do Spring MVC.

www.algaworks.com

15

1. Acessamos uma URL no browser que envia a requisio HTTP para


o servidor que roda a aplicao web com Spring MVC. Esse servidor
pode ser o Apache Tomcat, por exemplo. Perceba que quem recebe a
requisio o controlador do framework, o Spring MVC.
2. O controlador do framework, ir procurar qual classe responsvel por
tratar essa requisio, entregando a ela os dados enviados pelo browser.
Essa classe faz o papel do controller.
3. O controller passa os dados para o model, que por sua vez executa todas as
regras de negcio, como clculos, validaes e acesso ao banco de dados.
4. O resultado das operaes realizadas pelo model retornado ao
controller.
5. O controller retorna o nome da view, junto com os dados que ela precisa
para renderizar a pgina.
6. O Framework encontra a view que processa os dados, transformando
o resultado em um HTML.
7. Finalmente, o HTML retornado ao browser do usurio.
Pare um pouco e volte na figura acima, leia mais uma vez todos os passos desde
a requisio do browser, at a pgina ser renderizada de volta a ele.
Como voc deve ter notado, temos o Controller tratando a requisio, ele o
primeiro componente que ns vamos programar para receber os dados enviados
pelo usurio.

www.algaworks.com

16

Mas muito importante estar atento e no cometer erros adicionando regras


de negcio, acessando banco de dados ou fazendo validaes nessa camada,
precisamos passar essa responsabilidade para o Model.
No Model, pensando em algo prtico, o local certo para usarmos o JPA/Hibernate
para salvar ou consultar algo no banco de dados, onde iremos calcular o valor
do frete para entrega de um produto, por exemplo.
A View ir desenhar, renderizar, transformar em HTML esses dados para que o
usurio consiga visualizar a informao, pois enquanto estvamos no Controller e
no Model, estvamos programando em classes Java, e no em algo visual para o
browser exibir ao usurio.
Essa a ideia do MVC, separar claramente a responsabilidade de cada
componente dentro de uma aplicao. Por qu? Para facilitar a manuteno do
seu cdigo, temos baixo acoplamento, e isso uma boa prtica de programao.

2.6. O Spring Data JPA


Spring Data JPA um dos projetos do Spring Data.
O Spring Data um projeto que tem o objetivo de simplificar o acesso a
tecnologias de armazenamento de dados. Sejam elas relacionais (MySQL,
Postgres, etc) ou no (MongoDB, Redis, etc).
O Spring Data j possui vrios projetos dentro dele, como:

Spring Data Commons


Spring Data JPA
Spring Data Gemfire
Spring Data KeyValue
Spring Data LDAP
Spring Data MongoDB
Spring Data REST
Spring Data Redis
Spring Data for Apache Cassandra

www.algaworks.com

17

Spring Data for Apache Solr


Mas aqui ns vamos focar no mais utilizado, que o Spring Data JPA.
O suporte do Spring Framework para JPA j muito bom, mas o projeto Spring
Data JPA vai bem alm. Ele ajuda os desenvolvedores padronizando o uso de
algumas funcionalidades, e isso faz com que tenhamos menos esforo para
implementar as mesmas coisas de antes.
Um exemplo disso seria a implementao padro que ele j nos d em
repositrios para mtodos como save, delete, findOne, entre outros.
Esse exemplo no foi dado toa. Mais para frente, faremos o uso da interface
JpaRepository que nos ajudar com essa funcionalidade.

2.7. O Spring Security


Como o prprio nome denuncia, esse projeto trata da segurana em nvel de
aplicao. Ele tem um suporte excelente para autenticao e autorizao.
Spring Security torna bem simples a parte de autenticao. Com algumas poucas
configuraes j podemos ter uma autenticao via banco de dados, LDAP ou
mesmo por memria. Sem falar nas vrias integraes que ele j suporta e na
possibilidade de criar as suas prprias.
Quanto a autorizao, ele bem flexvel tambm. Atravs das permisses que
atribumos aos usurios autenticados, podemos proteger as requisies web
(como as telas do nosso sistema, por exemplo), a simples invocao de um
mtodo e at a instncia de um objeto.
Sem contar que, por tabela, ns j protegemos as nossas aplicaes de diversos
ataques como o Session Fixation e o Cross Site Request Forgery.

www.algaworks.com

18

2.8. O Spring Boot


Enquanto os componentes do Spring eram simples, sua configurao era
extremamente complexa e cheia de XMLs. Depois de um tempo, a partir da
verso 3.0, a configurao pde ser feita atravs de cdigo Java.
Mas mesmo com configurao via cdigo Java, que trouxe benefcios, como evitar
erros de digitao, pois a configurao agora precisa ser compilada, ainda assim
precisvamos escrever muito cdigo explicitamente.
Com toda essa configurao excessiva, o desenvolvedor perde o foco do mais
importante: o desenvolvimento da aplicao, das regras de negcio e da entrega
do software.
Talvez a maior revoluo e o maior acerto dos projetos Spring, foi o Spring Boot.
Com ele voc alcana um novo paradigma para desenvolver aplicaes Spring
com pouco esforo.
O Spring Boot trouxe agilidade, e te possibilita focar nas funcionalidades da sua
aplicao com o mnimo de configurao.
Vale destacar que, toda essa mgica que o Spring Boot traz para o
desenvolvimento Spring, no realizado com gerao de cdigo. No, o Spring
Boot no gera cdigo! Ele simplesmente analisa o projeto e automaticamente o
configura.
claro que possvel customizar as configuraes, mas o Spring Boot segue o
padro que a maioria das aplicaes precisa, ento, muitas vezes no preciso
fazer nada.
Se voc j trabalha com o Maven, sabe que precisamos adicionar vrias
dependncias no arquivo pom.xml, que pode ficar extenso, com centenas de linhas
de configurao, mas com o Spring Boot podemos reduzir muito com os starters
que ele fornece.
Os starters so apenas dependncias que agrupam outras, assim, se voc precisa
trabalhar com JPA e Hibernate por exemplo, basta adicionar uma nica entrada
no pom.xml, que todas as dependncias necessrias sero adicionadas ao classpath.
www.algaworks.com

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>

A expresso ${} interpreta variveis locais ou disponibilizadas pelo controller.


O atributo th:each itera sobre a lista convidados, atribuindo cada objeto na
varivel local convidado. Isso faz com que vrios elementos tr sejam renderizados
na pgina.
Dentro de cada tr existem 2 elementos td. O texto que eles iro exibir vem do
atributo th:text, junto com a expresso ${}, lendo as propriedades da varivel
local convidado.

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.

Como comear com Apache Maven?


Para saber mais sobre como comear com o Apache Maven, recomendo
voc assistir esta videoaula gratuita no blog da AlgaWorks.
http://blog.algaworks.com/comecando-com-apache-maven-em-projetosjava

2.11. O Spring Tool Suite - STS


O Spring Tool Suite, ou STS, um Eclipse com vrios plugins teis para o
trabalho com o Spring.
Existem verses para Windows, Mac e Linux em https://spring.io/tools/sts/all.

www.algaworks.com

21

A instalao como a do Eclipse, basta baixar e descompactar.


Ns vamos criar um pequeno projeto utilizando o STS para voc aprender os
primeiros passos com o Spring MVC.
Mas se voc j tem uma certa experincia e gosta de outra IDE, no se preocupe,
existe uma alternativa para a criao dos seus projetos Spring, basta acessar o
Spring Initializr online em http://start.spring.io.

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

3.2. Criando o projeto no STS


Vamos comear criando o projeto no STS.
Com o STS aberto, clique em File -> New -> Spring Starter Project, como mostra a
figura abaixo.

Vamos agora comear a configurar nossa aplicao.


No campo Name, informe o nome do projeto, que ser gestao-festa
Em Type, selecione Maven
www.algaworks.com

25

Em Packaging, pode deixar o Jar


Para Java Version, selecione a verso do Java que est configurada para
seu ambiente (recomendo que voc use a verso 1.8)
Em Language, claro, ser Java
Group, Artifact e Version so informaes do Maven para identificar nosso projeto.
Em Group, informe com.algaworks
Em Artifact, informe gestao-festa
Em Version, informe 1.0.0-SNAPSHOT. A palavra SNAPSHOT, no
contexto de um projeto, significa que estamos em uma verso de
desenvolvimento, e que se gerarmos um jar ou war dele, teremos apenas
um momento do projeto e no uma verso final ainda.
Se quiser adicionar uma descrio sobre o que o projeto, fique a
vontade para fazer no campo Description.
E em Package, definimos o nome do pacote que deve ser gerado para
nossa aplicao. Informe com.algaworks.festa
Veja na imagem abaixo a tela preenchida com as informaes. Aps tudo
conferido, clique em Next.

www.algaworks.com

26

Agora hora de selecionarmos os frameworks ou bibliotecas que nosso sistema


precisa. Navegue um pouco pelas opes clicando nas pequenas setas, como em
Database, e veja as opes que so possveis selecionarmos.
Essa tela muito til para iniciarmos o desenvolvimento da nossa aplicao, pois
ela a base para o STS gerar o arquivo pom.xml, ou seja, ao invs de voc ter
que lembrar o nome completo das dependncias do Spring MVC, pode apenas
selecionar Web.
Nossa aplicao s precisa das opes DevTools, Web, Thymeleaf, JPA
e H2 selecionadas. Confira na imagem abaixo, e logo em seguida clique em
Finish.

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

voc encontra o pacote com.algaworks.festa com a classe


GestaoFestaApplication. Vamos analisar o cdigo dela agora:
src/main/java

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

O mtodo main inicia a nossa aplicao!


Talvez voc tenha ficado com uma dvida agora, pensando assim: mas esse
livro no iria me ensinar sobre Spring MVC, que uma aplicao web? Cad o
servidor web pra executar, algo como o Apache Tomcat?.
Tudo bem se voc pensou isso, mas sim uma aplicao web.

www.algaworks.com

29

Acontece que o Spring Boot usa um container embarcado (por padro o


Tomcat) para facilitar o desenvolvimento, ento para iniciar nossa aplicao,
basta executarmos o mtodo main da classe GestaoFestaApplication.
Analisando o cdigo com mais detalhes, vemos a anotao:
@SpringBootApplication

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

3.3. Criando o controller


Lembra quando vimos que em um framework action based a requisio entregue
ao controller? Ento, agora o momento para criarmos essa classe que receber
a requisio e dir o nome da view ao framework, para ento ser renderizada de
volta ao browser do cliente.
Para comearmos bem devagar, esse primeiro controller s retornar o nome da
view, depois vamos incrementar um pouco mais adicionando objetos para serem
renderizados na pgina.
Vamos criar uma nova classe Java e comear a program-la.

www.algaworks.com

30

importante estar atento ao pacote que a classe ir ficar.


Para deixar nosso cdigo organizado, todo controller dever ficar dentro do
pacote com.algaworks.festa.controller.
O nome da classe ser ConvidadosController. Colocando o sufixo Controller nos
ajuda a lembrar que ela um controlador, ento o nome completo nos faz pensar
que essa classe o controlador de convidados.

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

Agora podemos criar o mtodo que receber a requisio e retornar o nome da


view.

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

Pronto! Agora o mtodo listar() chamado quando acessarmos no browser


a URL http://localhost:8080/convidados, e o Spring MVC saber que a view
ListaConvidados deve ser renderizada para o cliente.

3.4. Criando a pgina


Na seo anterior fizemos o controller retornar o nome da view ListaConvidados
para a requisio.
A configurao default do Spring Boot com Thymeleaf, define que a view deve
ficar em src/main/resources/templates e o sufixo do arquivo ser .html.
Portanto, vamos criar um arquivo simples e transform-lo em uma pgina
HTML. Lembre-se de salvar em src/main/resources/templates.

www.algaworks.com

33

Importante, o nome da view faz parte do nome do arquivo, informe


ListaConvidados.html em File Name.
Antes de criarmos nossa pgina, vamos alterar a verso padro do Thymeleaf
que o Spring Boot usa para uma verso mais recente. Fazemos isso dentro da tag
properties do arquivo pom.xml. Veja:
<properties>
<!-- ... -->
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
</properties>

Tambm vamos adicionar duas propriedades do Thymeleaf dentro do arquivo


src/main/resources/application.properties:
spring.thymeleaf.mode=html
spring.thymeleaf.cache=false

A primeira, altera para HTML o modo de templates que o Thymeleaf ir


trabalhar e a segunda para que ele no faa cache das pginas, pelo menos,
enquanto estivermos desenvolvendo o projeto.

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>

Vamos destacar alguns pontos deste cdigo para melhor entendimento.


Logo no incio temos a tag html com dois atributos:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">

O xmlns especifica o namespace XML para nosso documento, isso significa


que devemos sempre abrir e fechar as tags HTML, nunca poderemos ter uma tag
assim:
<input type="text">

www.algaworks.com

35

O cdigo acima funciona normalmente em um HTML comum, mas no em um


XHTML, portanto lembre-se sempre de abrir e fechar suas tags:
<input type="text"></input>

J o atributo xmlns:th define que podemos usar as propriedades definidas pelo


Thymeleaf, e voc vai gostar delas.
Por fim vamos destacar a importao do Bootstrap, um framework HTML, CSS
e JavaScript para desenvolvimento de aplicaes responsivas pra web, e que nos
ajuda a criar pginas bem mais elegantes com menos esforo:
<link th:href="@{/webjars/bootstrap/css/bootstrap.min.css}"
rel="stylesheet"/>
<link th:href="@{/webjars/bootstrap/css/bootstrap-theme.min.css}"
rel="stylesheet"/>

Temos duas coisas a reparar na importao acima.


Primeiro que, na importao do Bootstrap, utilizamos a biblioteca WebJars. Isso
para que no tenhamos que fazer o download do Bootstrap para dentro do
nosso projeto.
Ns simplesmente incluimos, dentro do nosso pom.xml, a dependncia referente
ao JAR do WebJars que possui o Bootstrap:
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>3.3.7</version>
</dependency>

A segunda que fizemos, pela primeira vez, o uso de um atributo do Thymeleaf:


o th:href. Ele foi utilizado para podermos tirar proveito da expresso @{}. A
vantagem dessa expresso que ela coloca o contexto da aplicao nos links do
projeto. Ainda veremos mais sobre essa expresso.

www.algaworks.com

36

3.5. Rodando o projeto pela primeira vez


J temos algo executvel, nada funcional ainda, mas j podemos ver algo
rodando no browser e ficar felizes por termos nossa aplicao funcionando at
agora.
Com a classe GestaoFestaApplication aberta, clique na pequena seta ao lado do
Run e selecione Run As -> Spring Boot App, conforme mostra a imagem abaixo.

O console mostrar alguns logs com vrias mensagens, depois de alguns


segundos nossa aplicao estar no ar.

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.

3.6. Repositrio de convidados


Comeamos bem simples, mas em poucos minutos j conseguimos criar uma
aplicao com Spring MVC e Thymeleaf e ver algo funcionando no browser. E
isso muito legal, pois no precisamos ficar procurando outras aplicaes de
exemplo para copiar e colar, fizemos tudo muito simples e rpido.
Agora hora de sofisticar um pouco nossa aplicao. Vamos criar uma classe que
representar cada convidado e um repositrio para armazen-los e busc-los.
O primeiro passo criar a classe que representa um convidado, lembre-se que
um convidado tem um nome, a quantidade de acompanhantes que ele levar
festa e um identificador.

www.algaworks.com

38

Crie a classe Convidado no pacote com.algaworks.festa.model.


package com.algaworks.festa.model;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Convidado implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id;
private String nome;
private Integer quantidadeAcompanhantes;
// getters e setters omitidos.
}

Repare que utilizamos trs anotaes do JPA. No se assuste, voc no vai


precisar fazer mais do que isso para deixar a persistncia funcionando em nosso
projeto.
A anotao @Entity torna a nossa classe como uma entidade de banco de dados.
As anotaes @Id e @GeneratedValue so para marcar a propriedade id como
representante da chave primria do banco e para pedir que o Hibernate (nossa
implementao por trs do JPA) gere o identificador para ns, respectivamente.
Vamos criar agora uma interface chamada Convidados que representar um
repositrio de convidados, ou seja, um lugar onde podemos listar ou adicionar
convidados.
O projeto Spring Data JPA, atravs da interface JpaRepository, vai tornar essa
tarefa uma das mais fceis do nosso projeto. Veja o nosso repositrio:

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

No precisamos nem mesmo adicionar a anotao

@Repository

que geralmente

fazemos em repositrios quando utilizamos Spring.


S de implementar a interface JpaRepository j poderemos injetar um objeto do
tipo Convidados no nosso controller, por exemplo.
E, para o leitor mais atento, essas duas classes,

Convidado

Convidados,

fazem

parte do Model no padro MVC.

3.7. Enviando um objeto do Controller para a View


Agora que j temos o repositrio pronto, podemos enviar a lista de convidados
do controller para a view, e essa tarefa muito simples.
Ao invs de retornar uma String com o nome da view, podemos retornar um
objeto do tipo ModelAndView, que nos permite, alm de informar o nome da view,
adicionar objetos para serem usados no HTML.
package com.algaworks.festa.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import com.algaworks.festa.repository.Convidados;
@Controller
public class ConvidadosController {

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.

3.8. Listando objetos com o Thymeleaf


Agora que j temos o controller recuperando os dados do repositrio e
adicionando no ModelAndView para ser usado na view, vamos editar o arquivo
ListaConvidados.html e listar os convidados.
Como j importamos o bootstrap, vamos us-lo para deixar a pgina mais bonita.
Para este exemplo vamos utilizar o Panel with heading, que consiste em um
painel com um cabealho e um corpo.
<body>
<div class="panel panel-default" style="margin: 10px">
<div class="panel-heading">
<h1 class="panel-title">Lista de convidados</h1>
</div>

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

e o th:text. O primeiro para iterar sobre a lista e o segundo para mostrar as


propriedades do objeto nas colunas.
<tr th:each="convidado : ${convidados}">
<td th:text="${convidado.nome}"></td>
<td th:text="${convidado.quantidadeAcompanhantes}"></td>
</tr>

No th:each usamos a expresso ${convidados} para recuperar o objeto adicionado


pelo controller, lembra do nome que usamos para adicionar no ModelAndView?
Foi convidados, n? Ento, esse o nome que usamos na expresso ${}.
Lembre-se que nessa varivel temos uma lista de convidados, portanto, podemos
iterar nela.

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/

insert into convidado (id, nome, quantidade_acompanhantes)


values (1, 'Pedro', 2);
insert into convidado (id, nome, quantidade_acompanhantes)
values (2, 'Maria', 3);
insert into convidado (id, nome, quantidade_acompanhantes)
values (3, 'Ricardo', 1);

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

3.9. Adicionando um convidado


J estamos listando, mas e se quisermos adicionar um novo convidado?
Vamos adicionar na mesma view um formulrio para preenchermos o nome e a
quantidade de acompanhantes de um convidado.
O formulrio ficar dentro do painel, logo acima da tabela. Primeiro vamos s
adicionar o HTML para criarmos o prottipo, sem salvar no repositrio ainda.
<form class="form-inline" method="POST" style="margin: 20px 0">
<div class="form-group">
<input type="text" class="form-control"
placeholder="Nome"/>
<input type="text" class="form-control"
placeholder="Acompanhantes"/>
<button type="submit"
class="btn btn-primary">Adicionar</button>
</div>
</form>

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

Para o Thymeleaf usar este objeto no formulrio, adicione o atributo th:object no


form.
<form class="form-inline" method="POST" th:object="${convidado}"
style="margin: 20px 0">

www.algaworks.com

44

E nos campos de entrada vamos usar as propriedades do objeto convidado nos


inputs usando th:field.
<input type="text" class="form-control"
placeholder="Nome"
th:field="*{nome}"/>
<input type="text" class="form-control"
placeholder="Acompanhantes"
th:field="*{quantidadeAcompanhantes}"/>

Repare que usamos a expresso


convidado.

*{}

para selecionar a propriedade do objeto

Nesse momento o formulrio est recebendo um novo objeto do tipo Convidado e


suas propriedades nome e quantidadeAcompanhantes esto ligadas s tags input do
form.
Para finalizar nosso formulrio, precisamos apenas dizer para qual endereo ele
deve enviar os dados. Vamos fazer isso usando o atributo th:action.
<form class="form-inline" method="POST" th:object="${convidado}"
th:action="@{/convidados}" style="margin: 20px 0">

A expresso

@{},

como comentamos anteriormente, muito til quando

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

Observe que o mtodo salvar() recebe como parmetro um objeto do tipo


Convidado. O Spring MVC j vai cri-lo e definir os valores enviados pelo
formulrio neste objeto, facilitando muito nosso trabalho.
www.algaworks.com

45

Com o objeto pronto, podemos simplesmente adicion-lo ao repositrio.


@PostMapping("/convidados")
public String salvar(Convidado convidado) {
this.convidados.save(convidado);
}

Depois de salvar o convidado, seria interessante recarregar a pgina para que a


pesquisa fosse executada novamente, e consequentemente a tabela com a lista de
convidados atualizada.
muito simples fazer isso com o Spring MVC, ao invs de retornarmos o nome
da view que queremos renderizar, podemos retornar uma URL para redirecionar
a requisio usando redirect: na String.
@PostMapping("/convidados")
public String salvar(Convidado convidado) {
this.convidados.save(convidado);
return "redirect:/convidados";
}

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

iro comear sempre com

A aplicao final deve se parecer com a imagem abaixo.

3.10. Escolhendo o banco de dados


Como estamos fazendo o uso do JPA (atravs do Spring Data JPA), configurar e
at mesmo trocar o banco de dados se torna uma tarefa bem simples.
Mais no incio, quando criamos o nosso projeto, voc deve ter visto que
adicionamos a dependncia do banco de dados H2. Isso facilitou nosso trabalho
at aqui.

www.algaworks.com

47

Ele um banco de dados em memria e foi escolhido para simplificar o


desenvolvimento do nosso projeto por dois motivos. Primeiro porque ele no
precisa ser instalado, e segundo porque no precisamos de configurao alguma
para utiliz-lo com Spring Boot. Muito bom, no mesmo?
Agora, a gente sabe que muitos vo querer utilizar um banco de dados diferente,
e vamos fazer isso agora. Iremos configurar o nosso projeto com o MySQL.
Alm dessas pequenas configuraes que sero feitas a partir de agora ajudarem
aqueles que querem o prprio MySQL, vo servir como exemplo para quem
precisar da configurao para outros bancos quaisquer.
A primeira coisa adicionar a dependncia do driver JDBC no pom.xml:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

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

O nome do banco de dados escolhido para o nosso projeto


comecandocomspringmvc. O usurio ficou como root e sem senha.

foi

Por ltimo configuramos a propriedade ddl-auto para recriar o banco de dados


todas as vezes que o projeto se iniciar. Isso apenas por uma questo didtica.
Voc no pode deixar uma propriedade dessas em produo!
Pronto! S com isso j podemos rodar o projeto com o MySQL.

www.algaworks.com

48

3.11. Deixando a aplicao segura


Temos uma aplicao bem completa j funcionando. Falta somente deix-la
segura. Faremos isso com o Spring Security.
Como foi dito no incio, ele simplifica bem o nosso trabalho. E, se estiver fazendo
parceria com o Spring Boot (como o nosso caso), ento temos mais facilidades
ainda.
S de adicionarmos o Spring Security no pom.xml o Spring Boot j entra em
ao. Inclusive poderiamos t-lo adicionado logo na construo do projeto. Isso
no foi feito para no termos que ficar logando a todo momento quando ainda
estvamos bem no incio do desenvolvimento.
Faremos isso agora. Para isso precisamos somente dessa dependncia em nosso
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

S de adicion-la, j criado o usurio user com uma senha que temos que copiar
do console toda vez que subimos a aplicao.

J impressionante termos segurana aplicada com to pouco. Mas vamos dar


mais um passo e adicionar nossos prprios usurios.
Para isso basta criar a seguinte classe:

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

anotao @Configuration torna a nossa classe


InMemorySecurityConfig uma classe que poderia abrigar quaisquer outras
configuraes do Spring. Para melhor organizar, iremos deixar aqui somente o
que for relacionado a autenticao de usurios.
O mtodo configureGlobal, anotado com @Autowired, poderia ter qualquer outro
nome, mas esse uma conveno adotada para quando queremos configurar
nosso AuthenticationManagerBuilder.
Dentro do mtodo temos a configurao de trs usurios que podemos agora
utilizar para nos autenticar no sistema. Reinicie a aplicao e tente acess-la
novamente.

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.

4.2. Usando o Postgres


Da mesma forma que foi com o MySQL, ser simples utilizar o Postgres em nossa
aplicao.
Vamos precisar incluir a dependncia dele no pom.xml:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>

S que no vamos mexer no arquivo application.properties para fazer


configuraes de URL, usurio e senha. Como s vamos utilizar o Postgres no
Heroku, ento criaremos um arquivo especial para ele.
O arquivo ser o src/main/resources/heroku-db.properties. Ele ir sobrescrever
algumas das propriedades que esto no application.properties. Veja:
spring.datasource.url=${JDBC_DATABASE_URL}
spring.datasource.username=
spring.datasource.password=

A propriedade url ganha o valor referente a varivel de ambiente


JDBC_DATABASE_URL. Ela configurada pelo Heroku e portanto, no precisamos
nos preocupar.
As propriedades username e password devem ficar vazias, sobrescrevendo o
arquivo application.properties. Esses dois valores j esto junto com a url.

www.algaworks.com

53

Uma ltima coisa aqui, que ser necessrio o arquivo heroku-db.properties


mesmo para quem for utilizar o MySQL no Heroku. Obviamente, para essas
pessoas, no ser preciso a dependncia do Postgres.

4.3. Alterao de estratgia para chave primria


Vamos precisar de uma pequena alterao na entidade Convidado. Vou explicar.
Nossa entidade est utilizando a estratgia padro para gerao da nossa primary
key de banco de dados. Veja a anotao @GeneratedValue:
@Id
@GeneratedValue
private Long id;

Com a configurao acima, delegada para o Hibernate (nossa implementao


de JPA) a misso de gerar o identificador. Soma-se a isso a informao de que,
para o Postgres, a estratgia que o Hibernate usa a criao de uma sequence
chamada hibernate_sequence.
Sabemos que uma sequence comea com o valor 1. E aqui que vem o problema
do nosso projeto, pois, ns j temos a primary key de identificador igual a 1 no
arquivo import.sql.
Esse vai ser o motivo de alterarmos a estratgia da gerao do nosso identificador
para a seguinte:
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
private Long id;

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

Para quem for utilizar o MySQL no Heroku, esse tpico opcional.

4.4. Criando o arquivo de inicializao


Para subir o projeto no Heroku vamos precisar criar um arquivo chamado
Procfile, que ficar na raiz do projeto.
Nesse arquivo iremos incluir o comando que o Heroku vai utilizar para iniciar
nossa aplicao.
web: java $JAVA_OPTS -Dserver.port=$PORT -jar target/*.jar
--spring.config.location=classpath:heroku-db.properties

O mais importante do comando acima o arquivo

heroku-db.properties

que

est sendo passado. No podemos esquecer dele, pois ele carrega a nossa
configurao para o banco de dados.

4.5. Instalando o Git


Para subir o projeto para o Heroku, vamos precisar do Git. Voc pode baix-lo no
site https://git-scm.com/downloads e a instalao bem simples.
O Git o gerenciador de cdigo-fonte mais utilizado no mundo. atravs dele
que o Heroku recebe nosso cdigo para depois compilar e publicar.
Ns no precisaremos de muitos comandos do Git, mas as pessoas que desejarem
se aprofundar, podem comear pela documentao do mesmo, que bem ampla.
Depois da instalao, vamos precisar iniciar um repositrio e fazer o commit de
nossos arquivos.
Obviamente, aqueles que clonarem com o Git o cdigo-fonte que
disponibilizamos j tero esse repositrio iniciado. No ser necessrio iniciar e
nem mesmo comitar - a menos, claro, que tiverem feito alguma alterao no
mesmo.

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

Para iniciar nosso repositrio local vamos utilizar o comando:


$ git init

Depois, iremos adicionar os arquivos que desejamos que sejam includos no


commit. Fazemos isso assim:
$ git add .

O comando acima ir incluir todos os arquivos, exceto aqueles que estiverem


listados em um arquivo especial chamado .gitignore, que voc pode criar e
incluir na raiz do projeto. O nosso ficar assim:
target/
.settings/
.classpath
.project

O prximo passo o commit:


$ git commit -m "Primeiro commit."

Ainda ser dado mais um comando com o Git, mas antes precisamos configurar
nossa aplicao no Heroku.

4.6. Configurando a aplicao no Heroku


Primeiramente preciso ir at o site do Heroku, clicar em algum boto de Sign up
ou entrar diretamente em https://signup.heroku.com/ para fazer o seu cadastro.
Ele bem simples.

www.algaworks.com

56

Feito o cadasto, j podemos instalar o Heroku CLI. Os detalhes dessa instalao


para
cada
sistema
operacional,
voc
encontra
em
https://devcenter.heroku.com/articles/heroku-cli.
Agora sim, depois da instalao do Heroku CLI, podemos rodar os comandos
que vo configurar nossa aplicao. Abra novamente o terminal e v at a pasta
do projeto.
$ cd /pasta/do/projeto/gestao-festa

Obrigatoriamente, para configurar nossa aplicao, precisamos estar logados no


Heroku pelo terminal. Fazermos isso com o comando login.
$ heroku login

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.

4.7. Enviando a aplicao


Se voc seguiu todos os passos at aqui, ento est pronto para enviar sua
aplicao.
O envio propriamente dito feito com a execuo de um comando do Git. O
comando o seguinte:
$ git push heroku master

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,

bem intuitivo, serve para exibir os logs a medida que

forem ocorrendo dentro da sua aplicao.


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

Voc tem acesso a alguns detalhes como na figura abaixo:

www.algaworks.com

59

As informaes mais importantes mostradas acima so o tipo de hospedagem


que estamos utilizando (free, no caso) e a quantidade de horas que temos
disponveis para utilizar no ms corrente com o tipo gratuito de hospedagem.

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.

5.1. Prximos passos


Embora esse livro tenha te ajudado a criar uma aplicao do incio ao fim com
Spring Boot, Spring MVC, Spring Data JPA, Spring Security e Thymeleaf, o que
voc aprendeu nele s a ponta do iceberg!
claro que voc no perdeu tempo com o que acabou de estudar, o que ns
queremos dizer que h muito mais coisas para aprofundar.
Caso voc tenha interesse em continuar seu aprendizado, recomendo que veja
agora um curso online que temos sobre Spring nesse link: http://alga.works/
livro-spring-boot-cta/.
www.algaworks.com

61

You might also like