Toda vez que um sistema web é acessado pelo browser, o conteiner web cria uma sessão para cada cliente, e nas requisições trocadas entre o browser e o servidor existe um cookie/parâmetro no cabeçalho da requisição HTTP chamado jsessionid que identifica aquele cliente, desta forma o servidor pode reservar uma área para este cliente por um certo tempo. Um exemplo de utilização é manter o usuário logado no sistema, onde ele vai estar navegando entre todas páginas sem problemas. Uma forma de invalidar a sessão pelo cliente é limpar o cache do browser, assim o cookie que possuía o identificador da sessão não existe mais e o servidor irá criar uma nova sessão assim que o cliente enviar uma nova requisição.
Vamos começar a implementar nosso carrinho de compras.
Classe Produto
package vo;
public class Produto {
private Integer codigo;
private String nome;
private Double vlPreco;
// ocultei get/set.
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result +
((codigo == null) ? 0 : codigo.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Produto other = (Produto) obj;
if (codigo == null) {
if (other.codigo != null)
return false;
} else if (!codigo.equals(other.codigo))
return false;
return true;
}
}
Na classe CarrinhoDeCompras, criei uma Collection de objetos Produto, que armazenará os produtos selecionados pelo o usuário. Estou inicializando-a no construtor da classe, e também perceba que só existe o método de acesso getArrProdutos(). Isso vai garantir que a coleção seja inicializada apenas na criação do objeto.
package vo;
import java.util.ArrayList;
import java.util.Collection;
public class CarrinhoDeCompras {
private Collection<Produto> arrProdutos;
public CarrinhoDeCompras() {
this.arrProdutos = new ArrayList<Produto>();
}
public final Collection<Produto> getArrProdutos() {
return arrProdutos;
}
}
Criei a classe LojaBO para simular estoque de produtos. A lógica desta classe é bem simples: ela possui um java.util.List de objetos Produto para representar os produtos vendidos pela nossa loja e dois voltados aos métodos: um é buscar (código), que busca o produto na coleção pelo código, e o outro é um método de acesso ao nosso List.
package bo;
import java.util.ArrayList;
import java.util.List;
import vo.Produto;
public class LojaBO {
private List<Produto> arrProdutosDisponiveis;
public LojaBO() {
arrProdutosDisponiveis = new ArrayList<Produto>();
Produto produto = null;
for (int i = 0; i < 5; i++) {
produto = new Produto();
produto.setCodigo(i);
produto.setNome("Produto " + i);
produto.setVlPreco(52.8);
arrProdutosDisponiveis.add(produto);
}
}
public Produto buscar(Integer codigo) {
Produto produto = new Produto();
produto.setCodigo(codigo);
return arrProdutosDisponiveis.get(arrProdutosDisponiveis.indexOf(produto));
}
public final List<Produto> getArrProdutosDisponiveis() {
return arrProdutosDisponiveis;
}
}
Já criamos os objetos para representar o carrinho de compras, os produtos disponíveis. Agora criei a página que exibirá a listagem dos produtos para o usuário poder escolher qual item vai adicionar no carrinho (listarProdutos.jsp).
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="bo.LojaBO"%>
<%@page import="java.util.Collection"%>
<%@page import="java.util.List"%>
<%@page import="vo.Produto"%><html>
<head>
<title>Produtos Disponiveis</title>
<style>
<!--
body {
text-align: left;
}
-->
</style>
</head>
<body>
<h2>Produtos Disponiveis:</h2>
<%
/* armazena lista de produtos na sessão do usuario. */
LojaBO lojaBO = new LojaBO();
List<Produto> arrProduto = lojaBO.getArrProdutosDisponiveis();
%> <table>
<thead><tr>
<th>Codigo</th>
<th>Nome</th>
<th>Preço</th>
<th></th>
</tr></thead>
<% for(Integer i = 0; i < arrProduto.size(); i++){
Produto produto = arrProduto.get(i);%>
<tr>
<td><%= produto.getCodigo() %></td>
<td style="width: 120px"><%= produto.getNome() %></td>
<td><%= produto.getVlPreco() %></td>
<td><a href="controlCarrinhoDeCompras.jsp?a=adicionar&codigo=
<%= produto.getCodigo() %>">Adicionar</a></td>
</tr>
<% } %>
</table>
<p><a href="controlCarrinhoDeCompras.jsp">Meu Carrinho</a></p>
</body>
</html>
A página abaixo (controlCarrinhoDeCompras.jsp) possui a lógica das ações do carrinho de compras. Tem as seguintes funcionalidades:
- – Adicionar o produto na listagem do carrinho de compras.
- – Excluir todos os itens do carrinho de compras.
<%@page import="vo.Produto"%>
<%@page import="bo.LojaBO"%>
<%@page import="vo.CarrinhoDeCompras"%><%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// caso não exista um objeto CarrinhoDeCompras na session, ele cria.
if(session.getAttribute("carrinhoDeCompras") == null){
session.setAttribute("carrinhoDeCompras", new CarrinhoDeCompras());
}
/* pega referência ao Objeto CarrinhoDeCompras que está armazenado na session. Necessário fazer um cast,
pois o metodo "getAttribute" retorna um Object. */
CarrinhoDeCompras carrinhoDeCompras = (CarrinhoDeCompras) session.getAttribute("carrinhoDeCompras");
/* parametro que indica qual acao deve ser executada. */
String acao = request.getParameter("a");
/* indica qual pagina será invocada apos execucao abaixo. Por padrao,
deixei a listagem de produtos do carrinho de compras.*/
String path = "listarProdutosDoCarrinho.jsp";
if(acao != null && !acao.equals("")){
if(acao.equals("adicionar")){
Integer codigo = Integer.parseInt(request.getParameter("codigo"));
LojaBO lojaBO = new LojaBO();
Produto produto = lojaBO.buscar(codigo);
carrinhoDeCompras.getArrProdutos().add(produto);
}
if(acao.equals("limpar")){
session.setAttribute("carrinhoDeCompras", new CarrinhoDeCompras());
}
}
RequestDispatcher requestDispacher = request.getRequestDispatcher(path);
requestDispacher.forward(request, response);
%>
Após a escolha do produtos, o usuário pode visualizar os produtos selecionados, através da página abaixo (listarProdutosDoCarrinho.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="bo.LojaBO"%>
<%@page import="java.util.Collection"%>
<%@page import="vo.Produto"%>
<%@page import="vo.CarrinhoDeCompras"%><html>
<head>
<title>Produtos Adicionados no Carrinho de Compras</title>
<style>
<!--
body {
text-align: left;
}
-->
</style>
</head>
<body>
<%
/* É adicionado um objeto CarrinhoDeCompras na sessão, caso ainda não exista.*/
if(session.getAttribute("carrinhoDeCompras") == null){
session.setAttribute("carrinhoDeCompras", new CarrinhoDeCompras());
}
// referência do objeto CarrinhoDeCompras que esta na sessão do usuario.
CarrinhoDeCompras carrinhoDeCompras = (CarrinhoDeCompras) session.getAttribute("carrinhoDeCompras");
Collection<Produto> arrProduto = carrinhoDeCompras.getArrProdutos();
if(!arrProduto.isEmpty()){%>
<h2>Produtos Adicionados:</h2>
<table>
<thead><tr>
<th>Codigo</th>
<th>Nome</th>
<th>Preço</th>
</tr></thead>
<%for(Produto produto : arrProduto){ %>
<tr>
<td><%= produto.getCodigo() %></td>
<td style="width: 120px"><%= produto.getNome() %></td>
<td><%= produto.getVlPreco() %></td>
</tr>
<% } %>
</table>
<p><a href="listarProdutos.jsp">Comprar Mais</a></p>
<p><a href="controlCarrinhoDeCompras.jsp?a=limpar">Limpar Carrinho</a></p>
<% } else { %>
<p>Seu carrinho de compras está vazio</p>
<p><a href="listarProdutos.jsp">Voltar Listagem de Produtos</a></p>
<% } %>
</body>
</html>
Meu simples carrinho de compras está pronto, funcionando sem problemas e utilizando o que a seção tem a oferecer. Agora fica com você a implementar uma aplicação mais complexa.
O projeto do Eclipse com os fontes está disponível para download. Espero que tenham gostado e a informação que escrevi seja útil. Até a próxima.
Referências
http://java.sun.com/javaee/5/docs/api/
Fonte: Imasters
RSS Feed
Twitter
Posted in
Tags: