Escolar Documentos
Profissional Documentos
Cultura Documentos
Spring - MVC PDF
Spring - MVC PDF
Spring - MVC PDF
1 Edio, 10/02/2016
LinkedIn: https://www.linkedin.com/in/normandesjr
Twitter: @normandesjr
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?
http://alga.works/comunidadejava/
Ajude a divulgar esse livreto 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
4 Concluso
4.1 Prximos passos ......................................................................................... 45
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.
Ns vamos criar uma aplicao simples com Spring MVC, Spring Boot 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
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.
Os projetos Spring so Open Source, voc pode ver o cdigo fonte no GitHub.
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.
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.
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.
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.
www.algaworks.com 13
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.
Vamos parar um pouco e pensar no que fazemos todos os dias quando estamos
na internet.
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 14
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.
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.
5. O controller retorna o nome da view, junto com os dados que ela precisa
para renderizar a pgina.
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 15
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.
2.5. 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?
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.
www.algaworks.com 16
Para voc ver como ele funciona, vamos analisar o cdigo abaixo.
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.
2.6. O Maven
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.
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-projetos-
java
www.algaworks.com 17
2.7. O Spring Tool Suite - STS
O Spring Tool Suite, ou STS, um Eclipse com vrios plugins teis para o
trabalho com o Spring.
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 18
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.
www.algaworks.com 19
Captulo 3
O projeto de gesto de
convidados
3.1. Funcionamento
Vamos criar uma aplicao simples, do zero e passo a passo para voc ver como
o Spring Boot, o Spring MVC 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 20
3.2. Criando o projeto no STS
Com o STS aberto, clique em File -> New -> Spring Starter Project, como mostra a
figura abaixo.
www.algaworks.com 21
Para Java Version, selecione a verso do Java que est configurada para
seu ambiente (recomendo que voc use a verso 1.8)
www.algaworks.com 22
Agora hora de selecionarmos os frameworks 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 Maven 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.
www.algaworks.com 23
Ateno: Se essa for a primeira vez que voc faz este procedimento, pode
demorar um pouco, pois muitas bibliotecas sero baixadas da internet.
www.algaworks.com 24
Em src/main/java voc encontra o pacote com.algaworks.festa com duas classes,
GestaoFestaApplication e ServletInitializer.
package com.algaworks.festa;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GestaoFestaApplication {
Talvez voc tenha ficado com uma dvida agora, pensando assim: mas esse
livreto 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 25
Acontece que o Spring Boot usa um Tomcat embarcado para facilitar o
desenvolvimento, ento para iniciar nossa aplicao, basta executarmos o
mtodo main da classe GestaoFestaApplication.
D uma olhada no arquivo pom.xml e confira que temos uma dependncias para
o Tomcat.
@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.
www.algaworks.com 26
encontrado, ser gerenciado, e isso facilitar muito a nossa vida (voc ver no
desenvolvimento da aplicao).
package com.algaworks.festa;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder application) {
return application.sources(GestaoFestaApplication.class);
}
www.algaworks.com 27
Vamos criar uma nova classe Java e comear a program-la.
Para deixar nosso cdigo organizado, todo controller dever ficar dentro do
pacote com.algaworks.festa.controller.
www.algaworks.com 28
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 29
Agora podemos criar o mtodo que receber a requisio e retornar o nome da
view.
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.
Ok. Mas agora surge uma dvida: qual URL que podemos digitar no browser
para esse mtodo ser chamado?
@RequestMapping("/convidados")
public String listar() {
return "ListaConvidados";
}
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.
www.algaworks.com 30
Portanto, vamos criar um arquivo simples e transform-lo em uma pgina
HTML. Lembre-se de salvar em src/main/resources/templates.
Para vermos algo funcionando o mais rpido possvel, vamos criar uma pgina
simples com o Thymeleaf e usando tambm o Bootstrap, para deixar nosso
sistema mais bonito.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>Lista de Convidados</title>
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"
integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7"
www.algaworks.com 31
crossorigin="anonymous"/>
</head>
<body>
<h1>AlgaWorks!</h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<input type="text">
<input type="text"></input>
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.
www.algaworks.com 32
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.
Vamos testar?
www.algaworks.com 33
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.
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.
package com.algaworks.festa.model;
www.algaworks.com 34
private String nome;
private Integer quantidadeAcompanhantes;
public Convidado() {
No cdigo abaixo voc pode ver que carregamos alguns convidados em um bloco
esttico, apenas para vermos algo na tela. O mtodo todos() retorna a lista de
convidados e o mtodo adicionar(Convidado) nos permite adicionar um novo
convidado lista.
package com.algaworks.festa.repository;
www.algaworks.com 35
import java.util.ArrayList;
import java.util.List;
import com.algaworks.festa.model.Convidado;
static {
LISTA_CONVIDADOS.add(new Convidado("Pedro", 2));
LISTA_CONVIDADOS.add(new Convidado("Maria", 3));
LISTA_CONVIDADOS.add(new Convidado("Ricardo", 1));
}
Est quase pronto, precisamos apenas falar para o Spring que essa classe um
componente, e que um repositrio. Para isso, basta adicionarmos a anotao
@Repository na classe.
package com.algaworks.festa.repository;
import org.springframework.stereotype.Repository;
// omitindo os outros imports
@Repository
public class Convidados {
// omitindo o cdigo
www.algaworks.com 36
Essa simples anotao nos permite injetar um objeto do tipo Convidados no nosso
controller, por exemplo.
E, para o leitor mais atento, essas duas classes, Convidado e Convidados, fazem
parte do Model no padro MVC.
package com.algaworks.festa.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;
import com.algaworks.festa.model.Convidado;
import com.algaworks.festa.repository.Convidados;
@Controller
public class ConvidadosController {
@Autowired
private Convidados convidados;
@RequestMapping("/convidados")
public ModelAndView listar() {
ModelAndView mv = new ModelAndView("ListaConvidados");
mv.addObject("convidados", convidados.todos());
return mv;
}
www.algaworks.com 37
Repare que com @Autowired, podemos injetar o repositrio no controller, e isso nos
livra da preocupao de como receber esse objeto na classe.
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>
<div class="panel-body">
<table class="table">
<thead>
<tr>
<th>Nome</th>
<th>Acompanhantes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Joo</td>
<td>1</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
www.algaworks.com 38
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.
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.
www.algaworks.com 39
3.9. Adicionando um convidado
www.algaworks.com 40
Agora que nosso html est pronto, vamos comear as modificaes para o
Thymeleaf e o Spring conseguirem salvar um novo convidado.
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.
mv.addObject(new Convidado());
Para finalizar nosso formulrio, precisamos apenas dizer para qual endereo ele
deve enviar os dados. Vamos fazer isso usando o atributo th:action.
www.algaworks.com 41
<form class="form-inline" method="POST" th:object="${convidado}"
th:action="@{/convidados}" style="margin: 20px 0">
A expresso @{} 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.
O mtodo HTTP default que @RequestMapping define GET, portanto vamos criar
um outro mtodo salvar() no nosso controller.
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.
www.algaworks.com 42
this.convidados.adicionar(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.
@Controller
@RequestMapping("/convidados")
public class ConvidadosController {
@RequestMapping
public ModelAndView listar() {
// ...
}
@RequestMapping(method = RequestMethod.POST)
public String salvar(Convidado convidado) {
// ...
}
}
www.algaworks.com 43
www.algaworks.com 44
Captulo 4
Concluso
Que legal ter chegado ao final da leitura, estou feliz por voc ter cumprido mais
essa etapa na sua carreira.
Se voc gostou desse livreto, por favor, me ajude a manter esse trabalho.
Recomende-o para seus amigos de trabalho, faculdade e/ou compartilhe no
Facebook e Twitter.
Embora esse livreto tenha te ajudado a criar uma aplicao do incio ao fim com
Spring MVC, Spring Boot 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 eu quero
dizer que h muito mais coisas para aprofundar.
Caso voc tenha interesse em continuar seu aprendizado, recomendo que veja
agora mesmo nosso workshop Comeando com Spring MVC nesse link:
http://alga.works/livreto-springmvc-cta/.
www.algaworks.com 45