Untitled

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson

Questions and Answers

Qual atributo Thymeleaf é usado para preencher os campos de um formulário com os dados de um objeto?

  • `th:href`
  • `th:value`
  • `th:action`
  • `th:object` e `th:field` (correct)

Por que é necessário passar o ID ao editar um registro no Spring?

  • Para garantir que os dados sejam criptografados corretamente.
  • Para validar as permissões do usuário que está fazendo a edição.
  • Para que o Spring saiba que se trata de um registro existente e não criar um novo. (correct)
  • Para registrar a data e hora da alteração no banco de dados.

Qual atributo Thymeleaf é utilizado para criar links dinâmicos em uma página?

  • `th:src`
  • `th:href` (correct)
  • `th:object`
  • `th:value`

Na construção de URLs dinâmicas com Thymeleaf, qual expressão é utilizada para auxiliar na criação de links e permitir a passagem de variáveis?

<p><code>@{...}</code> (B)</p> Signup and view all the answers

Para implementar a funcionalidade de confirmação de exclusão de um registro, qual componente de interface é sugerido no texto?

<p>Uma janela modal do Bootstrap. (C)</p> Signup and view all the answers

Qual tipo de objeto é automaticamente considerado iterável pelo atributo th:each no contexto apresentado?

<p>Objetos que implementam <code>java.util.Iterable</code>. (D)</p> Signup and view all the answers

Ao iterar sobre um objeto que implementa a interface java.util.Map usando th:each, qual é o tipo da variável de iteração?

<p><code>java.util.Map.Entry</code> (C)</p> Signup and view all the answers

Qual anotação é utilizada no Controller para manter um atributo disponível para todas as páginas, evitando que ele desapareça após um redirecionamento?

<p><code>@ModelAttribute</code> (C)</p> Signup and view all the answers

Qual a principal finalidade de se utilizar um ModelAttribute em um controlador Spring MVC?

<p>Para disponibilizar um objeto no modelo que será usado em múltiplas views, garantindo que o objeto esteja sempre acessível. (A)</p> Signup and view all the answers

No contexto de migração de um projeto Spring Boot do H2 para o MySQL, qual arquivo necessita ser alterado para configurar a conexão com o banco de dados?

<p><code>pom.xml</code> e <code>application.properties</code> (B)</p> Signup and view all the answers

Após a utilização da anotação @ModelAttribute, qual a implicação sobre o uso do método addObjetct no mapeamento /novo?

<p>O método <code>addObjetct</code> torna-se redundante e deve ser retirado do mapeamento <code>/novo</code>. (D)</p> Signup and view all the answers

Considere um cenário onde um objeto 'Status' é adicionado ao modelo usando @ModelAttribute. Após uma requisição, o valor desse 'Status' desaparece inesperadamente da view. Qual a causa mais provável desse comportamento, considerando que o application.properties está corretamente configurado e a dependência do MySQL está presente no pom.xml?

<p>O escopo padrão do <code>@ModelAttribute</code> é Request, e o objeto 'Status' não está sendo explicitamente mantido em Session ou Flash scope. (B)</p> Signup and view all the answers

Qual atributo do Thymeleaf Layout Dialect é usado para definir qual template será o decorator?

<p>layout:decorator (A)</p> Signup and view all the answers

Qual o propósito de usar uma section em PesquisaTitulos.html para informar ao layout sobre o conteúdo?

<p>Para indicar qual parte do layout será substituída pelo conteúdo da página. (D)</p> Signup and view all the answers

Qual atributo Thymeleaf é utilizado para inserir o cabeçalho no LayoutPadrao.html?

<p>th:replace (C)</p> Signup and view all the answers

Por que a barra de navegação (cabeçalho) é separada em um arquivo Cabecalho.html?

<p>Para facilitar a edição e manutenção do cabeçalho. (A)</p> Signup and view all the answers

Qual o benefício principal de usar layouts com Thymeleaf?

<p>Redução da repetição de código e melhor organização. (D)</p> Signup and view all the answers

Após modificar a página PesquisaTitulos.html para usar um layout, qual é o passo crucial para garantir que a modificação foi bem-sucedida?

<p>Verificar se a página continua funcionando como antes. (B)</p> Signup and view all the answers

Considerando que LayoutPadrao.html contém a estrutura geral do site e Cabecalho.html contém a barra de navegação, qual seria a implicação se o atributo th:replace fosse substituído por th:include ao inserir o cabeçalho no layout?

<p>O conteúdo de <code>Cabecalho.html</code> seria inserido dentro da tag onde <code>th:include</code> é utilizado, mantendo a tag original. (D)</p> Signup and view all the answers

Suponha que você precise adicionar um novo script JavaScript em todas as páginas que usam o LayoutPadrao.html. Onde você adicionaria esse script e como garantiria que ele fosse carregado corretamente?

<p>Diretamente no <code>LayoutPadrao.html</code>, antes da tag de fechamento <code>&lt;/body&gt;</code>, para garantir que seja carregado após o conteúdo da página. (C)</p> Signup and view all the answers

Em um cenário onde LayoutPadrao.html define a estrutura básica da página, Cabecalho.html contém a barra de navegação, e PesquisaTitulos.html exibe os resultados da pesquisa, como você implementaria uma funcionalidade que permite que o título da página (<title>) seja dinâmico e específico para cada página, mantendo o uso de layouts e fragmentos do Thymeleaf?

<p>Criar uma section no <code>LayoutPadrao.html</code> para o título, que é substituída pelo conteúdo específico de cada página (e.g., <code>PesquisaTitulos.html</code>), definindo o título dinamicamente. (D)</p> Signup and view all the answers

Qual é o propósito das diretrizes de design ao criar ícones, conforme mencionado no texto?

<p>Representar conceitos universais usados em uma UI de forma simples e mínima. (A)</p> Signup and view all the answers

Qual estrutura é necessária para adicionar um link ao ícone de edição, de acordo com o texto?

<p>Uma estrutura que repasse o ID de cada registro para criar o link automaticamente. (B)</p> Signup and view all the answers

Dentro do contexto do texto, qual a função do RequestMapping ao referenciar registros para edição?

<p>Mapear uma URL específica (como <code>/titulos/5</code>) para a edição do registro correspondente. (B)</p> Signup and view all the answers

Qual é o papel da anotação @PathVariable no processo de edição de registros?

<p>Extrair o valor de uma variável diretamente da URL, onde o valor faz parte do próprio caminho da URL. (C)</p> Signup and view all the answers

O que o Spring faz com o código e título passados para identificar um registro, de acordo com o texto?

<p>Automaticamente identifica o registro sem a necessidade de um método de busca adicional. (D)</p> Signup and view all the answers

No contexto da edição, qual é a função do ModelAndView e do método addObject?

<p><code>ModelAndView</code> define a página a ser exibida, e <code>addObject</code> envia os dados do registro para essa página. (A)</p> Signup and view all the answers

Qual é o resultado esperado ao acessar uma URL como localhost:8080/titulos/1 após implementar a edição?

<p>A página de cadastro preenchida com as informações do registro com ID 1. (B)</p> Signup and view all the answers

Como o ícone de edição é integrado na página de pesquisa, considerando as informações fornecidas?

<p>O texto não especifica como a implementação do ícone de edição é feita na página de pesquisa. (D)</p> Signup and view all the answers

Em relação ao uso de RequestMapping e @PathVariable, qual das seguintes situações representa o uso mais correto e eficiente dessas anotações em um cenário de edição?

<p>Utilizar <code>RequestMapping</code> para mapear todas as edições para <code>/titulos/{id}</code> e usar <code>@PathVariable</code> para extrair o ID, permitindo um método genérico que pode lidar com qualquer registro. (D)</p> Signup and view all the answers

Suponha que, ao tentar editar um registro com ID '7' (localhost:8080/titulos/7), a página de cadastro é exibida, mas os campos estão vazios. Qual é a causa mais provável desse problema, considerando o fluxo de edição descrito?

<p>O método <code>addObject</code> está passando um objeto nulo para a página de cadastro, resultando em campos vazios. (D)</p> Signup and view all the answers

Qual é o propósito de adicionar um conjunto de chaves extras nos elementos de data e valor?

<p>Para permitir que o Thymeleaf busque os padrões de formatação definidos no modelo de Título. (B)</p> Signup and view all the answers

Qual pipe do Thymeleaf é utilizado e qual o seu o propósito na formatação do valor?

<p>O pipe <code>| |</code> é utilizado para concatenação de strings, como adicionar 'R$' antes do valor numérico. (B)</p> Signup and view all the answers

Como o Bootstrap é utilizado para indicar o status de um título?

<p>Usando <em>badges</em> com cores diferentes para 'pendente' e 'recebido'. (B)</p> Signup and view all the answers

Para que serve o método isPendente dentro da classe Titulo?

<p>Para determinar se um título está pendente ou não, retornando um valor booleano. (C)</p> Signup and view all the answers

Qual atributo do Thymeleaf é usado para adicionar classes CSS dinamicamente a um elemento HTML, com base em uma condição?

<p><code>th:classappend</code> (D)</p> Signup and view all the answers

Qual classe do Bootstrap seria inserida via classappend para indicar um título como 'pendente'?

<p><code>badge-danger</code> (C)</p> Signup and view all the answers

Em qual contexto o uso do classappend no Thymeleaf é mais vantajoso em comparação à manipulação direta do DOM com JavaScript?

<p>Quando se deseja manter a lógica de apresentação diretamente no template HTML, facilitando a manutenção e reduzindo a complexidade do código JavaScript. (C)</p> Signup and view all the answers

Considerando a necessidade de internacionalização da aplicação, qual seria a melhor abordagem para exibir o símbolo da moeda (R$) de forma flexível?

<p>Utilizar as funcionalidades de i18n do Thymeleaf para buscar o símbolo da moeda correto com base na localidade do usuário. (D)</p> Signup and view all the answers

Como você otimizaria a performance da aplicação ao lidar com um grande número de títulos na página, considerando o uso de badges e classappend?

<p>Implementar paginação para limitar o número de títulos exibidos por página e utilizar cache no servidor para reduzir o tempo de resposta. (A)</p> Signup and view all the answers

Imagine que, além de 'pendente' e 'recebido', um título possa ter o status de 'cancelado'. Como você estenderia o código para incluir essa nova possibilidade, mantendo a clareza e a manutenibilidade?

<p>Criar um novo método na classe <code>Titulo</code> que retorna o nome da classe CSS correta com base no <em>status</em> e usar esse método diretamente no atributo <code>th:class</code>. (C)</p> Signup and view all the answers

Flashcards

Objetos Iteráveis em Thymeleaf

Objetos que podem ser iterados usando th:each no Thymeleaf. Inclui objetos Iterable, Map, arrays e outros objetos (tratados como listas de valor único).

@ModelAttribute

A anotação @ModelAttribute associa um parâmetro de método ou valor de retorno a um atributo do modelo, tornando-o acessível na visualização web.

Disponibilidade de Status com @ModelAttribute

Usar @ModelAttribute no Controller para manter os Status disponíveis tanto para /titulos/novo quanto para /titulos.

application.properties

Um arquivo no Spring Boot onde configuramos as propriedades da nossa aplicação, como as configurações do banco de dados.

Signup and view all the flashcards

Migração para MySQL

Remover a dependência do H2 e adicionar a dependência do MySQL Connector no arquivo pom.xml.

Signup and view all the flashcards

Tratamento de Objetos Não Iteráveis

Qualquer objeto que não seja Iterable, Mapa ou Array é tratado como uma lista de valor único contendo o próprio objeto.

Signup and view all the flashcards

java.util.Map.Entry

Classes internas usadas ao iterar sobre mapas no Thymeleaf. Fornece acesso à chave e ao valor de cada entrada no mapa.

Signup and view all the flashcards

PesquisaTitulos.html: Configuração Layout

Namespace do Thymeleaf Layout Dialect e define o decorator (Layout).

Signup and view all the flashcards

Section em PesquisaTitulos.html

Define a seção do conteúdo a ser injetada no layout principal.

Signup and view all the flashcards

Verificação pós-layout

Assegura que a página continua funcional após a modificação para usar o layout.

Signup and view all the flashcards

Tarefa: Layout no Cadastro

Aplicar a mesma configuração de layout à página de cadastro.

Signup and view all the flashcards

Benefício do Layout

Reduzir a duplicação de código e facilita a manutenção.

Signup and view all the flashcards

Separar Elementos do Layout

Dividir elementos do layout em arquivos separados para melhor administração.

Signup and view all the flashcards

Cabecalho.html

Arquivo HTML que contém o código do cabeçalho da página.

Signup and view all the flashcards

Código Destacado

Moveu-se o código do cabeçalho para um arquivo separado para facilitar a manutenção.

Signup and view all the flashcards

th:replace no LayoutPadrao.html

Substitui uma parte do layout pelo conteúdo do arquivo Cabecalho.html.

Signup and view all the flashcards

th:object e th:field

Usado para pré-preencher formulários com dados de um objeto, facilitando a edição.

Signup and view all the flashcards

Campo ID na edição

Necessário para que o Spring saiba que se trata de uma atualização de um registro existente, e não da criação de um novo.

Signup and view all the flashcards

th:href

Utilizado no Thymeleaf para construir URLs dinamicamente, permitindo a criação de links com variáveis.

Signup and view all the flashcards

@{}

Uma expressão do Thymeleaf que facilita a construção de links dinâmicos, permitindo a inclusão de variáveis.

Signup and view all the flashcards

Janela Modal (de Exclusão)

Janela que aparece para confirmar se o usuário realmente deseja deletar um registro.

Signup and view all the flashcards

Chaves extras em Thymeleaf

Conjunto de chaves adicionais nos elementos de data e valor para formatação.

Signup and view all the flashcards

Concatenação com pipe (|)

Utilizar o pipe (|) do Thymeleaf para juntar strings, como 'R$' antes de um valor.

Signup and view all the flashcards

Badge do Bootstrap

Componente do Bootstrap para exibir o status visualmente (verde para recebido, vermelho para pendente).

Signup and view all the flashcards

Método isPendente()

Método booleano na classe Título para verificar se o título está pendente.

Signup and view all the flashcards

Classes badge Bootstrap

Classes do Bootstrap para status: 'badge badge-success' (verde) e 'badge badge-danger' (vermelho).

Signup and view all the flashcards

classappend do Thymeleaf

Atributo do Thymeleaf para adicionar uma classe CSS a um elemento HTML.

Signup and view all the flashcards

Badge vermelho (pendente)

Incluir a classe 'badge-danger' se o título estiver pendente.

Signup and view all the flashcards

Inserir classe com Thymeleaf

Dizer ao Thymeleaf para inserir a classe 'badge-danger' junto à classe 'badge' no atributo 'class'.

Signup and view all the flashcards

Formatação de data e valor

Melhorar a aparência de datas e valores formatando-os adequadamente.

Signup and view all the flashcards

Visualização de status

Utilizar badges do Bootstrap para indicar visualmente o status de um título (pendente/recebido).

Signup and view all the flashcards

Ícones de UI

Ícones criados seguindo diretrizes de design para representar conceitos universais de UI de forma simples.

Signup and view all the flashcards

Ícone de Edição

Adicionar um ícone de edição em uma página de pesquisa.

Signup and view all the flashcards

Link de Edição Dinâmico

Estrutura necessária para criar links dinâmicos para edição, incluindo o ID do registro.

Signup and view all the flashcards

RequestMapping para Edição

Mapeia URLs para ações no controlador. Ex: '/titulos/5' mapeia para edição do registro com ID 5.

Signup and view all the flashcards

@PathVariable

Anotação que extrai o valor de uma variável diretamente da URL.

Signup and view all the flashcards

Edição Direta com Spring

O Spring identifica o registro a ser editado pelo código passado na URL, sem busca manual.

Signup and view all the flashcards

ModelAndView para Edição

Transfere a página de cadastro preenchida com os dados do registro especificado pelo PathVariable.

Signup and view all the flashcards

Teste de Edição

Acessar uma URL no navegador, como 'localhost:8080/titulos/1', para editar o registro com ID 1.

Signup and view all the flashcards

Significado de ícones

Representações visuais simples e minimalistas de conceitos universais usados em interfaces de usuário.

Signup and view all the flashcards

Propósito do @PathVariable

Permite que o Spring MVC acesse valores de variáveis diretamente da URL.

Signup and view all the flashcards

Study Notes

  • Este documento fornece um guia sobre como exibir mensagens para o usuário em aplicações Spring, com foco no uso do Thymeleaf para renderizar alertas do Bootstrap.
  • Thymeleaf deve ser usado para configurar uma div a ser exibida apenas quando há uma mensagem a ser mostrada.

Thymeleaf

  • Thymeleaf é um engine de template para Java alternativo ao JSP.
  • Os templates Thymeleaf são escritos em código HTML5 e têm integração com o Spring Framework.
  • O Thymeleaf também pode processar código CSS e JavaScript.
  • Thymeleaf oferece modelos naturais para desenvolvimento, permitindo a exibição correta nos navegadores.
  • Também funciona como protótipos estáticos, o que fortalece a colaboração nas equipes de desenvolvimento.
  • Não é um projeto Spring, mas uma biblioteca que facilita a criação da camada de view com integração com o Spring, sendo uma boa alternativa ao JSP.
  • O dialeto do Thymeleaf é muito poderoso, fornecendo uma forma elegante e bem formatada de criar páginas.

Modelos HTML

  • Os modelos HTML escritos no Thymeleaf parecem e funcionam como HTML.
  • Isso permite que os modelos continuem funcionando como artefatos de design úteis.

Variáveis

  • A expressão ${} interpreta variáveis locais ou disponibilizadas pelo controller.
  • O atributo th:each itera sobre uma lista.
  • Cada objeto da lista é atribuído a uma variável local.
  • th:text junto com a expressão ${} exibirão os valores das propriedades de um objeto.

Condicional Thymeleaf

  • th:if dentro do Thymeleaf permite exibir condicionalmente elementos HTML com base em uma expressão booleana.
  • Esta condição é semelhante a estruturas if em outras linguagens.

Uso do Th:if

  • Um objeto utilitário #strings pode ser utilizado para trabalhar com strings, fornecendo métodos como isEmpty para verificar se uma string está vazia.
  • th:if="${!#strings.isEmpty(mensagem)}" exibe um elemento HTML somente se a variável mensagem não estiver vazia.
  • Se o atributo mensagem estiver vazio, o alert não aparece na página.

Criando a mensagem no Controller

  • É preferível usar ModelAndView em vez de String para especificar a view a ser renderizada e os dados que ela usará.
  • ModelAndView permite adicionar um objeto (mensagem) que contém o texto "Foi salvo com sucesso!" para ser exibido na view.

Integração com o HTML

  • O atributo th:text permite exibir o valor da mensagem no HTML.
  • Substitui o texto estático "Salvo com sucesso!" pelo valor dinâmico da variável mensagem recebida do controller.

Preenchimento Dinâmico de Campos

  • O preenchimento dinâmico de campos de status envolve o recebimento de uma coleção de status.
  • É necessário iterar sobre essa coleção e devolver ao usuário.

Alterações no Controller

  • Use @RequestMapping("/novo") para o mapeamento da URL.
  • Use StatusTitulo.values() para retornar todos os StatusTitulo.
  • Para preencher o campo de status dinamicamente, o atributo th:each é usado para iterar sobre os possíveis status passados pelo Controller.
  • O script usa th:value e th:text para definir o valor e o texto exibido para cada opção de status.

Enum StatusTitulo

  • Este enum define as opções de status possíveis ("Pendente" e "Recebido").
  • Está associado a uma descrição privada.
  • O status : ${todosStatusTitulo} atribui esse fragmento a uma variável chamada status.
  • Não apenas objetos java.util.List podem ser usados para iteração no Thymeleaf, mas também objetos java.util.Iterable, java.util.Map, arrays, etc.

ModelAttribute

  • Pode ser utilizado para lidar com problemas ao retornar uma mensagem para o usuário onde o status desaparece.
  • ModelAttribute é uma anotação que liga um parâmetro de método ou valor de retorno de método a um atributo de modelo nomeado.
  • Nesse caso, o atributo estará disponível para todas as páginas web.
  • É preciso remover o addObject, que foi adicionado ao mapeamento /novo.

MySQL

  • A dependência do H2 deve ser removida e o conector MySQL deve ser inserido no pom.xml para utilizar o MySQL no projeto.
  • Código para adicionar conector My SQL:
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
  • Algumas informações devem ser inseridas no arquivo application.properties.
 spring.datasource.url=jdbc:mysql://localhost:3306/cobrancas
 spring.datasource.username=root
 spring.datasource.password=root
  • É preciso criar o banco de dados cobrancas no MySQL.
  • Para corrigir erros, inclua spring.jpa.hibernate.ddl-auto=update no seu arquivo application.properties.

Página de Pesquisa

  • Para a página de pesquisa é preciso criar em Templates, o arquivo PesquisaTitulos.html.
  • Os seguintes códigos devem ser criados no código PesquisaTitulos.html:
<table class="table table-bordered table-striped">
    <thead>
        <tr>
        <th scope="col" class="text-center">#</th>
        <th scope="col">Descrição</th>
        <th scope="col" class="text-left">Data de vencimento</th>
        <th scope="col" class="text-right">Valor</th>
        <th scope="col" class="text-center">Status</th>
        <th scope="col"></th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td colspan="6">Nenhum registro encontrado.</td>
        </tr>
    </tbody>
</table>
  • Para que se veja a página, o Controller deve ser mapeado.
  • @RequestMapping não foi passada nenhum outro valor como nos métodos novo() e salvar().
  • Nesse caso, em pesquisar() será atribuída o mesmo mapeamento realizado no início do controller.

Thymeleaf

  • Podemos transformar parte do código em um layout para evitar a repetição de código.
  • Um ferramenta chamada Thymeleaf Layout Dialect pode ser utilizada (https://github.com/ultraq/thymeleaf-layout-dialect).
  • Adicione a dependência para utilizar esta ferramenta no pom.xml:
<dependency>
    <groupId>nz.net.ultraq.thymeleaf</groupId>
    <artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>
  • Crie um arquivo LayoutPadrao.html dentro da pasta templates.
  • O código dentro do LayoutPadrao.html é o mesmo do arquivo PesquisaTitulos.html, mas sem o conteúdo central.
  • Inclua o namespace do Thymeleaf Layout Dialect no LayoutPadrao.html:
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
  • Insira o seguinte código abaixo da barra de navegação:
<section layout:fragment="conteudo">
    <p>Conteúdo principal</p>
</section>
  • No arquivo PesquisaTitulos.html, insira estas linhas de código:
layout:decorate="~{LayoutPadrao}">
  • Para concluir crie uma seção no código de PesquisaTitulos.html para informar qual conteúdo corresponde.
<section layout:fragment="conteudo">
  
</sectio
  • Para continuar agora inclua a anotação a seguir em todos arquivos html para evitar erros:
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
  • Para uma melhor organização e otimização de código separe os itens de layout para administrá-lo melhor criando na pasta templates o arquivo Cabecalho.html adicionando seus códigos referentes.

Para que o cabeçalho seja incluído dentro do Layout, usar Th:replace

  • Código para esta operação:
<header th: replace="Cabecalho"></header>

Exibindo itens na página de pesquisa

  • Use a classe TitulosController.java para implementar uma forma de enviar os status do título.
  • Para isto implemente no código o seguinte:
@Autowired //anotação que irá injetar dependência
private Titulos titulos;
  • Dentro do método pesquisar, obter os títulos utilizando o findAll(), já disponibilizado pelo JpaRepository. Acrescentando, as linhas de códigos:
List<Titulo> todosTitulos = titulos.findAll();
ModelAndView mv = new ModelAndView("PesquisaTitulos");
mv.addObject("titulos", todosTitulos);
  • Na página de cada um dos casos você deve inserir o esse código no PesquisaTitulos.html:
<tr scope="row" th:each="titulo: ${titulos}">
 <td class="text-center" th:text="${titulo.codigo}"></td>
 <td th:text="${titulo.descricao}"></td>
 <td class="text-center" th:text="${titulo.dataVencimento}"></td>
 <td class="text-right" th:text=" ${titulo.valor}"></td>
 <td class="text-center" th:text= h:text="${titulo.status.descricao}"></td>
 <td></td>
</tr>

Removendo a mensagem "Nenhum registro encontrado"

  • Para remover a mensagem, o seguinte código deve ser utilizado:
<tr
 <td colspan="6" th:if="${#lists.isEmpty(titulos)}">Nenhum título foi encontrado</td>
</tr>
  • Para melhor a aparência da data de vencimento e a do valor, inclua o seguinte trecho de código:
<td class="text-center" th:text="${{titulo.dataVencimento}}"></td>
<td class="text-right" th:text=" ${{titulo.valor}}"></td>
  • Podemos melhorar a visualização do valor, incluindo R$ antes do numeral incluindo o pipe(|) fazendo a concatenação.
  • Para este operação usa a seguinte sintaxe de código:
<td class="text-right" th:text="/R$ ${{titulo.valor}}/"></td>

Badge do bootsrap

  • Badge do bootsrap pode ser usado para melhorar a visualização do status, para essa operação o pendente na cor vermelha e o recebido na cor verde.
  • Para definir essa configuração leia as informações de configuração na página: (https://getbootstrap.com/docs/4.0/components/badge/).
  • Deve ser criado dentro da classe Titulo, no pacote model, um método que retornar um booleano, para tratarmos o status. Usar o método isPendente na pesquisa de títulos.
  • Para utilizar a classe badge, tem se duas situações:
  • Cor verde, badge badge-success
  • Cor vermelha, badge badge-danger
  • A seguinte linha de código deve ser utilizada:
 <td class="text-center">
          <span class="badge" th:text="${titulo.status.descricao}"
     th: classappend="${titulo.pendente ? 'badge-danger' : 'badge-success'}"></span
        </td>

Validações

  • Atualmente a página permite criar registros sem verificar os parâmetros dos formulários.
  • Para tanto usaremos a ferramenta Bean Validation para criar algumas regras, uma especificação que permite validar objetos com facilidade.
  • Para mais informações consulte: https://beanvalidation.org/.
  • Para aplicar um validação inclua as anotações @NotNull na classe Titulo do código:
@NotNull
@NumberFormat(pattern="#,##0.00")
private BigDecimal valor;

O valor será validado para não ser nulo.

  • Na classe TituloController, tem que inserir a anotação @Validated no código:
@RequestMapping(method RequestMethod.POST)
public ModelAndView salvar(@Validated Titulo titulo, Errors errors)

O sistema deve ser testado então, e caso ele não exiba os devidos dados, acrescente a seguinte linha de código:

 if(errors.hasErrors( )) {
 return mv;
  • Para que você consiga obter as mensagens e mostrá-los para o usuário, você deve resgatar o objeto titulo.
  • Para tal acesse CadastroTitulo.html e insira esta linha:
th:object="${titulo}"
  • Para exibir as mensagens de erro adicione estas linhas ao html:
<div class="alert alert-danger alert-dismissible fade show"
role="alert" th:if="${#fields.hasAnyErrors()}">
<div th:each="detailedError: ${#fields.detailedErrors()}">
             
</div>
</div>
  • Ao acessar a página de novo cadastro, o sistema irá apresentar o objeto titulo ainda não foi passado. Se olharmos o controller, a página de cadastro é passada pelo mapeamento "/novo".

Para tanto acrescento ao Controller.java essas linhas de código:

ModelAndView mv = new ModelAndView("CadastroTitulo");
mv.addObject(new Titulo());
  • Com tudo funcionando, se você testar enviar um registro sem valor, a tela exibirá que o campo não pode ser nulo.
  • O aviso o valor não poder ser nulo pode ser personalizado implementando:
 @NotNull(message = "O valor não pode ser nulo")
  • Podemos melhorar a visualização para o usuário mostrando no qual tenha erro, para esta operação, insira o seguinte código:
${#fields.hasErrors('value')}
  • Depois adicione a mesma classe no bootsrap:
th: classappend="${#fields.hasErrors('valor')} ? is-invalid"
  • Para validar um regra implementa os seguintes códigos, defindo o tamanho máximo de caracteres.
@NotBlank(message="Descrição é obrigatória")
@Size(max = 60, message="A descrição não pode ter mais de 60 caracteres")
private String descricao
  • Após isso implemente a classe is-invalid, caso haja erro na validação da descrição na página de cadastro:
<div class="form-group row">
    <label for="descricao" class="col-sm-2 col-form-label">Descrição</label>
    <div class="col-sm-4">
        <input type="text" class="form-control" id="descricao"
               th:classappend="${#fields.hasErrors('descricao')} ? is-invalid"
               placeholder="Descrição" name="descricao">
    </div>
</div>

Para melhorar a otimização reutilize-se as mensagens seprando-as do arquivo de Cadastro.

  • Primeiramente, criar no diretório Templates, o arquivo Mensagem.html.
  • Depois separe e recorte as mensagens já definidas.
  • Os arquivos html MensagemErro html e Mensagem html são criados e configurados.
  • Para que haja a leitura adicione a seguinte linha de comando no código:
<div th: replace="Mensagem"></div>
<div th: replace="MensagemErro"></div>

É preciso utilizar o th:field para manter as informações, usando o seguinte código:

 <input type="text" class="form-control" id="descricao"
               th: classappend="${#fields.hasErrors('descricao')} ? is-invalid"
 Placeholder="Descrição" th:field="*{descricao}">

Redirecionamento

  • RedirectAttributes precisa ser implementado para contornar e redirecionar para novo requisição.
  • Os códigos a seguir devem ser adicionados:
public String salvar(@Validated Titulo titulo, Errors errors, RedirectAttributes attributes)
 attributes.addFlashAttribute("mensagem", "Foi salvo com sucesso!");
 return "redirect:/titulos/novo";

Edição de Título

  • Crie dentro do controller a função edicao com a sintaxe a seguir:
@RequestMapping("{codigo}")
public ModelAndView edicao(@PathVariable ("codigo") Titulo titulo)
 ModelAndView mv = new ModelAndView("CadastroTitulo");
 mv.addObject(titulo);
 return mv;
}
  • É imprescindível que seja passado o código e um Titulo, para realizar a alteração.
  • O código seguinte código na lista de marcação deve ser utilizado:
<i class="material-icons">edit</i>
  • Para deixar automatizado o link insira no código:
<a th:href="@{/titulos/{codigo}(codigo=${titulo.codigo})}">
  • Para concluir a etapa de edição adicionar esse código
<input type="hidden" th:field="*{codigo}">

Excluir Registros

  • Vamos mostrar ao usuário uma janela modal para que, quando o mesmo clicar no botão de deletar, seja feita uma pergunta se ele realmente deseja apagar aquele registro. Para isso, vamos utilizar o modal do Bootsrap. Saiba mais em: https://getbootstrap.com/docs/4.0/components/modal/.
  • Para o modal funcionar, adicionar o arquivo .js do bootstrap, com o nome DialogoConfirmacaoModal.html.
  • No arquivo de Pesquisa, insira o seguinte código:
<div layout:insert="DialogoConfirmacaoExclusao"></div>
  • Insira uma ação com os seguintes códigos
<button type="button" data-toggle="modal" data-target="#confirmacaoExclusaoModal" class="btn btn-link" title="Excluir">
            <i class="material-icons">delete</i>

. Repare o id criado anteriormente.

  • Crie o link para a código JQuery funcione.
  • Crie um pasta para o nome cobranca implementando o código.
  • Chame o seguinte código.

Implemente este código

    $('#confirmacaoExclusaoModal').on('show.bs.modal', function(event) {
  var button - $(event.relatedTarget) // Button that triggered the modal
  var codigoTitulo  button.data('codigo
  var descricao Titulo  button.data('descricao') /// Extract info fron data-* atributes
-
    //Update the modal's content. We'll use jQuery here, but you could use a data binding
    library or other methods instead,
    var modal - $(this)
    modal.find('.modal-body span').html('Tem certeza que deseja apagar o registro
')
    7

Adicione este atribute

  • th:attr="data-codigo=${titulo.codigo}, data-descricao=${titulo.descricao}
  • Altere o form da DialogoConfirmacaoModal.html para informar sobre o nome do arquivo.

Adicione o seguinte código

<form th:atr="data-url-base'/titulos method="post">
          <input type="hidden" name -method value--DELETE" />;

Feito isso precisamos criar o excluir no Controller e informar o id a ser deletado. Depois enviaremos a mensagem ao usuário de excluído com sucesso

  • Crie também o link para uma mensagem aparecer na tela
  • Copie codigo da tela de edição e altere o para a seguinte forma. Para isso, no application.properties acrescento o seguinte código.
          spring.mvc.hiddenmethod.filter.enabled=true

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

More Like This

Untitled Quiz
6 questions

Untitled Quiz

AdoredHealing avatar
AdoredHealing
Untitled
44 questions

Untitled

ExaltingAndradite avatar
ExaltingAndradite
Untitled
6 questions

Untitled

StrikingParadise avatar
StrikingParadise
Untitled Quiz
50 questions

Untitled Quiz

JoyousSulfur avatar
JoyousSulfur
Use Quizgecko on...
Browser
Browser