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
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
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>
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.