Dúvidas com busca Json

Olá!

Seguindo os exemplos da Apostila do FJ28, tenho duas dúvidas em relação ao campo busca autocomplete:

Primeiramente, quando eu digito no campo busca um nome que contenha acentuação ele encontra perfeitamente, porém ao retornar o arquivo “busca.jsp”, ele não acentua corretamente.

Arquivo busca.jsp

     <h3>Resultados da busca pelo nome <b>"${nome }"</b></h3>
     <%@ include file="lista.jsp" %>

O caracter inválido aparece exatamente onde está a referência ${nome}.

Defini como UTF-8 no web.xml:

    <context-param>  
        <param-name>br.com.caelum.vraptor.encoding</param-name>  
        <param-value>UTF-8</param-value>  
    </context-param>  

E também no cabeçalho do JSP:

e

<head>
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

e mesmo assim não funcionou.

Aproveito a oportunidade para questionar se são necessárias essas duas últimas definições de codificação no cabeçalho do JSP.

Minha segunda dúvida, é que no local do link “editar” eu coloquei uma imagem, e no local do botão “remover” também coloquei uma imagem.
As duas imagens (pequenos ícones) aparecem perfeitamente quando listo os itens da tabela.

Quando o resultado da busca é retornado, não aparece o link editar e o botão remover aparece minúsculo e sem a imagem dentro, porém o botão remover ainda funciona.

Por algum motivo as duas imagens não estão aparecendo. Não consegui identificar o motivo, pois após a busca é retornada a mesma lista inicial, com exceção de aparecer apenas os resultados encontrados.

Muito obrigado!

como vc tá preenchendo esse nome?

como vc colocou o caminho das imagens?

A função:

[code]function init(){
$("#busca").puts(“Buscar produtos por nome”);

$("#busca").autocomplete('/goodbuy/produto/busca.json', {
		dataType : "json",
		parse : function(produto) {
			return $.map(produto, function(produto) {
				return {
					data : produto,
					value : produto.nome,
					result : produto.nome
				};
			});
		},
		formatItem : function(produto) {
			return produto.nome + " (" + produto.modelo + ")";
		}
});[/code]

O controller:

[code] public List busca(String nome) {
result.include(“nome”, nome);
return dao.busca(nome);
}

@Get
@Path("/produto/busca.json")
public void buscaJson(String q) {
	result.use(Results.json())
			.withoutRoot()
			.from(dao.busca(q))
			.exclude("id")
			.serialize();
}

[/code]
E no DAO:

@SuppressWarnings("unchecked") public List<Produto> busca(String nome) { return session.createCriteria(Produto.class) .add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE)) .list(); }

O erro nos caracteres acontece exatamente quando volta o busca.jsp:

<h3>Resultados da busca pelo nome <b>"${nome }"</b></h3> <%@ include file="lista.jsp" %>
Digamos que o nome do produto seja “café”, ele não acentuará corretamente.

E nas imagens dos botões, quando eu chamo a lista, sem busca nenhuma, ela exibe perfeitamente as imagens. Só não exibe quando é retornado o resultado da busca.

<td><a href="<c:url value="/produto/${produto.id}"/>"><img src="imagens/editar.gif"></a></td> <td> <form action="<c:url value="/produto/${produto.id}"/>" method="POST"> <button class="linkExcluir" name="_method" value="DELETE"><img src="imagens/excluir.gif"></button> </form> </td>

Vlw cara…

a imagem faltou colocar o <c:url no src,
e o nome pode ser pq no banco foi salvo com o encoding errado… tenta ver com nome que vc acabou de salvar (pela interface da aplicação, não direto no banco)

Lucas, tentei de várias formas colocar o <c:url no src,

não deu certo. Provavelmente estou fazendo algo errado… rs

Quanto ao encoding, ele está aparecendo perfeitamente na interface de aplicação quando eu listo, e até mesmo nas opções do autocomplete, só não aparece após vir o resultado da busca, no título “Resultados da busca pelo nome *****” e consequentemente a busca não retorna resultados quando eu tento buscar uma palavra acentuada.

No banco aparece tudo ok também. O nome é gravado corretamente com a acentuação.

Se for algo em relação a como está sendo gravado no banco, há como alterar alguma opção nas configurações do hibernate ou da aplicação?

Obrigado.

é pra fazer igual vc fez no href:

<img src="<c:url value="/imagens/editar.gif"/>" />

e precisa da barra no começo, senão não funciona

heheh… exato, coloquei a barra e funcionou na hora…

vlw…

PS:

no problema da acentuação, setei o banco para CHARACTER SET utf8 COLLATE utf8_general_ci, estava em latin1.

Na config do Hibernate esta assim:

<property name="hibernate.connection.CharSet">utf8</property> <property name="hibernate.connection.characterEncoding">utf8</property>

Resumindo, em todas as configurações possíveis estão definidos utf-8, creio não ser problema de encoding.

Não resolveu.

para dados novos, ou dados que já estavam no banco?

Eu tinha feito o teste com dados existentes na tabela. Sem resultado.

Após isso, removi a base de dados e a criei novamente. Com ela vazia, inseri um nome josé.

Quando eu começo a digitar ela já aparece o nome no campo busca autocomplete, porém quando eu concluo a busca o resultado que retorna é esse:

Resultados da busca pelo nome “josé”

E não é listado o resultado.

no autocomplete vem com o acento correto?

vc inseriu direto na base, ou pelo sistema?

No autocomplete, assim que eu digito o “J” já aparece um box com o nome (grafado corretamente), eu clico no nome e ele preenche o campo busca, grafado corretamente também.
Após eu dar enter para completar a busca, ele aparece a nova página listando o item que foi encontrado.

Nessa hora que é exibido na parte do título da lista: Resultados da busca pelo nome “josé”.
E nos resultados da lista, não aparece nenhum item, consequentemente porque “josé” difere de “josé”, então o erro está acontecendo (creio eu) no momento em que é enviado o resultado para o Controller.

Inseri pelo sistema mesmo, só utilizei o banco de dados pra criar o schema.

o problema dá no busca, no buscaJson ou nos dois?

Creio eu que seja apenas no busca (do Controller), pois o busca.json apenas retorna o valor encontrado e preenche o campo busca (form, no menu).

@Get @Path("/produto/busca.json") public void buscaJson(String q) { result.use(Results.json()) .withoutRoot() .from(dao.busca(q)) .exclude("id") .serialize(); }

Após dar o ok com o form preenchido (imagino que nesse ponto já encerrou o buscaJson), que é exibida outra tela com o erro (busca.jsp).

E também porque quem dá o return com o nome é o “busca”.

public List<Produto> busca(String nome) { result.include("nome", nome); return dao.busca(nome); }

Estranho que que após concluir o autocomplete (json) ele “perde” a codificação de caracteres.

após concluir ou qdo vc manda ele fazer a busca de fato?

corrigindo, o autocomplete funciona perfeitamente, o campo de busca que criei no menu é preenchido com o nome com a codificação correta

apóóós eu dar ok e a tela que exibe a lista com o resultados aparecer é que acontece o erro.

ela é exibida com erro no título, e nenhum resultado da busca, antes selecionada, aparece

Resultados da busca pelo nome "${nome }"

<%@ include file="lista.jsp" %>

Esse processo inteiro em um nome que não contenha acentos funciona perfeitamente.

tenta desabilitar o autocomplete e buscar por josé… ele quebra o encoding?

Lucas, desabilitei o autocomplete:

// @Get // @Path("/produto/busca.json") // public void buscaJson(String q) { // result.use(Results.json()) // .withoutRoot() // .from(dao.busca(q)) // .exclude("id") // .serialize(); // }

E mesmo assim ainda quebra o encoding. Acontece o mesmo erro.

Mas, detalhe que ainda não tinha testado, se eu digitar “jose” na busca, sem acentuação, ele retorna o campo e a busca funciona perfeitamente (testei dos dois modos, com ou sem o autocomplete).

Bom, deu pra saber que o autocomplete não está interferindo nessa perda de codificação.

vc fez a busca por ajax ou normal?

normal, sem ajax