Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação Servidor Sistemas web Uso de Sessão (Session) Sessão • Conceito de estado para objeto – o estado de um objeto compreende os dados que ele detém num dado momento. • Um objeto guarda informações. Dizemos que um dado objeto guarda seu estado. • Num aplicação Web um dado objeto pode não guardar estado, ou seja recebe informações em seus atributos repassa e em seguida é destruído. Sessão • Um exemplo de objeto servidor sem estado pode ser um que retorne informações sobre a respeito de um livro. • Durante a interação – requisição do usuário até a apresentação dos dados – o objeto mantém o estado dos dados do livro consultado.dos dados do livro consultado. • Uma vez apresentada as informações, o objeto que está apenas no nível da requisição perde seu estado, ou seja, não é mais válido. Sessão • Uma consulta de outro livro, transcorre o mesmo processamento. O objeto recebe um estado por algum tempo de depois este estado é destruído. • Imagine agora que precise guardar todos os ISBNs (códigos dos livros) que o usuário consultou e esta informação fique permanente enquanto o usuário ficarinformação fique permanente enquanto o usuário ficar consultando outros livros. • Com isso essa lista precisa persistir entre as várias requisições do usuário. Sessão • O servidor por si só não guarda dados persistentes do usuário ou seja da sessão do usuário. • O protocolo HTTP por sua vez também é um protocolo que não guarda estado. • O controle do estado de um ou mais objetos precisa ser• O controle do estado de um ou mais objetos precisa ser controlado dentro do contexto de um objeto session, na aplicação Web. Sessão • Os itens no carrinho de compra de um site de compras na Internet, precisa estar no estado da sessão do usuário. • O estado da sessão de um usuário significa que está separado do estado da sessão de outro usuário. • Para armazenar o estado da sessão você pode ter três escolhas. Sessão • O estado da sessão pode ser armazenado no cliente, usando cookies que são registros de informações que ficam gravados na estação do usuário, ou em campo HTML do tipo hide (escondido). • No servidor há mecanismo para armazenar o estado da sessão – uso do objeto da classe HttpSession.sessão – uso do objeto da classe HttpSession. • No banco de dados – os dados da sessão do usuário são guardados no banco de dados enquanto durar a sessão do usuário. Sessão • A primeira opção – armazenar no cliente tem impacto na largura de banda (conexão) do cliente, pois os dados são transferidos pela rede a cada solicitação. • No banco de dados exige um trabalho maior para armazenar e recuperar os dados da sessão sempre que os dados da sessão precisem ser apresentados aoos dados da sessão precisem ser apresentados ao usuário. • Em caso de manuseio de vários dados a guarda da sessão no servidor pode dar um desempenho melhor. Sessão • Nos slides seguintes teremos a apresentação código que lida com objeto de sessão dentro da lógica de um carrinho de compras. • O usuário solicita uma lista de produtos. • Dessa lista, seleciona alguns produtos. Os produtos• Dessa lista, seleciona alguns produtos. Os produtos selecionados precisam ser guardados dentro da estrutura de uma sessão, pois se forem guardados apenas no contexto de um request, a lista selecionada pelo cliente não será acessível. ProdutoDAO • Na classe DAO foi utilizado um objeto da classe HashMap que permite estruturar os dados dos objetos da classe produto obtidos do banco de dados numa estrutura de matriz. • Um HashMap é uma matriz de objetos, contendo uma coluna tendo um objeto que é índice para os dados do objeto armazenado, na outra colunaobjeto armazenado, na outra coluna produto codigo=45 descricao=“placa de video” valorunit=259.80 Integer 45 produto codigo=67 Descricao=”mouse ps2” valorunit=18.50 Integer 67 ProdutoDAO public HashMap<Integer, ProdutoBean> consultarProdutosDAO () throws Exception { Connection conexao = FabricaConexao.abreConexaoMySQL(); ProdutoBean produto = null; HashMap<Integer, ProdutoBean> matrizProdutos = new HashMap<Integer, ProdutoBean>(); try { String sql = "SELECT * FROM TBProdutos"; Statement comandoSQL = conexao.createStatement(); ResultSet resultado = comandoSQL.executeQuery(sql);ResultSet resultado = comandoSQL.executeQuery(sql); while (resultado.next()) { int cod = resultado.getInt("codigo"); String desc = resultado.getString("descricao"); float vlrunit = resultado.getFloat("valorunit"); produto = new ProdutoBean(cod, desc, vlrunit); matrizProdutos.put(new Integer(cod), produto); } if (matrizProdutos.isEmpty()) throw new Exception("Não há produto cadastrado"); ProdutoServlet • A classe ProdutoServlet ao receber uma requisição para a lista de produtos, irá solicitar à classe DAO uma matriz de objetos do tipo ProdutoBean, agora dentro da estrutura de HashMap. • A matriz de objetos precisa ser guardada e acessível em outro objeto que visível por todas as Servlets e JSP nas requisições do usuário.requisições do usuário. • A matriz de objetos não é armazenada dentro da estrutura do objeto Request, pois na requisição de “Adicionar ao Carrinho”, a matriz não será mais visivel. ProdutoServlet private void listarProdutos(HttpServletRequest request,HttpServletResponse response) throws Exception { try { ProdutoDAO dao = new ProdutoDAO(); HashMap<Integer, ProdutoBean> matrizProdutos = dao.consultarProdutosDAO(); getServletContext().setAttribute("matrizProdutos", matrizProdutos); RequestDispatcher rd = request.getRequestDispatcher("listaProduto.jsp"); rd.forward(request, response); } catch (Exception objEx) { throw objEx; } } listaProduto.jsp • A página listaProduto.jsp envia a ação AdicionarCarrinho à ServletProduto. <input type=submit name="btn_acao" value="AdicionarCarrinho"> ProdutoServlet if (acao.equals("AdicionarCarrinho")){ //recupera os codigos dos produtos selecionados String[] codigosProds = request.getParameterValues("chkCodProdutos"); System.out.println(codigosProds[0]); //recupera os produtos selecionados e adiciona os selecionados nas sessao HashMap<Integer, ProdutoBean> mapProdutos = (HashMap<Integer, ProdutoBean>) getServletContext().getAttribute("matrizProdutos"); List<ProdutoBean> prodsSelecionados = new ArrayList<ProdutoBean>();List<ProdutoBean> prodsSelecionados = new ArrayList<ProdutoBean>(); for (String codigo : codigosProds) { ProdutoBean produto = mapProdutos.get(Integer.parseInt(codigo)); prodsSelecionados.add(produto); } HttpSession sessao = request.getSession(); sessao.setAttribute("produtosSelecionados", prodsSelecionados); RequestDispatcher rd = request.getRequestDispatcher("confirmaCompra.jsp"); rd.forward(request, response) confirmaCompra.jsp • A página listaProduto.jsp lista apenas os produtos selecionados pelo cliente e oferece a ação de fechar a compra. • O post será direcionado à ClienteServlet, que por sua vez irá solicitar o login. <form name="frmListaProdutos" method="post" action="clientes" > <input type=submit name="btn_acao" value="FecharCompra"><input type=submit name="btn_acao" value="FecharCompra"> login.jsp • Para fechar a compra, é apresentada a tela de login na qual o usuário irá se identificar para fechar o procedimento de compra.
Compartilhar