[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

leo.junior

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

leo.junior

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?

leo.junior

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.

leo.junior

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

leonardoteles

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:

leonardoteles

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