Servlet, response em XML, Ajax e JavaScript

9 respostas
V

Olá, Pessoal, Boa Tarde!

Estou desenvolvendo um Servlet que deve fazer uma consulta ao BD e retorna um XML para o Browser através de AJAX. Já fucei o GUJ todo mas não consegui resolver um problema. Chamo o Servlet por Ajax e peço o resultado em XML, mas não consigo receber e ler o XML no Javascript. No IE não retorna nada. No FF diz que tem um ObjectXMLDocument - mas não me deixa acessar e no Chrome aparece null em todos eles não consigo acessar a resposta como XML. Se eu receber por responseText eu vejo o XML retornado, mas se for no responseXML só consigo ver as msg citadas acima: nada, ObjectXMLDocument ou null.

O AJAX é o de sempre, respostaServicoSolicitado=xmlhttp.responseXML; sempre consigo receber um arquivo.xml qualquer com ele. o Problema acho que tá sendo gerar o XML em tempo de execução sem gravar em arquivo. Segue abaixo o código prá ver se vcs me dão umas dicas uma luz prá desenrolar isso. Nas duas formas abaixo não tô conseguindo receber o XML no browser. Tá enrolado o negócio… o que tá errado nesse código?

XML DESEJADO NO BROWSER:

<?xml version=‘1.0’ encoding=‘iso-8859-1’?>
<tamanho>
<totalRegistros id=‘totalRegistros’>200</totalRegistros>
</tamanho>

TENHO ESSA OPÇÃO:

response.setContentType(“text/xml”);

response.setHeader(“Cache-Control”, “no-cache”);

PrintWriter out = response.getWriter();

totalRegistros=getTotalRegistros(request, response);  // pega o total de registros retornados na consulta -  funcionando normal.

out.write("<?xml version=‘1.0’ encoding=‘iso-8859-1’?>\n");

out.write("<tamanho>\n"); // \ r \ n

out.write("<totalRegistros id=‘totalRegistros’>"+totalRegistros+"</totalRegistros>\n");

out.write("</tamanho>");

out.close();

OU ESTA OUTRA:

totalRegistros=getTotalRegistros(request, response); // pega o total de registros retornados na consulta - tá funcionando normal.

String totalReg = new Integer(totalRegistros).toString();

response.setContentType(text/xml);

DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();

DocumentBuilder docBuilder = dbfac.newDocumentBuilder();

Document doc = docBuilder.newDocument();

Element tamanho = doc.createElement(tamanho);

doc.appendChild(tamanho);

Element totalRegistros = doc.createElement(totalRegistros);

<a href="//totalRegistros.setAttribute">//totalRegistros.setAttribute</a>(“id”, “totalRegistros”); //essa opção também funciona para set o id

Attr attr = doc.createAttribute(id);

attr.setValue(totalRegistros);

totalRegistros.setAttributeNode(attr);

tamanho.appendChild(totalRegistros);

Text text = doc.createTextNode(totalReg);

totalRegistros.appendChild(text);

TransformerFactory transfac = TransformerFactory.newInstance();

Transformer trans = transfac.newTransformer();

DOMSource source = new DOMSource(doc);

trans.setOutputProperty(OutputKeys.METHOD, xml);

trans.setOutputProperty(OutputKeys.ENCODING, iso-8859-1);

trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, no);

trans.setOutputProperty(OutputKeys.INDENT, yes);

ServletOutputStream outputStream = response.getOutputStream();

StreamResult stream = new StreamResult(outputStream);

trans.transform(source, stream);

outputStream.close();

9 Respostas

jweibe

Cara pra serializar objetos em xml da uma olhada no simple xml ou no XStream

>> http://simple.sourceforge.net/
>> http://xstream.codehaus.org/

V

jweibe:
Cara pra serializar objetos em xml da uma olhada no simple xml ou no XStream

>> http://simple.sourceforge.net/
>> http://xstream.codehaus.org/

jweibe, num tem como fazer sem framework? diretão no servlet como nos códigos postado que catei aki no forum? prefiro desenrolar esse código q tá aí ele tá gerando o xml mas não tó conseguindo receber ele no browser…valeu!

jweibe

http://www.ibm.com/developerworks/web/library/x-servlets-and-xml/

ViniGodoy

Por favor, ao postar tópicos, não deixe TODAS AS LETRAS EM MAIÚSCULAS.

V

jweibe, já vi esse texto comparei o meu código com o dele (igual a minha primeira opção, tá tudo igual). Mas mesmo assim só recebo o xml no responseText. Já no responseXML do AJAX não consigo nada além das mensagens já citadas: null no chrome. Tem alguma idéia sobre o que acontece?

V

Opa, ViniGodoy, foi mal - mas não entendi. Vc quis dizer no título do tópico? se for possível editá-lo faço já isso. Valeu!

jweibe

Tenta da um flush() no PrintWriter e um flushBuffer() no seu HttpServletResponse.
Isso antes do método PrintWriter .close();

ViniGodoy

Opa, ViniGodoy, foi mal - mas não entendi. Vc quis dizer no título do tópico? se for possível editá-lo faço já isso. Valeu!

Era no título sim. Eu já havia editado o título.

V

Opa, ViniGodoy, foi mal - mas não entendi. Vc quis dizer no título do tópico? se for possível editá-lo faço já isso. Valeu!

Era no título sim. Eu já havia editado o título.

Valeu o aviso. Sucesso!

Criado 21 de setembro de 2012
Ultima resposta 21 de set. de 2012
Respostas 9
Participantes 3