Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida- Carinho de compras

Olá , logo após escolhermos o livro que queremos comprar, o livro é adicionado no carrinho(quantidade=1) e somos redirecionados para a url "/cart" onde podemos ver os livros já presentes no carrinho com seus respectivos preços e quantidades:

<table id="cart-table">
            <colgroup>
                <col class="item-col">
                <col class="item-price-col">
                <col class="item-quantity-col">
                <col class="line-price-col">
                <col class="delete-col">
            </colgroup>
            <thead>
                <tr>
                    <th class="cart-img-col"></th>
                    <th width="65%">Item</th>
                    <th width="10%">Preço</th>
                    <th width="10%">Quantidade</th>
                    <th width="10%">Total</th>
                    <th width="5%"></th>
                </tr>
            </thead>
            <tbody>
                <c:forEach items="${shoppingCart.list}" var="item">
                    <tr>
                        <td class="cart-img-col"><img src=""
                            alt="${item.product.title}" /></td>
                        <td class="item-title">${item.product.title}-
                            ${item.bookType}</td>
                        <td class="numeric-cell">${item.price}</td>
                        <td class="quantity-input-cell"><input type="number" min="0"
                            readonly="readonly" value="${shoppingCart.getQuantity(item)}"></td>
                        <td class="numeric-cell">${shoppingCart.getTotal(item)}</td>
                        <td class="remove-item"><form:form method="post"
                                action="${spring:mvcUrl('SCC#remove').arg(0,item.product.id).arg(1,item.bookType).build()}">
                                <input type="image"
                                    src="//cdn.shopify.com/s/files/1/0155/7645/t/177/assets/excluir.png?58522"
                                    alt="Excluir" title="Excluir" />
                            </form:form></td>
                    </tr>
                </c:forEach>

            </tbody>
            <tfoot>
                <tr>
                    <td colspan="2"><form:form
                            action="${spring:mvcUrl('PC#checkout').build()}" method="post">
                            <input type="submit" class="checkout" name="checkout"
                                value="Finalizar compra " id="checkout" />
                        </form:form></td>
                    <td class="numeric-cell">${shoppingCart.total}</td>
                    <td></td>
                </tr>
            </tfoot>
        </table>

quando estamos utilizando o escopo de sessão com o spring temos o mesmo conceito de bidirecional data binding existente no JSF?

Vamos supor que eu escolha comprar o livro "Spring MVC: domine o principal framework web Java" e escolha impresso, só que eu não desejo comprar apenas 1 exemplar deste livro, eu quero comprar 10 exemplares. O comportamento natural do usuário é ir no input refente à quantidade e alterar de 1 para 10 a quantidade desse item no carrinho e não ficar voltando para a listagem e ficar incluindo o mesmo livro 10 vezes .

A primeira pergunta é: como fazer para que a quantidade digitada no input seja automaticamente refletida no carrinho para que quando eu finalizar a compra eu já tenha o carrinho com os produtos e as quantidades corretas?

A segunda pergunta,que é relacionada com a primeira. Se nesta mesma tela de finalização de compras eu tivesse outros inputs referentes por exemplo à forma de pagamento ou entrega e que estes dados devessem estar no carrinho, como eu poderia ter essa informações disponíveis na finalização da compra?

@RequestMapping(value = "checkout", method = RequestMethod.POST)
    public Callable<ModelAndView> checkout(@AuthenticationPrincipal SystemUser user) {
        return () -> {
            BigDecimal total = shoppingCart.getTotal();
            String uriToPay = "http://book-payment.herokuapp.com/payment";
            try {
                restTemplate.postForObject(uriToPay,
                        new PaymentData(total), String.class);
                sendNewPurchaseMail(user);
                return new ModelAndView("redirect:/payment/success");
            } catch (HttpClientErrorException exception) {
                return new ModelAndView("redirect:/payment/error");
            }            

        };
    }
2 respostas
solução!

Olá Ricardo, respondendo suas dúvidas, da segunda para a primeira:

A segunda pergunta,que é relacionada com a primeira. Se nesta mesma tela de finalização de compras eu tivesse outros inputs referentes por exemplo à forma de pagamento ou entrega e que estes dados devessem estar no carrinho, como eu poderia ter essa informações disponíveis na finalização da compra?

Você poderia criar uma classe para representar esses dados que você quer passar junto no carrinho, e colocar tudo dentro do mesmo <form/>. Os dados que você quiser receber, basta colocar nos inputs como já fizemos.

A primeira pergunta é: como fazer para que a quantidade digitada no input seja automaticamente refletida no carrinho para que quando eu finalizar a compra eu já tenha o carrinho com os produtos e as quantidades corretas?

Você tem razão. A forma normal é ele ir naquela caixinha e digitar a quantidade, ou já na tela de detalhe do livro, ter um campo para a quantidade.

Como nosso curso tinha o foco apenas em ensinar os conceitos e tecnologias do Spring, não focamos em implementar todas as funcionalidades. Porém para a quantidade, a mesma entidade que citei na resposta da sua pergunta 2, pode ser aplicada aqui. Essa entidade pode ter um atributo quantidade para dizer quantos livros o usuário realmente quer.

Outra solução que não ensinamos no curso, mas não é complicado de fazer, é fazer um AJAX que atualize na sessão do carrinho a quantidade. Não falamos disso no curso, pois o trabalho é mais de JavaScript do que Spring em si.

Sobre sua dúvida se Spring se comportava como JSF, a resposta é não. Spring é action based, o que significa que você precisa passar os dados para uma URL/método que receberá os dados, fazendo o biding no momento que o Spring recebe os dados, diferente do JSF, que controla cada componente na tela, e o valor do componente já é ligado a um atributo no seu ManagedBean.

Se ainda tiver alguma dúvida, por favor, pode perguntar. Estou a disposição.

Abraço

Obrigado!