Escolar Documentos
Profissional Documentos
Cultura Documentos
Algaworks Livreto Primeiros Passos Com Spring MVC v1.1 PDF
Algaworks Livreto Primeiros Passos Com Spring MVC v1.1 PDF
Sobre o autor
Normandes Jos Moreira Junior
Scio e instrutor da AlgaWorks, formado em
Engenharia Eltrica pela Universidade Federal de
Uberlndia e detentor das certificaes LPIC-1, SCJP
e SCWCD. Palestrante internacional, autor e co-autor
de livros e instrutor de cursos de Java, JPA, TDD,
Design Patterns, Spring, etc.
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?
Sumrio
1 Introduo
2 O Spring
2.1
Introduo ................................................................................................... 12
2.2
2.3
2.4
2.5
O Thymeleaf ............................................................................................... 16
2.6
O Maven ...................................................................................................... 17
2.7
Funcionamento ........................................................................................... 20
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
4 Concluso
4.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 o
objetivo desse livreto, mostrar um caminho mais fcil e prazeroso para criar um
projeto Java web.
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
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
www.algaworks.com
15
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?
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.
www.algaworks.com
16
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>
2.6. O Maven
O Maven uma ferramenta muito importante no dia a dia do desenvolvedor
Java, 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
17
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.
O que informar e o que selecionar, vamos ver nos prximos captulos.
www.algaworks.com
19
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 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
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)
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
22
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.
Depois de criado, voc ver no Package Explorer, posicionado do lado
esquerdo no STS, uma estrutura como mostrado na imagem abaixo.
www.algaworks.com
24
e ServletInitializer.
www.algaworks.com
25
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
www.algaworks.com
26
encontrado, ser gerenciado, e isso facilitar muito a nossa vida (voc ver no
desenvolvimento da aplicao).
J a classe ServletInitializer ser usada se nossa aplicao for executada em um
servidor externo, como um Apache Tomcat em produo, por exemplo.
package com.algaworks.festa;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder application) {
return application.sources(GestaoFestaApplication.class);
}
}
27
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
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 @RequestMapping. Vamos mapear para que a
requisio /convidados caia nesse mtodo. Para isso, s fazer como o cdigo
abaixo.
@RequestMapping("/convidados")
public String listar() {
return "ListaConvidados";
}
www.algaworks.com
30
www.algaworks.com
31
crossorigin="anonymous"/>
</head>
<body>
<h1>AlgaWorks!</h1>
</body>
</html>
www.algaworks.com
32
Vamos testar?
Abra o browser e digite http://localhost:8080/convidados.
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.
www.algaworks.com
34
Convidados
que representar um
www.algaworks.com
35
import java.util.ArrayList;
import java.util.List;
import com.algaworks.festa.model.Convidado;
public class Convidados {
private static final List<Convidado> LISTA_CONVIDADOS
= new ArrayList<>();
static {
LISTA_CONVIDADOS.add(new Convidado("Pedro", 2));
LISTA_CONVIDADOS.add(new Convidado("Maria", 3));
LISTA_CONVIDADOS.add(new Convidado("Ricardo", 1));
}
public List<Convidado> todos() {
return Convidados.LISTA_CONVIDADOS;
}
public void adicionar(Convidado convidado) {
Convidados.LISTA_CONVIDADOS.add(convidado);
}
}
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,
parte do Model no padro MVC.
Convidado
Convidados,
fazem
String
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.web.servlet.ModelAndView;
import com.algaworks.festa.model.Convidado;
import com.algaworks.festa.repository.Convidados;
// omitindo alguns imports
@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.
O construtor de ModelAndView recebe o nome da view e com o mtodo addObject()
podemos adicionar objetos para a view.
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.
<tr th:each="convidado : ${convidados}">
<td th:text="${convidado.nome}"></td>
<td th:text="${convidado.quantidadeAcompanhantes}"></td>
</tr>
www.algaworks.com
39
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.
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
41
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.
No nosso controller no existe um mtodo capaz de receber uma requisio POST
em /convidados.
O mtodo HTTP default que @RequestMapping define GET, portanto vamos criar
um outro mtodo salvar() no nosso controller.
@RequestMapping(value = "/convidados", method = RequestMethod.POST)
public String salvar(Convidado convidado) {
}
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.
Talvez voc esteja pensando que ficou repetido o mapeamento em
@RequestMapping 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 {
@RequestMapping
public ModelAndView listar() {
// ...
}
@RequestMapping(method = RequestMethod.POST)
public String salvar(Convidado convidado) {
// ...
}
}
Agora as anotaes
/convidados.
@RequestMapping
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.
Espero que tenha colocado em prtica tudo que aprendeu. No se contente
em apenas ler esse livreto. 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 livreto, por favor, me ajude a manter esse trabalho.
Recomende-o para seus amigos de trabalho, faculdade e/ou compartilhe no
Facebook e Twitter.
45