Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

algaworks - livro - spring - boot - v2 0, Manuais, Projetos, Pesquisas de Análise de Sistemas de Engenharia

Spring boot

Tipologia: Manuais, Projetos, Pesquisas

2017

Compartilhado em 29/08/2017

sandro-rodrigues-45
sandro-rodrigues-45 🇧🇷

2 documentos

1 / 64

Documentos relacionados


Pré-visualização parcial do texto

Baixe algaworks - livro - spring - boot - v2 0 e outras Manuais, Projetos, Pesquisas em PDF para Análise de Sistemas de Engenharia, somente na Docsity! PAR [to NORMANDES JR E ALEXANDRE AFONSO PRODUTIVIDADE NO DESENVOLVIMENTO DE APLICAÇÕES WEB COM SPRING BOOT Oalgaworks Sobre os autores Normandes José Moreira Junior Sócio e instrutor da AlgaWorks. Graduado em Engenharia Elétrica pela Universidade Federal de Uberlândia e detentor das certificações LPIC-1, SCJP e SCWCD. Palestrante da maior conferência de Java do mundo (JavaOne San Francisco), autor e co-autor de vários 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 Informação, está no mercado de programação Java há mais de 8 anos, principalmente no desenvolvimento de sistemas corporativos. LinkedIn: https://www.linkedin.com/in/alexandreafon Twitter: @alexandreafon Antes de começar... Antes que você comece a ler esse livro, eu gostaria de combinar algumas coisas com você, para que tenha um excelente aproveitamento do conteúdo. Vamos lá? O que você precisa saber? Você só conseguirá absorver o conteúdo desse livro se já conhecer pelo menos o básico de Java, Orientação a Objetos e HTML. Caso você ainda não domine esses assuntos, pode ser interessante estudar por nossos cursos online. Como obter ajuda? Durante os estudos, é muito comum surgir várias dúvidas. Nós gostaríamos muito de te ajudar pessoalmente nesses problemas, mas infelizmente não conseguimos fazer isso com todos os leitores do livro, afinal, ocupamos grande parte do dia ajudando os alunos de cursos online na AlgaWorks. Então, quando você tiver alguma dúvida e não conseguir encontrar a solução no Google ou com seu próprio conhecimento, nossa recomendação é 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 conteúdo desse livro ou se tiver alguma sugestão para melhorar a próxima edição, vamos ficar muito felizes se você puder nos dizer. Envie um e-mail para livros@algaworks.com. Onde encontrar o código-fonte do projeto? Neste livro, nós vamos desenvolver um pequeno projeto passo a passo. O link para baixar o código-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 também se interessam por programação Java. Compartilhe no Facebook e Twitter! Enviando um objeto do Controller para a View ................................... 40 Listando objetos com o Thymeleaf .......................................................... 41 Adicionando um convidado ..................................................................... 44 Escolhendo o banco de dados .................................................................. 47 Deixando a aplicação segura .................................................................... 49 Publicando a aplicação Introdução ................................................................................................... 52 Usando o Postgres ..................................................................................... 53 Alteração de estratégia para chave primária ......................................... 54 Criando o arquivo de inicialização .......................................................... 55 Instalando o Git .......................................................................................... 55 Configurando a aplicação no Heroku ..................................................... 56 Enviando a aplicação ................................................................................. 58 Conclusão Próximos passos ......................................................................................... 61 3.7 3.8 3.9 3.10 3.11 4 4.1 4.2 4.3 4.4 4.5 4.6 4.7 5 5.1 Capítulo 1 Introdução Às vezes a parte mais difícil para quem está começando uma nova aplicação Java web, mesmo se esse programador já conhece a linguagem, é justamente começar! Você precisa criar a estrutura de diretórios para os vários arquivos, além de criar e configurar o build file com as dependências. Se você já é programador Java para web, sempre que precisa criar um novo projeto, o que você faz? É possível que sua resposta seja: “eu crio um novo projeto e vou copiando as configurações 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 então copiar e colar todas as configurações no seu ambiente de desenvolvimento até ter o “hello world” funcionando. Esses são cenários comuns no desenvolvimento web com Java quando estamos usando ferramentas como Eclipse e Maven simplesmente, mas existem alternativas a este “castigo inicial” da criação de um novo projeto, e esse é um dos objetivos desse livro, mostrar um caminho mais fácil e prazeroso para criar um projeto web em Java com Spring Framework. Nós vamos criar uma aplicação 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 (não está escrito errado, é Initializr mesmo), uma ferramenta muito útil para criar nossos projetos com Spring. www.algaworks.com 11 Capítulo 2 O Spring 2.1. Introdução O Spring não é um framework apenas, mas um conjunto de projetos que resolvem várias situações do cotidiano de um programador, ajudando a criar aplicações 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 segurança, e diversos outros projetos que vão 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 possível. Desde a sua primeira liberação, em Outubro de 2002, o Spring tem evoluído muito, com diversos projetos maduros, seguros e robustos para utilizarmos em produção. Os projetos Spring são Open Source, você pode ver o código-fonte no GitHub. 2.2. Spring vs Java EE O Spring não chega a ser 100% concorrente do Java EE, até porque, com Spring, você também usa tecnologias que estão dentro do Java EE. www.algaworks.com 12 @Autowired private RepositorioCliente repositorio; ... } A anotação @Autowired avisa ao Spring Framework para injetar uma instância de alguma implementação da interface RepositorioCliente na propriedade repositorio. A priore pode parecer insignificante, mas o Spring não para por ai. Tem várias outras funcionalidades que são possíveis ou, pelo menos, facilitadas por causa da injeção de dependências. 2.5. O Spring MVC Dentre os projetos Spring, o Spring MVC é o framework que te ajuda no desenvolvimento de aplicações web robustas, flexíveis e com uma clara separação de responsabilidades nos papéis do tratamento da requisição. MVC é acrônimo de Model, View e Controller, e entender bem o que cada um deve fazer na aplicação é importante para termos uma aplicação bem escrita e fácil para dar manutenção. 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 endereço na “barra de endereços”, clicamos no “Enter” e pronto, se nada der errado, uma página HTML será renderizada para nós. Mas, o que acontece entre o “Enter” e a página HTML ser renderizada? Claro que existem centenas de linguagens de programação e frameworks diferentes, mas nós vamos pensar no contexto do Spring MVC. www.algaworks.com 15 1. Acessamos uma URL no browser que envia a requisição HTTP para o servidor que roda a aplicação web com Spring MVC. Esse servidor pode ser o Apache Tomcat, por exemplo. Perceba que quem recebe a requisição é o controlador do framework, o Spring MVC. 2. O controlador do framework, irá procurar qual classe é responsável por tratar essa requisição, 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 negócio, como cálculos, validações e acesso ao banco de dados. 4. O resultado das operações realizadas pelo model é retornado ao controller. 5. O controller retorna o nome da view, junto com os dados que ela precisa para renderizar a página. 6. O “Framework” encontra a view que processa os dados, transformando o resultado em um HTML. 7. Finalmente, o HTML é retornado ao browser do usuário. Pare um pouco e volte na figura acima, leia mais uma vez todos os passos desde a requisição do browser, até a página ser renderizada de volta a ele. Como você deve ter notado, temos o Controller tratando a requisição, ele é o primeiro componente que nós vamos programar para receber os dados enviados pelo usuário. www.algaworks.com 16 Mas é muito importante estar atento e não cometer erros adicionando regras de negócio, acessando banco de dados ou fazendo validações nessa camada, precisamos passar essa responsabilidade para o Model. No Model, pensando em algo prático, é 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 usuário consiga visualizar a informação, pois enquanto estávamos no Controller e no Model, estávamos programando em classes Java, e não em algo visual para o browser exibir ao usuário. Essa é a ideia do MVC, separar claramente a responsabilidade de cada componente dentro de uma aplicação. Por quê? Para facilitar a manutenção do seu código, temos baixo acoplamento, e isso é uma boa prática de programação. 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 não (MongoDB, Redis, etc). O Spring Data já possui vários 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 2.9. O Thymeleaf A view irá retornar apenas um HTML para o browser do cliente, mas isso deixa uma dúvida: Como ela recebe os objetos Java, enviados pelo controller, e os transforma em HTML? Nessa hora que entra em ação o Thymeleaf! Teremos um código HTML misturado com alguns atributos do Thymeleaf, que após processado, será gerado apenas o HTML para ser renderizado no browser do cliente. O Thymeleaf não é um projeto Spring, mas uma biblioteca que foi criada para facilitar a criação da camada de view com uma forte integração com o Spring, e uma boa alternativa ao JSP. O principal objetivo do Thymeleaf é prover uma forma elegante e bem formatada para criarmos nossas páginas. O dialeto do Thymeleaf é bem poderoso, como você verá no desenvolvimento da aplicação, mas você também pode estendê-lo para customizar de acordo com suas necessidades. Para você ver como ele funciona, vamos analisar o código abaixo. <tr th:each="convidado : ${convidados}"> <td th:text="${convidado.nome}"></td> <td th:text="${convidado.quantidadeAcompanhantes}"></td> </tr> A expressão ${} interpreta variáveis locais ou disponibilizadas pelo controller. O atributo th:each itera sobre a lista convidados, atribuindo cada objeto na variável local convidado. Isso faz com que vários elementos tr sejam renderizados na página. Dentro de cada tr existem 2 elementos td. O texto que eles irão exibir vem do atributo th:text, junto com a expressão ${}, lendo as propriedades da variável 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 nós conseguimos automatizar uma série de tarefas. Mas talvez o que mais fez o Maven ter sucesso, foi o gerenciamento de dependências. É muito bom poder escrever algumas linhas e já ter a biblioteca disponível para o nosso projeto. Como começar com Apache Maven? Para saber mais sobre como começar 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 2.11. O Spring Tool Suite - STS O Spring Tool Suite, ou STS, é um Eclipse com vários plugins úteis para o trabalho com o Spring. Existem versões para Windows, Mac e Linux em https://spring.io/tools/sts/all. www.algaworks.com 21 A instalação é como a do Eclipse, basta baixar e descompactar. Nós 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 experiência e gosta de outra IDE, não se preocupe, existe uma alternativa para a criação dos seus projetos Spring, basta acessar o Spring Initializr online em http://start.spring.io. www.algaworks.com 22 3.2. Criando o projeto no STS Vamos começar criando o projeto no STS. Com o STS aberto, clique em File -> New -> Spring Starter Project, como mostra a figura abaixo. Vamos agora começar a configurar nossa aplicação. • 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 versão do Java que está configurada para seu ambiente (recomendo que você use a versão 1.8) • Em Language, claro, será Java Group, Artifact e Version são informações 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 versão de desenvolvimento, e que se gerarmos um jar ou war dele, teremos apenas um momento do projeto e não uma versão final ainda. • Se quiser adicionar uma descrição 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 aplicação. Informe com.algaworks.festa Veja na imagem abaixo a tela preenchida com as informações. Após 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 opções clicando nas pequenas setas, como em Database, e veja as opções que são possíveis selecionarmos. Essa tela é muito útil para iniciarmos o desenvolvimento da nossa aplicação, pois ela é a base para o STS gerar o arquivo pom.xml, ou seja, ao invés de você ter que lembrar o nome completo das dependências do Spring MVC, pode apenas selecionar “Web”. Nossa aplicação só precisa das opções “DevTools”, “Web”, “Thymeleaf”, “JPA” e “H2” selecionadas. Confira na imagem abaixo, e logo em seguida clique em Finish. www.algaworks.com 27 Acontece que o Spring Boot usa um container embarcado (por padrão é o Tomcat) para facilitar o desenvolvimento, então para iniciar nossa aplicação, basta executarmos o método main da classe GestaoFestaApplication. Analisando o código com mais detalhes, vemos a anotação: @SpringBootApplication Ela diz que a classe faz parte da configuração do Spring. Poderíamos adicionar configurações customizadas, por exemplo, definir o idioma ou até fazer redirecionamentos caso não encontre uma página, mas como já vimos, o Spring Boot define muitos comportamentos padronizados, e não precisaremos alterar nada para ter a aplicação funcionando. Também define o ponto de partida para a procura dos demais componentes da aplicação, ou seja, todas as classes dos pacotes descendentes de com.algaworks.festa serão escaneadas e, se algum componente Spring for encontrado, será gerenciado, e isso facilitará muito a nossa vida (você verá no desenvolvimento da aplicação). 3.3. Criando o controller Lembra quando vimos que em um framework action based a requisição é entregue ao controller? Então, agora é o momento para criarmos essa classe que receberá a requisição e dirá o nome da view ao framework, para então ser renderizada de volta ao browser do cliente. Para começarmos bem devagar, esse primeiro controller só retornará o nome da view, depois vamos incrementar um pouco mais adicionando objetos para serem renderizados na página. Vamos criar uma nova classe Java e começar a programá-la. www.algaworks.com 30 É importante estar atento ao pacote que a classe irá ficar. Para deixar nosso código 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, então o nome completo nos faz pensar que essa classe “é o controlador de convidados”. www.algaworks.com 31 O código é 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 método que receberá a requisição e retornará o nome da view. www.algaworks.com 32 Para vermos algo funcionando o mais rápido possível, vamos criar uma página simples com o Thymeleaf. Para deixar nosso sistema mais bonito, vamos usar o Bootstrap. Iremos usar também a biblioteca WebJars, que vai nos permitir gerenciar os recursos (CSS e JS) necessários do Bootstrap através 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 código para melhor entendimento. Logo no início 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 código acima funciona normalmente em um HTML comum, mas não 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 importação do Bootstrap, um framework HTML, CSS e JavaScript para desenvolvimento de aplicações responsivas pra web, e que nos ajuda a criar páginas bem mais elegantes com menos esforço: <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 importação acima. Primeiro é que, na importação do Bootstrap, utilizamos a biblioteca WebJars. Isso é para que não tenhamos que fazer o download do Bootstrap para dentro do nosso projeto. Nós simplesmente incluimos, dentro do nosso pom.xml, a dependência 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 expressão @{}. A vantagem dessa expressão é que ela coloca o contexto da aplicação nos links do projeto. Ainda veremos mais sobre essa expressão. www.algaworks.com 36 3.5. Rodando o projeto pela primeira vez Já temos algo executável, nada funcional ainda, mas já podemos ver algo rodando no browser e ficar felizes por termos nossa aplicação 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 várias mensagens, depois de alguns segundos nossa aplicação estará no ar. www.algaworks.com 37 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> { } Não precisamos nem mesmo adicionar a anotação @Repository que geralmente fazemos em repositórios 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 e Convidados, fazem parte do Model no padrão MVC. 3.7. Enviando um objeto do Controller para a View Agora que já temos o repositório pronto, podemos enviar a lista de convidados do controller para a view, e essa tarefa é muito simples. Ao invés de retornar uma String com o nome da view, podemos retornar um objeto do tipo ModelAndView, que nos permite, além 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 repositório no controller, e isso nos livra da preocupação de como receber esse objeto na classe. Veja também a anotação @GetMapping que anota o nosso método listar(). Ela diz que nosso método irá responder a requisição HTTP do tipo GET para /convidados. Já dentro de listar(), o construtor de ModelAndView recebe o nome da view e com o método addObject() podemos adicionar objetos para a view. 3.8. Listando objetos com o Thymeleaf Agora que já temos o controller recuperando os dados do repositório 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 página mais bonita. Para este exemplo vamos utilizar o Panel with heading, que consiste em um painel com um cabeçalho 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>João</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 invés de deixar fixo como está. Precisamos de algo que itere e gere várias linhas (tr) e, nas colunas (td), permita inserir o nome e a quantidade de acompanhantes do convidado. Agora que o Thymeleaf entra em ação! 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 expressão ${convidados} para recuperar o objeto adicionado pelo controller, lembra do nome que usamos para adicionar no ModelAndView? Foi “convidados”, né? Então, esse é o nome que usamos na expressão ${}. Lembre-se que nessa variável temos uma lista de convidados, portanto, podemos iterar nela. www.algaworks.com 42 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 expressão *{} para selecionar a propriedade do objeto convidado. Nesse momento o formulário está recebendo um novo objeto do tipo Convidado e suas propriedades nome e quantidadeAcompanhantes estão ligadas às tags input do form. Para finalizar nosso formulário, precisamos apenas dizer para qual endereço 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 expressão @{}, como comentamos anteriormente, é muito útil quando queremos utilizar links no nosso HTML, pois ela irá resolver o context path da aplicação automaticamente. Nosso formulário está pronto, podemos ver que ele será enviado via POST para o endereço /convidados. No nosso controller não existe um método capaz de receber uma requisição POST em /convidados. Vamos criá-lo agora: @PostMapping("/convidados") public String salvar(Convidado convidado) { } Observe que o método salvar() recebe como parâmetro um objeto do tipo Convidado. O Spring MVC já vai criá-lo e definir os valores enviados pelo formulário neste objeto, facilitando muito nosso trabalho. www.algaworks.com 45 Com o objeto pronto, podemos simplesmente adicioná-lo ao repositório. @PostMapping("/convidados") public String salvar(Convidado convidado) { this.convidados.save(convidado); } Depois de salvar o convidado, seria interessante recarregar a página 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 invés de retornarmos o nome da view que queremos renderizar, podemos retornar uma URL para redirecionar a requisição usando “redirect:” na String. @PostMapping("/convidados") public String salvar(Convidado convidado) { this.convidados.save(convidado); return "redirect:/convidados"; } No método acima, a string redirect:/convidados faz com que o browser faça uma nova requisição 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 métodos 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 anotações @GetMapping e @PostMapping irão começar sempre com /convidados. A aplicação final deve se parecer com a imagem abaixo. 3.10. Escolhendo o banco de dados Como estamos fazendo o uso do JPA (através do Spring Data JPA), configurar e até mesmo trocar o banco de dados se torna uma tarefa bem simples. Mais no início, quando criamos o nosso projeto, você deve ter visto que adicionamos a dependência do banco de dados H2. Isso facilitou nosso trabalho até aqui. www.algaworks.com 47 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 a anotação @Configuration torna a nossa classe InMemorySecurityConfig uma classe que poderia abrigar quaisquer outras configurações do Spring. Para melhor organizar, iremos deixar aqui somente o que for relacionado a autenticação de usuários. O método configureGlobal, anotado com @Autowired, poderia ter qualquer outro nome, mas esse é uma convenção adotada para quando queremos configurar nosso AuthenticationManagerBuilder. Dentro do método temos a configuração de três usuários que podemos agora utilizar para nos autenticar no sistema. Reinicie a aplicação e tente acessá-la novamente. www.algaworks.com 50 Algaworks [1 localhost:8080/cor x RN e C | O localhost:s080/convidados Authentication Required http://localhost:8080 requires a username and password. User Name: |normandes Cancel || Login wwwalgaworks.com 51 Capítulo 4 Publicando a aplicação 4.1. Introdução Esse capítulo será como a cereja do bolo. Veremos como fazer a publicação do nosso projeto na nuvem, simulando que estamos colocando ele em produção. Iremos utilizar a nuvem do Heroku e teremos a vantagem de ter toda a plataforma configurada pelo mesmo. Só precisamos enviar nossa aplicação. Mas para isso, precisamos realizar algumas pequenas adaptações para compatibilizar o nosso projeto. Basicamente, teremos que preparar nosso projeto para funcionar com o banco de dados Postgres. Depois iremos precisar de duas instalações sobre as quais rodaremos os comandos para publicação do projeto. Talvez você se pergunte: “Por que utilizar o Postgres? No Heroku não tem MySQL?”. O Heroku tem sim o MySQL, mas para colocar ele em nossa aplicação será preciso fazer a confirmação da nossa conta. Essa confirmação é feita com a inclusão do cartão de crédito. Como muitos não tem ou não querem informar um cartão, então vamos remover essa barreira colocando o Postgres do Heroku, que não exige uma conta confirmada. www.algaworks.com 52 Para quem for utilizar o MySQL no Heroku, esse tópico é opcional. 4.4. Criando o arquivo de inicialização 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 aplicação. 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. Não podemos esquecer dele, pois ele carrega a nossa configuração 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 instalação é bem simples. O Git é o gerenciador de código-fonte mais utilizado no mundo. É através dele que o Heroku recebe nosso código para depois compilar e publicar. Nós não precisaremos de muitos comandos do Git, mas as pessoas que desejarem se aprofundar, podem começar pela documentação do mesmo, que é bem ampla. Depois da instalação, vamos precisar iniciar um repositório e fazer o commit de nossos arquivos. Obviamente, aqueles que clonarem com o Git o código-fonte que disponibilizamos já terão esse repositório iniciado. Não será necessário iniciar e nem mesmo comitar - a menos, é claro, que tiverem feito alguma alteração no mesmo. www.algaworks.com 55 De qualquer forma, os comandos que vou apresentar agora deverão 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 repositório local vamos utilizar o comando: $ git init Depois, iremos adicionar os arquivos que desejamos que sejam incluídos 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 próximo passo é o commit: $ git commit -m "Primeiro commit." Ainda será dado mais um comando com o Git, mas antes precisamos configurar nossa aplicação no Heroku. 4.6. Configurando a aplicação no Heroku Primeiramente é preciso ir até o site do Heroku, clicar em algum botão 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 instalação para cada sistema operacional, você encontra em https://devcenter.heroku.com/articles/heroku-cli. Agora sim, depois da instalação do Heroku CLI, podemos rodar os comandos que vão configurar nossa aplicação. Abra novamente o terminal e vá até a pasta do projeto. $ cd /pasta/do/projeto/gestao-festa Obrigatoriamente, para configurar nossa aplicação, precisamos estar logados no Heroku pelo terminal. Fazermos isso com o comando login. $ heroku login Será pedido um usuário e senha para você. São os mesmos que você informou no cadastro dentro do site. Agora podemos criar nossa aplicação lá dentro do Heroku. $ heroku create aw-gestao-festa Usamos o comando create para isso. O parâmetro passado é o nome que nossa aplicação irá ter no Heroku. O nome não é obrigatório e se não for passado, um aleatório será gerado para você. O nome de uma aplicação 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 aplicação, mas o banco de dados ainda precisa ser adicionado. Como você já sabe, nós 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 As informações mais importantes mostradas acima são o tipo de hospedagem que estamos utilizando (free, no caso) e a quantidade de horas que temos disponíveis para utilizar no mês corrente com o tipo gratuito de hospedagem. www.algaworks.com 60 Capítulo 5 Conclusão 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 prática tudo que aprendeu. Não se contente em apenas ler esse livro. Pratique, programe, implemente cada detalhe, caso contrário, em algumas semanas já terá esquecido grande parte do conteúdo. Afinal de contas, nada melhor do que colocar a mão na massa, não é 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. Próximos passos Embora esse livro tenha te ajudado a criar uma aplicação do início 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ê não perdeu tempo com o que acabou de estudar, o que nós 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 CURSO ONLINE DESENVOLVIMENTO WEB ONES AA UCs
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved