Na liçao anterior você aprendeu a criar uma página que a partir de um parâmetro exibido na URL, exibe os detalhes de um produto. Nesta liçao você vai aprender a criar essa URL dinamicaminente via código.
Sabemos que a URL para exibir detalhes do produto é a seguinte: http://localhost:8080/products/show?name=HP
. Onde name
é o atributo nome do objeto Product
. Ou seja para cada produto que eu desejo exibir os detalhes, eu preciso criar uma URL diferente. Por exemplo, para exibir os detalhes do produto Dell
eu preciso criar a seguinte URL: http://localhost:8080/products/show?name=Dell
.
Logo, precisamos dos nomes dos produtos para criar as URLs e na verdade já temos esses nomes, pois eles estão na página que lista os produtos que chamamos de list
. Abrindo o arquivo você deve se lembrar que usamos o dialeto th:each="product : ${products}
para percorrer a lista de produtos e com o th:text="${product.name}"
exibimos o nome de cada produto.
Agora precisamos criar uma URL para cada produto. Para isso vamos usar o dialeto th:href
que permite criar links juntamente com a expressão de links @{}
. Precisamos adicionar um parâmetro para URL e o Thymeleaf utiliza a seguinte estrutura para permitir esse envio: @{url(parametro=${valor})}
.
Logo, se queremos construir a URL /produtcs/show?name=HP
precisamos fazer o seguinte: th:href="@{/products/show(name=${product.name})}"
.
Adicionamos uma nova coluna na tabela, dentro dessa coluna o link apontando para a página de detalhes do produto que envia o parâmetro name
via URL com o nome do produto. Teste em seu navegador e verá que cada produto tem um link para a sua respectiva página de detalhes.
O código está funcional porém tem um problema. Tente adicionar um novo produto com o mesmo nome de um produto já existente. Você verá que o produto é adicionado normalmente, porém ao clicar no link para exibir os detalhes do produto, como o nome é o mesmo, o Spring não sabe qual produto exibir e acaba exibindo o primeiro produto com o nome igual ao que foi passado via URL.
Para resolver esse problema precisamos de um atributo no produto que seja único, ou seja, que não se repita. Existe um atributo muito comum que é utilizado para isso que é o id
. O id
é um atributo que serve para identificar um objeto de forma única. Geralmente o id
é um número inteiro que é gerado automaticamente pelo banco de dados, porém como ainda não estamos utilizando banco de dados, vamos criar um id
manualmente. Vamos alterar a classe Product
e adicionar o campo id
.
Para criar um ID único para cada objeto vamos utilizar o UUID. O UUID é um identificador universal único que é gerado de forma aleatória que servirá para representar unicamente o objeto Produto. Para utilizar o UUID precisamos importar a classe java.util.UUID
e criar um atributo do tipo String
chamado id
e no construtor da classe Product
vamos atribuir um valor para esse atributo. Além disso precisamos criar como de costume os métodos getters
e setters
para o atributo id
.
UUID é um identificador universalmente exclusivo utilizado para identificação de qualquer coisa no mundo da computação. O UUID é um número de 128 bits representado por 32 dígitos hexadecimais, exibidos em cinco grupos separados por hifens, na forma textual 8-4-4-4-12 sendo um total de 36 caracteres (32 caracteres alfanuméricos e 4 hifens). Uma das vantagens do UUID é que ele não é um número sequencial, ou seja, não é possível prever qual será o próximo número gerado. Isso é muito importante para evitar que alguém consiga adivinhar o ID de um objeto e acesse informações que não deveria.
Agora precisamos alterar o método show
da classe ProductController
para que ele receba o ID do produto via URL e não mais o nome. Além disso precisamos alterar o nosso método de busca do produto findProductsByName
para que ele possa procurar o produto pelo ID e não mais pelo nome.
A última alteração é a na criação da URL dinâmica na view list
, que também deve enviar o ID ao invés do nome do produto.
Para testar, adicione um novo produto com o mesmo nome de um produto já existente e veja que agora o Spring consegue exibir os detalhes do produto corretamente pois o ID é único para cada produto.