[RESOLVIDO] Lista JSP - Editar "cliente"

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 …

[code]
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");
	}

}

}[/code]

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…

[code]
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

Lista de Clientes <%@ include file="cabecalho.jsp"%>
Nome CPF Email
${cliente.email} Editar
<%@ include file="rodape.jsp"%> [/code] 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!!

Bom…vamos lá…

Que tal setar a lista de clientes no request ?

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

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

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

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?

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();

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.

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.

[code]
<jsp:useBean id=“clienteDAO” class=“br.com.locadora.model.dao.ClienteDAO” />

ID Nome CPF Telefone Email Data Nascimento Endereço
${cliente.id} ${cliente.nome} ${cliente.cpf} ${cliente.telefone} ${cliente.email} Email não cadastrado. ${cliente.endereco}
[/code] Quando aperta o botao editar, devido ao modelo mvc que to usando, ele vai chamar a servlet EditandoClienteLogic. Esta possui o método abaixo. [code] 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);
	
}	[/code] no meio do código, ele chama o clientedao que faz a busca por id, como abaixo

[code]
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);
	}
}[/code] 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. :slight_smile:
falOo

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