[Resolvido] Ajuda Sistema Busca

4 respostas
desk

Olá pessoal, estou fazendo 1 sisteminha de busca com struts2 e hibernate, mas estou tendo problemas para jogar o parametro do txtfield no LIKE. Porém quando ponho algo que tenha no banco em vez do nome do txtfield (txtBusca) faz a busca normal pelo like. o problema creio que seja apenas colocar no like o txtfield corratente…
segue o código:

package br.com.ibooker.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import br.com.ibooker.hibernate.HibernateUtil;
import br.com.ibooker.modelo.Livros;

public class LivrosDAO {
	private final Session session ;
	
	public LivrosDAO() {
		this.session = new HibernateUtil().getSession() ;
	}

	public List<Livros> busca(String nome) {
		return session.createCriteria(Livros.class).add(Restrictions.like("nome", "%txtBusca%")).list() ;
	}

}
package br.com.ibooker.action;

import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import br.com.ibooker.dao.LivrosDAO;
import br.com.ibooker.modelo.Livros;

public class BuscaLivroAction {
	private List<Livros> livro ;
	private String nome ;


	@Action(value="buscar", results={
			@Result(name="ok", location="/resultado-busca.jsp")
	})
	public String execute() {
		livro = new LivrosDAO().busca(nome) ;
		return "ok" ;
	}

	public List<Livros> getLivro() {
		return livro;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	
}
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="buscar">
 Digite o texto a ser buscado:
 <input type="text" name="txtBusca">
 <input type="submit" value="Buscar">
</form>
</body>
</html>

Grato.

4 Respostas

jyoshiriro

Amigo, não entendi bem sua dúvida, mas gostaria de fazer algumas considerações:

No código:

public List<Livros> busca(String nome) { return session.createCriteria(Livros.class).add(Restrictions.like("nome", "%txtBusca%")).list() ; }
Não seria o correto ficar:

return session.createCriteria(Livros.class).add(Restrictions.like("nome", "%"+nome+"%")).list() ;

E, outra: o seu método execute poderia ficar:

public String execute() { livro = new LivrosDAO().busca(nome) ; return SUCCESS; // lembrando que SUCCESS = "success" }
Assim mesmo, sem anotação nenhuma.
Nesse caso, a url para invocar essa Action seria automaticamente “buscar-livro” e todos os resultados padrão (“success”, “input” e “error”) seriam a página “WEB-INF/content/buscar-livro.jsp”.
Se quiser JSPs diferentes para diferentes resultados, basta criar JSPs com um sufixo diferente que o Struts2 mapeia automaticamente. Por exemplo: Se criar a página “WEB-INF/content/buscar-livro-error.jsp” apenas o resultado “error” seria mapeado para essa página. “success” e “input” continuariam para “WEB-INF/content/buscar-livro.jsp”, a não ser que você criasse “WEB-INF/content/buscar-livro-success.jsp” e “WEB-INF/content/buscar-livro-input.jsp”, respectivamente.

Outra dica: Para facilitar sua vida no uso de Struts2 + Hibernate Core, existe o Full Hibernate Plugin: http://cwiki.apache.org/S2PLUGINS/full-hibernate-plugin.html

desk

Olá brother, vc diz que no codigo:

public  List<Livros>  busca(String nome) {
          return session.createCriteria(Livros.class).add(Restrictions.like("nome", "%txtBusca%")).list() ;    
}

Trocar o txtbusca por +nome+ … porem oque seria esse nome? no caso penso que ali teria que colocar o campo do txtfield do formulario de busca para ele buscar não?!

Minha dúvida é a seguinte. tem 1 formulario onde tem 1 textfield e a pessoa bota oque quer procurar, oq ele escreveu é passado para o DAO onde faz uma busca por LIKE e retorna numa página, certo? porém não sei oque colocar ali no LIKE para fazer a busca correta doque a pessoa escreve. Tentei colocar o nome do textfield do formulario como txtBusca, e no Like botar %txtBusca% porém ele não esta buscando, estou fazendo correto? qual seria a forma? talvez funcionaria “%” +txtBusca+ “%” ?

Obrigado pelas dícas brother!

jyoshiriro

Ora, o método

public List<Livros> busca(String nome) { return session.createCriteria(Livros.class).add(Restrictions.like("nome", "%txtBusca%")).list() ; }
possui o parâmetro “nome”, não é?
Este vem da action:

public String execute() { livro = new LivrosDAO().busca(nome) ; return "ok" ; }
Dai, se você tem tivesse um campo no JSP de nome “nome” (isso mesmo, nome igual a “nome”), o simples fato de exitir

public void setNome(String nome) { this.nome = nome; }
na sua Action já garante que ela injetará na variável “nome” o que foi digitado no formulário do JSP.

Ocorre que no seu JSP tem um campo chamado “txtBusca”, logo, ou você muda o nome de para “nome” no JSP ou muda a variável “nome” para “txtBusca” na Action (gerando assim novos get e set).

Ora a sugestão de mudança no seu DAO se dá porque seu código está simplesmente estático. Sempre está mandando a mesma consulta para o Hibernate. Você passou uma String “%txtBusca%” e é exatamente assim que ela está chegando no SGBD! Dugeri para usar o parâmetro “nome” porque ele que vem da Action. Veja que seu parâmetro “nome” nem tava sendo usado em nada.

desk

jyoshiriro:
Ora, o método

public List<Livros> busca(String nome) { return session.createCriteria(Livros.class).add(Restrictions.like("nome", "%txtBusca%")).list() ; }
possui o parâmetro “nome”, não é?
Este vem da action:

public String execute() { livro = new LivrosDAO().busca(nome) ; return "ok" ; }
Dai, se você tem tivesse um campo no JSP de nome “nome” (isso mesmo, nome igual a “nome”), o simples fato de exitir

public void setNome(String nome) { this.nome = nome; }
na sua Action já garante que ela injetará na variável “nome” o que foi digitado no formulário do JSP.

Ocorre que no seu JSP tem um campo chamado “txtBusca”, logo, ou você muda o nome de para “nome” no JSP ou muda a variável “nome” para “txtBusca” na Action (gerando assim novos get e set).

Ora a sugestão de mudança no seu DAO se dá porque seu código está simplesmente estático. Sempre está mandando a mesma consulta para o Hibernate. Você passou uma String “%txtBusca%” e é exatamente assim que ela está chegando no SGBD! Dugeri para usar o parâmetro “nome” porque ele que vem da Action. Veja que seu parâmetro “nome” nem tava sendo usado em nada.

aa intendi, obrigado mesmo, vc conseguiu esclarescer todas duvidas que eu tava tendo haha
vlw mesmo! consegui rodar agora tranquilamente

Criado 24 de março de 2010
Ultima resposta 25 de mar. de 2010
Respostas 4
Participantes 2