[RESOLVIDO] JSP Busca por parametro

13 respostas
T

Pessoal, eu tenho um jsp como o abaixo que vai passar o Nome da pessoa como argumento de busca.

<form action="mvc" method="POST">
			Nome:<input type="text" name="nome" />
			<input type="hidden" name="logica" value="BuscaClientePorNomeLogic" />
			<input type="submit" value="Buscar" />
		</form>

Dai, ele chega na Servlet BuscaClientePorNomeLogic, que é a descrita abaixo…

public class BuscaClientePorNomeLogic implements Logica  {
	public void executa(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		List<Cliente> clientes = new ArrayList<Cliente>();
		ClienteDAO clienteDAO = new ClienteDAO();		
		clientes = clienteDAO.getListaPorNome(request.getParameter("nome"));
		for(int i=0; i<clientes.size(); i++){
			
				request.setAttribute("id", clientes.get(i).getId());
				request.setAttribute("nome", clientes.get(i).getNome());
				request.setAttribute("cpf", clientes.get(i).getCpf());
				request.setAttribute("telefone", clientes.get(i).getTelefone());
				request.setAttribute("email", clientes.get(i).getEmail());
				request.setAttribute("dataNascimento", clientes.get(i).getDataNascimento());
				request.setAttribute("endereco", clientes.get(i).getEndereco());
		}
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/lista-clientes-campo.jsp");
		requestDispatcher.forward(request, response);		
	}
}

Essa por sua vez chama o lista-clientes-campo.jsp

<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>
	
	<tr bgcolor="ggee99">
		<td>${id}</td>
		<td>${nome}</td>
		<td>${cpf}</td>
		<td>${telefone}</td>
		<td>${email}</td>
		<td>
			<fmt:formatDate value="${dataNascimento.time}" pattern="dd/MM/yyyy" />
		</td>
		<td>${endereco}</td>	
		<td>
			<form action="mvc" method="POST">
				<input type="hidden" name="id" value="${id}" />
				<input type="hidden" name="logica" value="RemoveClienteLogic" />
				<input type="submit" value="Excluir" />
			</form>
		</td>	
	</tr>

</table>

Acho que o erro fica claro … na hr do for em BuscaClientePorNomeLogic que vou setar os valores para os parametros que vao ser usados na jsp lista-clientes-campo ele vai ficar substituindo levando a jsp mostrar somente o último item da lista.
Deu pra entender o que to querendo fazer? querendo listar os clientes pelo nome que busco.

Alguem pode ajudar?

13 Respostas

L

Pelo que eu entendi, vc quer mostrar a tabela de acordo com a lista de clientes, é isso?
Se for, vc terá que usar JSTL (<c:forEach>) para iterar na sua lista clientes.
Por exemplo:

Cria um bean:

public class ListaDeClientes {

	private List<Cliente> clientes = new ArrayList<Cliente>();

	public ListaDeClientes(List<Cliente> lista){
		this.clientes = lista;
	}

	public final List<Cliente> getClientes() {
		return clientes;
	}

	public final void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}
}

Na Servlet:

ListaDeClientes clientes = new ListaDeClientes(clienteDAO.getListaPorNome(request.getParameter("nome")));

Na JSP:

<jsp:useBean id="lista" class="pacote.ListaDeClientes"/>

<c:forEach var="cliente" items="${lista.clientes}">
   <tr bgcolor="ggee99">  
        <td>${cliente.id}</td>  
        <td>${cliente.nome}</td>  
        <td>${cliente.cpf}</td>  
        <td>${cliente.telefone}</td>  
        <td>${cliente.email}</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>     
    </tr> 
</c:forEach >

Não testei, mas acho que já dá pra vc ter uma idéia…

Abs!

T

cara, não sei se tu entendeu, eu quero passar pelo parâmetro o nome do indivíduo. iai a lista vai retornar somente os clientes que tem parte do nome buscado nele.

no teu caso. na hr da jsp de busca…eu chamaria quem?
pq no meu eu chamo o servlet
<form action="mvc" method="POST"> Nome:<input type="text" name="nome" /> <input type="hidden" name="logica" value="BuscaClientePorNomeLogic" /> <input type="submit" value="Buscar" /> </form>
e dai vai como ta mostrado ali em cima. agr o teu, pelo que to vendo, eu não consegui identificar como tu vai passar esse parametro e fazer com que o jsp te retorne dessa forma que tu mostrou. Desse teu jeito é mais para a listagem de clientes total, assim, listando todos que estão cadastrado ou to errado?

valeu pela atenção!!!

L

Então Thiago, o negócio é o seguinte. Quando vc faz uma busca pelo nome, vc espera uma lista de clientes, certo?
A idéia é mostrar essa lista na JSP, não é isso?
Da forma que eu fiz, vc vai buscar a mesma lista de clientes pelo nome e mostrar o que vc tá querendo! Acho que vc não conseguiu entender. Não coloquei o código inteiro. Olha só:

Servlet:

public class BuscaClientePorNomeLogic implements Logica  {  
    public void executa(HttpServletRequest request, HttpServletResponse response)  
            throws Exception {  
        ClienteDAO clienteDAO = new ClienteDAO();         

        //Aqui vc vai setar o bean para depois recuperá-lo na JSP
        ListaDeClientes clientes = new ListaDeClientes(clienteDAO.getListaPorNome(request.getParameter("nome")));

        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/lista-clientes-campo.jsp");  
        requestDispatcher.forward(request, response);         
    }  
}

JSP:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<jsp:useBean id="lista" class="pacote.ListaDeClientes"/> 

<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="${lista.clientes}">  
   <tr bgcolor="ggee99">    
        <td>${cliente.id}</td>    
        <td>${cliente.nome}</td>    
        <td>${cliente.cpf}</td>    
        <td>${cliente.telefone}</td>    
        <td>${cliente.email}</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>       
    </tr>   
</c:forEach >  
  
</table>
</body>
</html>

Conseguiu entender? Através da linha <jsp:useBean id="lista" class="pacote.ListaDeClientes"/> vc vai recuperar a lista de clientes setada na servlet e fazer a iteração da lista através do <c:forEach>

Só lembrando que não estou testando, mas a idéia é essa! :wink:

Abs!

T

macho, é isso mesmo que to tentando fazer. Entendi a lógica do que tu ta sugerindo, mas acho que ele não consegue recuperar o valor que tu colocou lá na classe ListaDeClientes não…
consegue?

T

implementei aqui o que tu disse…e realmente da erro…
tu já usou isso antes?

L

Cara, como eu disse, não tinha testado! Mas funciona sim! Dá uma olhada nesse link que acho que vai te dar uma idéia melhor:

http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/jstl/jstl.htm

Abs!

T

Cara, acho que tu se enganou…
pq assim, quando tu chama o <jsp:useBean id="lista" class="pacote.ListaDeClientes"/>
tu ta chamando a classe ListaDeClientes que não tem nada nela.
A lista que tu “salvou” está guardada em clientes dentro da servlet BuscaClientePorNome.

L

Tenta passar ela então como vc estava fazendo:

request.setAttribute("clientes", clientes);

Vc chegou a tentar fazer isso? Depois vc pode tentar recuperar na sua JSP usando:

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

Acho que o caminho é por aí!

Boa sorte!

T

isso mesmo.
Resolveu.
postar o código aqui…
esse é o código que vai passar o parâmetro de busca pelo jsp.

<form action="mvc" method="POST">
	Nome:<input type="text" name="nome" />
	<input type="hidden" name="logica" value="BuscaClientePorNomeLogic" />
	<input type="submit" value="Buscar" />
</form>

Dai, entre as regras que uso de mvc ele vai chamar o BuscaClientePorNomeLogic..que é a servlet

public class BuscaClientePorNomeLogic implements Logica { public void executa(HttpServletRequest request, HttpServletResponse response) throws Exception { List<Cliente> clientes = new ArrayList<Cliente>(); ClienteDAO clienteDAO = new ClienteDAO(); clientes = clienteDAO.getListaPorNome(request.getParameter("nome")); request.setAttribute("clientes", clientes); RequestDispatcher requestDispatcher = request.getRequestDispatcher("/lista-clientes-campo.jsp"); requestDispatcher.forward(request, response); } }
Agora ele chama a jsp lista-clientes-campo.jsp que nessa vai fazer o forEach pegando o parametro clientes que foi passado pela servlet.

<c:forEach var="cliente" items="${clientes}">
	<tr bgcolor="ggee99">
		<td>${cliente.id}</td>
		<td>${cliente.nome}</td>
		<td>${cliente.cpf}</td>
		<td>${cliente.telefone}</td>
		<td>${cliente.email}</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>	
	</tr>
</c:forEach>

Acho que ta tudo ai.
Valeu leo.
abs

L

opa…boa tarde!

estou precisando implementar exatamente este método de busca…poderia postar, caso ainda tenha, o seu método “getListaPorNome” do dao de clientes!?!

obrigado!!!

T

opa leonardo, boa tarde.
Não tenho esse código mais não!
Vc tá utilizando o que no DAO para acessar o banco?
Não lembro direito como era. Mas, provavelmente eu fazia um select buscando pelo nome e retornava a lista de clientes pro controller.

Posta mais detalhes do teu DAO que posso tentar ajudar! :slight_smile:

L

opa thiago, blz?!?

então...eu consigo utilizar todos os 4 métodos básicos do crud numa boa...mas tbm preciso de um método de busca específica, assim como o que você postou!!

tentei utilizar o método de listagem, assim como o getLista da apostila...mas não estou conseguindo avançar muito...como vi que vc postou a classe de busca, mas não o método que é chamado lá do dao, resolvi perguntar!!!

olha como está meu código:

public Contato getListaPorNome(String nome) {
		Contato contato = new Contato();
		try {
			PreparedStatement stmt = this.connection1.prepareStatement("SELECT * FROM dgco_contratos WHERE nome = ?");
			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()) {
				//cria o objeto contato
				contato.setNome(rs.getString("nome"));
				
			}
			rs.close();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		return contato;
	}

pedi a um amigo o workspace dele pra ver se consigo resolver. Se ele não me mandar a tempo de terminar o que preciso, te pergunto novamente...obrigado!!

T
PreparedStatement stmt = this.connection1.prepareStatement("SELECT * FROM dgco_contratos WHERE nome = ?");  
stmt.setString(1, nome);

            ResultSet rs = stmt.executeQuery();

pelo que vi, tá faltando só vc setar o nome como parâmetro de entrada na query pra substituir o '?'.

acho que é isso!

Criado 11 de março de 2010
Ultima resposta 11 de out. de 2012
Respostas 13
Participantes 3