Solucionado (ver solução)
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.