Dúvidas com busca Json

30 respostas
H

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!

30 Respostas

Lucas_Cavalcanti

como vc tá preenchendo esse nome?

como vc colocou o caminho das imagens?

H
A função:
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 + ")";
			}
	});
O controller:
public List<Produto> 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();
	}
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...

Lucas_Cavalcanti

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)

H

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.

Lucas_Cavalcanti

é 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

H

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

vlw…

H

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.

Lucas_Cavalcanti

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

H

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.

Lucas_Cavalcanti

no autocomplete vem com o acento correto?

vc inseriu direto na base, ou pelo sistema?

H

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.

Lucas_Cavalcanti

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

H

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.

Lucas_Cavalcanti

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

H

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.

Lucas_Cavalcanti

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

H

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.

Lucas_Cavalcanti

vc fez a busca por ajax ou normal?

H

normal, sem ajax

Lucas_Cavalcanti

=(

faz um teste pra mim… no firebug do firefox (instale se não tiver) veja quais foram os cabeçalhos(headers) de request e response qdo vc faz a busca, pra ver se os encodings estão indo corretos

depois tenta só pra teste trocar o form para POST e ver se dá o mesmo erro

H

possuía o Firebug instalado mas não conhecia estas funcionalidades que você passou… mto bom

enfim, quando realizo a busca:

Cabeçalhos de Resposta
Server Apache-Coyote/1.1
Content-Type text/html;charset=UTF-8
Content-Length 3055
Date Thu, 13 Oct 2011 13:07:01 GMT

Cabeçalhos de Solicitação
Host localhost:8080
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Accept text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding gzip, deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection keep-alive
Referer http://localhost:8080/goodbuy/produto/busca?nome=josé
Cookie JSESSIONID=BEDDF5A6D1A37BB876CFB3CC7BA24DC5

No Accept-Charset ele deveria estar aceitando UTF-8 certo?

Lucas_Cavalcanti

como está o seu form de busca?

H
<form action="<c:url value="/produto/busca"/>">
	<input id="busca" name="nome" />
</form>
Lucas_Cavalcanti

só pra teste, troque o form pra POST (e a lógica também) pra ver se tb fica com problemas de acentos

H

opa… faltou informar, já está tudo em POST.

outro detalhe, estou implantando as validações de campo em JS e também estão ocorrendo problemas com encoding.

Exemplo:

$('#produtoForm').validate({ rules:{ "produto.nome":{required: true, minlength: 3} }, messages:{ "produto.nome":{ required: "Campo obrigatório!", minlength: "O campo deve conter no mínimo 3 caracteres!" }

Nas messages, onde há acentuação, estão aparecendo com caracteres codificados também, creio que seja o mesmo problema que está interferindo na busca.

Lucas_Cavalcanti

se vc submita o form sem javascript tá indo?

H

se eu digitar “josé” não vai… não aparece resultado.
se eu digitar, por exemplo, “jos” encontra perfeitamente.

Lucas_Cavalcanti

faz o seguinte então…

baixe o blank project do vraptor, coloque a configuração de encoding do vraptor no web.xml (só ela), crie um jsp com um form simples com um campo de texto e submeta esse form pra uma lógica qqer. Na lógica imprima o texto e veja se os acentos estão ok…

(só pra saber, se vc imprimir a string que veio do seu form ela tá com os caracteres zuados?)

H

respondendo o fim do último post, a busca retorna o valor certinho, acentuado.

pesquisando no fórum, encontrei uma solução:

setar o contentType em ISO-8859-1 e o enconding como UTF, funcionou perfeitamente, tanto encontrou o resultado da busca com a acentuação, quanto também os validate do jquery mostraram as mensagens de validação acentuadas… \o/

Poréééém, quando eu tento inserir um novo, que tenha acentuação, ele aparece uma página de erros gigante do tomcat, o importante é:

java.sql.SQLException: Incorrect string value: ‘\xEF\xBF\xBDrio’ for column ‘produto’ at row 1

Ele não consegue gravar acentuado, perde o encoding novamente, mas agora em outro ponto.

Lucas_Cavalcanti

se vc imprime a string no servidor, ela vem com os acentos corretos?

Criado 6 de outubro de 2011
Ultima resposta 13 de out. de 2011
Respostas 30
Participantes 2