Entendendo os Escopos dos Objetos – Parte 02

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

You can leave a response, or trackback from your own site.

Leave a Reply

Powered by WordPress | Find Low APR Credit Cards at BestInCreditCards.com | Thanks to iApplyForCreditCards.com, RPG Soundtracks and Transfer of Equity
SEO Powered by Platinum SEO from Techblissonline