[RESOLVIDO] Lista JSP - Editar "cliente"

8 respostas
T
Pessoal eu tenho um método que edita um "cliente" através do método que busca pelo cpf este cliente .. como ta na classe abaixo ..
package br.com.locadora.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.locadora.bean.Cliente;
import br.com.locadora.dao.ClienteDAO;

public class EditarClienteServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String cpf = request.getParameter("cpf");
		System.out.println(cpf);
		ClienteDAO clienteDAO = new ClienteDAO();
		Cliente cliente = clienteDAO.buscarPorCpf(cpf).get(0);
		
		if (clienteDAO.editar(cliente)) {
			RequestDispatcher requestDispatcher = request.getRequestDispatcher("/ListarClienteServlet");
			requestDispatcher.forward(request, response);
		} else {
			response.sendRedirect("cadastroFalhou.jsp");
		}

	}

}
Dai o que quero saber é como passar esse cpf quando o meu arquivo jsp completa a tabela com uma lista de clientes. como ta no código abaixo...
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!--<%@ page import="java.util.*, br.com.locadora.bean.Cliente"%>-->
<html>
<head>
<title>Lista de Clientes</title>
</head>
<body>
<%@ include file="cabecalho.jsp"%>
	<c:if test="${clientes != null}">
		<TABLE border='1'>
			<tr>
				<th>Nome</th>
				<th>CPF</th>
				<!-- <th>Telefone</th>-->
				<th>Email</th>
				<!-- <th>Data de Nascimento</th>-->
				<!-- <th>Endereço</th>-->
			</tr>
		<c:forEach var="cliente" items="${clientes}" >
			<tr>
				<td><c:out value="${cliente.nome}" /></td>
				<td><c:out value="${cliente.cpf}" /></td>
				<!-- <td><c:out value="${cliente.telefone}" /></td>-->
				<td>
				<c:if test="${not empty cliente.email}">
					<a href="mailto:${cliente.email}">${cliente.email}</a>
					</c:if>
					<!--<c:out value="${cliente.email}" />--></td>
				<!-- <td><c:out value="${cliente.dataNascimento}" /></td>-->
				<!-- <td><c:out value="${cliente.endereco}" /></td>-->
				<!-- <input type="submit" name="cpf" value="EditarClienteServlet" />-->
				<!-- ><input  type="text" name="cpf" value="${cliente.cpf}">-->
				<td><a href="EditarClienteServlet"><input type="hidden" name="cpf" value="${cliente.cpf}" />Editar</a></td>
			</tr>
		</c:forEach>
		</TABLE>
	</c:if>
<%@ include file="rodape.jsp"%>
</body>
</html>
dai eu quero que a cada cliente ele passe o "cpf" para poder a classe de editar consiga pegar o cpf. Tem como fazer isso? Valeu!!

8 Respostas

V

Bom…vamos lá…

Que tal setar a lista de clientes no request ?

request.setParameter("clientes", cliente)
requestDispatcher.forward(request, response);
T

acho que não entendi o que vc está sugerindo.

V

Thiago,

Por partes…acho que voce está se atrapalhando com coisas bem básicas…Recomendo fortemente voce olhar alguns tutorias e apostilas (sugiro as do GUJ e da Caelum), porque sinto que voce ta se atrapalhando com questões que deveriam estar mais claras em sua cabeça.

Agora com relação a sua dúvida…

Pra voce recuperar algum atributo no seu jsp, voce tem que setar o mesmo no server em algum momento (em algum escopo) e depois resgatá-lo.

Vamos ao seu código:

RequestDispatcher requestDispatcher = request.getRequestDispatcher("/ListarClienteServlet");
requestDispatcher.forward(request, response);

Quando voce fez isso, voce “disse” pro Container:

"Conteiner, voce vai pegar todo o conteúdo que ta no meu request, e irá dar um forward pra o “ListarClienteServlet” () ao meu ver, sem olhar o código desse carinha acho que está equivocado pois, acho que voce teria que redirecionar pro jsp de visualização.

Até ai, tudo bem mas olhando o jsp:

<c:if test="${clientes != null}">

e em:

<c:forEach var="cliente" items="${clientes}" >

Nesse jsp, ele vai procurar um objeto no request chamado “clientes”, que voce precisa setar no servlet, por isso…falei pra voce adicionar no request o “cliente”, ficando assim:

request.setParameter("clientes", cliente);
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/ListarClienteServlet");
requestDispatcher.forward(request, response);

Fui claro … ?

Abs

T

Cara, eu to estudando exatamente jsp pela apostila da caelum. Dei uma olhada até o capítulo que antecede Struts 2 e to implementando um código de locadora para exercitar.

Agr, voltando ao código, quando eu chamo o ListClienteServlet ao invés do listarClientes.jsp é exatamente para o que vc sugeriu no código anterior.
O código do ListarClienteServlet é:

public class ListarClienteServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<Cliente> clientes = (List) request.getAttribute("clientes");
		
		if(clientes == null){
			ClienteDAO dao = new ClienteDAO();
			clientes = dao.listar();
		}
		
		request.setAttribute("clientes", clientes);
		
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/listarClientes.jsp");
		requestDispatcher.forward(request, response);
	}

}

No entando, o problema está um pouco antes disso. Já que quando na classe EditarClienteServlet, citada no primeiro post, eu tenho

...
String cpf = request.getParameter("cpf");  //logo em seguida coloco para imprimir o valor de cpf e ele imprime "null";
System.out.println(cpf);
...

Talvez o código depois venha a apresentar algum erro. Mas o problema atual é que não estou conseguindo passar o cpf pelo link EDITAR na hora em que estão sendo listados os clientes. Daí ele imprime o cpf nulo quando faço o request.getParameter(“cpf”).
Entendeu?

V

Thiago,

Fico feliz que voce esteja estudando…é que tem muita gente que chega aqui e quer a solução sem antes ao menos tentar a resolver…meus parabéns…

Com relação ao seu problemaa:

Quando voce fez isso:

String cpf = request.getParameter("cpf");

Voce falou pro seu container : “Container, me manda o parâmetro cpf que está no request”.

Porém se voce fez a alteração que eu sugeri, voce setou um cliente no request e não o parâmetro.

Tenta o seguinte:

1 - resgatar o atributo…

Cliente cliente  = (Cliente)request.getParameter("clientes");
String cpf = cliente.getCpf();
T

Cara, consegui resolver o problema de passar o atributo de um jeito que não sei se eh o mais apropriado …
passei o cpf pelo GET. da seguinte forma. no jsp que lista, coloquei:

<td><a href="EditarClienteServlet?cpf=${cliente.cpf}">Editar</a></td>

dai lá na classe EditarClienteServlet ele reconhece o cpf.
Vou ter que ajeitar o código, pois já constatei que ele não está editando nada. tá sem utilidade. mas isso é o próximo passo.
Essa solução é suficiente?
Valeu pela atenção.

T
Agora sim, acho que resolvi do melhor jeito. Calma, não to tentando desde lá fazer isso..mas voltei ao assunto hhehe.! Pra deixar claro como ficou vou postar aqui Primeiro tem a lista-cliente.jsp que trás a moçada toda. Daí, do lado de cada cliente tem o botao editar que vai passar o id.
<jsp:useBean id="clienteDAO" class="br.com.locadora.model.dao.ClienteDAO" />
<table>
	<tr>
		<td>ID</td>
		<td>Nome</td>
		<td>CPF</td>
		<td>Telefone</td>
		<td>Email</td>
		<td>Data Nascimento</td>
		<td>Endereço</td>
	</tr>
	<c:forEach var="cliente" items="${clienteDAO.lista}" varStatus="id">
	<tr bgcolor="#${id.count % 2 == 0 ? 'aaee88' : 'ggee99' }">
		<td>${cliente.id}</td>
		<td>${cliente.nome}</td>
		<td>${cliente.cpf}</td>
		<td>${cliente.telefone}</td>
		<td><c:choose>
			<c:when test="${not empty cliente.email}">
				<a href="mailto:${cliente.email}">${cliente.email}</a> 
			</c:when>
			<c:otherwise>
				Email não cadastrado.
			</c:otherwise>
		</c:choose></td>
		<td>
			<fmt:formatDate value="${cliente.dataNascimento.time}" pattern="dd/MM/yyyy" />
		</td>
		<td>${cliente.endereco}</td>
		<td>
			<form action="mvc" method="POST">
				<input type="hidden" name="id" value="${cliente.id}" />
				<input type="hidden" name="logica" value="RemoveClienteLogic" />
				<input type="submit" value="Excluir" />
			</form>
		</td>
		<td>
			<form action="mvc" method="POST">
				<input type="hidden" name="id" value="${cliente.id}" />
				<input type="hidden" name="logica" value="EditandoClienteLogic" />
				<input type="submit" value="Editar" />
			</form>
		</td>
	</tr>
	</c:forEach>
</table>
</body>
Quando aperta o botao editar, devido ao modelo mvc que to usando, ele vai chamar a servlet EditandoClienteLogic. Esta possui o método abaixo.
public void executa(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		Cliente cliente = new Cliente();
		ClienteDAO clienteDAO = new ClienteDAO();
		
		Integer id= Integer.valueOf(request.getParameter("id"));

		cliente = clienteDAO.getListaPorId(id);
		
		request.setAttribute("cliente", cliente);
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/edita-cliente.jsp");
		requestDispatcher.forward(request, response);
		
	}
no meio do código, ele chama o clientedao que faz a busca por id, como abaixo
public Cliente getListaPorId(int id){
		try {
			Cliente cliente = new Cliente();
			String sql = "SELECT * FROM cliente WHERE cliente.id=?";
			PreparedStatement stmt = connection.prepareStatement(sql);
			System.out.println(id);
			stmt.setInt(1, id);
			ResultSet resultSet = stmt.executeQuery();
			while(resultSet.next()){
				/*int n = resultSet.getInt("id");  
				String idString = new  Integer(n).toString();
				long idLong = Long.parseLong(idString); 
				cliente.setId(idLong);*/
				cliente.setId(resultSet.getLong("id"));
				cliente.setNome(resultSet.getString("nome"));
				cliente.setCpf(resultSet.getString("cpf"));
				cliente.setTelefone(resultSet.getString("telefone"));
				cliente.setEmail(resultSet.getString("email"));
			
				Calendar data = Calendar.getInstance();
				data.setTime(resultSet.getDate("dataNascimento"));
				cliente.setDataNascimento(data);
			
				cliente.setEndereco(resultSet.getString("endereco"));
			
			}
			resultSet.close();
			stmt.close();
			return cliente;
		} catch (SQLException e){
			throw new RuntimeException(e);
		}
	}
terminado isso, a classe editando cliente chama o jsp edita-cliente que trás os campos já preenchidos
<body>
	<form action="mvc" method="POST">
	<!-- da um jeit de aparecer o cliente.id no campo do id e que seja editavel -->
	
		Id:<input type="text" name="id" value="${cliente.id}" readonly="readonly"/> <br />
		Nome:<input type="text" name="nome" value="${cliente.nome}" /><br />
		CPF:<input type="text" name="cpf" value="${cliente.cpf}"/><br />
		Telefone:<input type="text" name="telefone" value="${cliente.telefone}"/><br />
		Email:<input type="text" name="email" value="${cliente.email}"/><br />
		Data de Nascimento:<input type="text" name="dataNascimento" value="${cliente.dataNascimento}"/><br />
		Endereço:<input type="text" name="endereco" value="${cliente.endereco}"/><br />
		<input type="hidden" name="logica" value="EditaClienteLogic" />
		<input type="submit" value="Enviar" />
	
	</form>
</body>
Ai pronto, o resto é tranquilo! Valeu pela atenção vinicius! Não sei se eh o ideal, mas escrevi tudo aqui como forma de consulta dos outros e minha tb. :) falOo
P

Muito bom o exemplo! Toh tomando um pau para mandar o código do cliente pra Action que tu naum faz ideia!!

Criado 2 de março de 2010
Ultima resposta 8 de mai. de 2013
Respostas 8
Participantes 3