Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
13
respostas

Como armazenar os valores de um atributo do servlet em um .jsp?

Criei uma variável "valor2" que vem do servlet e preciso pegar esse valor e adicionar em uma variável total. Tentei assim:

<%String total =  <%= session.getAttribute("valor2") %>%>

Mas não funciona

13 respostas

Bom dia Thamirys,

Pelo que entendi, você está passando um valor vindo da Servlet para uma página JSP, e dentro do JSP você quer pegar o valor e jogar em uma varável?

Se for isso mesmo, por questões de padrão e desacoplamento, é desencorajado que seja feito algum tipo de processamento com a informação na camada de visualização (os JSP no caso). Esse valor não poderia ser processado da forma que precisa na Servlet e depois enviado para o JSP pronto, apenas para exibição?

Abraço.

Sim, No meu servlet está assim:

if (request.getParameter("comprar") != null) {
            request.getSession().setAttribute("titulo", request.getParameter("titulo"));
            request.getSession().setAttribute("valor", request.getParameter("valor"));
            pagina = "carrinho.jsp";
        }

Toda vez que um produto é adicionado o total deveria mudar, mas não consegui somar os valores, mesmo fazendo o parse para double

Então sugiro que esta soma seja feita na Servlet, e depois seja devolvido para o JSP o valor pronto.

Se ainda não está passando esse valor para a Servlet, comece a passar, faça o cálculo, e mande de volta na sessão para pegar na JSP.

Se precisar de ajuda manda ai, abraço.

Tentei fazer direto no servlet, mas ele retorna null. Fiz assim:

String total = "";

             total += Integer.parseInt(request.getParameter("valor"));
            request.setAttribute("total", total);

Se está retornando null, isso quer dizer que o valor que já está vindo do request está nulo.

Não deveria haver um valor na página?

Compartilha o código completo da JSP onde tem este valor, e da Servlet.

Mas tente usar o debug do Eclipse também, ele ajuda bastante a identificar e solucionar erros do lado do servidor.

Servlet:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String pagina = "";
        String total = "";

        if (request.getParameter("comprar") != null) {
            request.getSession().setAttribute("titulo", request.getParameter("titulo"));
            request.getSession().setAttribute("valor", request.getParameter("valor"));
             total = total + Integer.parseInt(request.getParameter("valor"));
            request.setAttribute("total", total);
            pagina = "carrinho.jsp";
        }
        if (request.getParameter("produto1") != null) {
            request.getSession().setAttribute("titulo1", request.getParameter("titulo1"));
            request.getSession().setAttribute("valor1", request.getParameter("valor1"));
            total = total + Integer.parseInt(request.getParameter("valor1"));
            request.setAttribute("total", total);
            pagina = "carrinho.jsp";
        }
        if (request.getParameter("produto2") != null) {
            request.getSession().setAttribute("titulo2", request.getParameter("titulo2"));
            request.getSession().setAttribute("valor2", request.getParameter("valor2"));
            total = total + Integer.parseInt(request.getParameter("valor2"));
            request.setAttribute("total", total);
            pagina = "carrinho.jsp";
        }

//        
        String a = request.getParameter("valor1");
        String b = request.getParameter("valor2");

        String resposta = "";
        if (a != null && b != null) {
            resposta += Integer.parseInt(a) + Integer.parseInt(b);
            request.setAttribute("resposta", resposta);
            pagina = "carrinho.jsp";

        }

JSP:

 <title>JSP Page</title>
    </head>
    <body>
        <h1>Carrinho de compras</h1>

        <% 
        if( session.getAttribute("titulo")!= null){%>
        Título: <%= session.getAttribute("titulo") %> <br>
        Valor: <%= session.getAttribute("valor") %> <br>
        <%}%>
        <%if( session.getAttribute("titulo1")!= null){%>
         <%= session.getAttribute("titulo1") %> <br>
         <%= session.getAttribute("valor1") %> <br>
        <%}%>
        <%if( session.getAttribute("titulo2")!= null){%>
         <%= session.getAttribute("titulo2") %> <br>
         <%= session.getAttribute("valor2") %> <br>
        <%}%>
        <%= session.getAttribute("resposta") %> <br>

Thamirys,

Enquanto vamos olhando aqui pra tentar identificar, te recomendo dar uma olhada em JSTL, não é recomendado escrever JSP dessa forma usando expressão Java direto dentro dele (o tal do scriptlet).

Scriptlet é algo bem antigo e fora de uso já, ele cria uma grande dificuldade de manutenção no código, e não é recomendado ter código da linguagem do back-end (server) na camada da view.

Em um outro post até lhe dei um início sobre isso, lembra daquele $? O ideal é trabalhar com os dados como atributos do request, cuidado com aquela questão de guardar informação demais na sessão e ela começar a ficar pesada.

Um dúvida, você recebe como a requisição do Container? Essa Servlet tem um método service, um doGet? E eles redirecionam para esse método processRequest que você tem?

Compartilha a classe toda se puder, e a JSP também. Vou colocar em um projeto de teste aqui.

O servlet abaixo recebe valores de uma página produtos.html e envia para um carrinho.jsp

Na página carrinho.jsp posso voltar para produtos.html e escolher um outro produto. Até aqui tudo bem, mas queria mostrar o valor total da soma dos produtos na página jsp.

Mas só aparece o valor do produto atual

servlet:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package sessao;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author fabio
 */
@WebServlet(name = "AdicionaProdutos", urlPatterns = {"/adicionar"})
public class AdicionaProdutos extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String pagina = "";
        double total2 =0;



        if (request.getParameter("comprar") != null) {
            request.getSession().setAttribute("titulo", request.getParameter("titulo"));
            request.getSession().setAttribute("valor", request.getParameter("valor"));

            total2 += Double.parseDouble(request.getParameter("valor"));
            request.setAttribute("total2", total2);

            pagina = "carrinho.jsp";
        }
        if (request.getParameter("produto1") != null) {
            request.getSession().setAttribute("titulo1", request.getParameter("titulo1"));
            request.getSession().setAttribute("valor1", request.getParameter("valor1"));




             total2 += Double.parseDouble(request.getParameter("valor1"));
            request.setAttribute("total2", total2);
            request.getSession().setAttribute("total2", request.getParameter("total2"));

            pagina = "carrinho.jsp";
        }
        if (request.getParameter("produto2") != null) {
            request.getSession().setAttribute("titulo2", request.getParameter("titulo2"));
            request.getSession().setAttribute("valor2", request.getParameter("valor2"));
            total2 += Double.parseDouble(request.getParameter("valor2"));
            request.setAttribute("total2", total2);

            pagina = "carrinho.jsp";
        }

//        





//        if (request.getParameter("etapa3") != null) {
//            String[] valores = request.getParameterValues("areas");
//            String bullets = "<ul>";
//            for (String v : valores) {
//                bullets += "<li>" + v + "</li>";
//            }
//            bullets += "</ul>";
//            request.getSession().setAttribute("areas", bullets);
//            pagina = "respostaFormulario.jsp";
//        }
//        

        RequestDispatcher rd = request.getRequestDispatcher(pagina);
        rd.forward(request, response);

    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

JSP

<%-- 
    Document   : carrinho
    Created on : 20/03/2017, 09:15:48
    Author     : Thamirys
--%>

<%@page import="sessao.Produto"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Carrinho de compras</h1>

        <% 
        if( session.getAttribute("titulo")!= null){%>
        Título: <%= session.getAttribute("titulo") %> <br>
        Valor: <%= session.getAttribute("valor") %> <br>
        <input type="hidden" name="tot" value="<%= session.getAttribute("valor") %> %>" />
        <%}%>
        <%if( session.getAttribute("titulo1")!= null){%>
         <%= session.getAttribute("titulo1") %> <br>
         <%= session.getAttribute("valor1") %> <br>
        <%}%>
        <%if( session.getAttribute("titulo2")!= null){%>
         <%= session.getAttribute("titulo2") %> <br>
         <%= session.getAttribute("valor2") %> <br>
        <%}%>


        <p>Produto ${total2}.</p>

        <a href="http://localhost:8080/Carrinho/produtos.html">Continuar</a>


    </body>
</html>

Mande a produtos.html inteira também. Preciso de tudo necessário para recriar aqui e testar.

Mas o problema já deu para entender melhor, veja bem, nesta linha abaixo, a cada requisição o valor da variável total2 é zerado. Por isso de uma requisição para outra só terá o valor de um único produto, ou até null se tiver mais alguma coisa errada.

double total2 =0;

Para isso dar certo temos que fazer de um jeito que o total2 seja somado dentro dessa Servlet pegando o valor que já estava no request, somar, enviar de novo, ai se a pessoa adicionar mais um produto, passa na Servlet, pega do request novamente aquele valor que tinha sido passado (que conterá o valor do primeiro produto) e soma novamente, colocando de novo no request para mandar para a JSP. Ai sim dará certo, algo nessa linha.

Aguardo os arquivos que faltam para eu simular, mas se quiser ir testando isso que te falei ai também, é uma boa.

Abraço.

produtos.html:

<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <div>LIVRARIA</div>

        <form action="adicionar">
            Titulo: <input type="hidden" name="titulo1" value="Java: como programar" />Mysql <br>
            Valor: <input type="hidden" name="valor1" value="36" />36 <br>
            <input type="submit" value="Próximo" name="produto1" />
        </form>
        <form action="adicionar">
             <input type="hidden" name="titulo2" value="Projeto e analise de algoritmos" /> <br>
             <input type="hidden" name="valor2" value="41" /> <br>
            <input type="submit" value="Adicionar ao carrinho" name="produto2" />
        </form>

    </body>
</html>
solução!

Oi Thamirys,

Para funcionar a questão da soma, basta você mover a declaração da variável de total para ser um atributo da Servlet, isso já fará funcionar como eu acho que você quer.

@WebServlet(name = "AdicionaProdutos", urlPatterns = {"/adicionar"})
public class AdicionaProdutos extends HttpServlet {

    double total2 =0;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String pagina = "";

        if (request.getParameter("comprar") != null) {
            request.getSession().setAttribute("titulo", request.getParameter("titulo"));
    .
    .
    .

A título de desenvolvimento para aprendizado e testes não tem problema, apenas tome cuidado ao tentar usar algo assim em um projeto mais sério, pois ai seria errado, uma vez que esse o valor desse atributo ficaria somando para todo usuário que mandasse esta requisição, mesmo sendo usuários diferentes.

Ai para um cenários desses, teria que implementar de forma mais orientada a objetos.

Espero ter ajudado. Abraço.

Funcionou Emerson, muito obrigada.