Dúvida básica sobre Ajax com Java

4 respostas
marcioa1

Olá,

Estou estudando Ajax, mas o livro que li mostrava exemplos com PHP ( Head RUSH AJAX ) . Ainda não vi exemplos envolvendo Java.

Gostaria de saber o seguinte. Eu faço uma requisição , via XMLHTTPRequest, para o servidor,indicando uma url. No caso do Java, qual seria esta url ? Um servlet ? Pode ser um página JSF ( faz sentido ? ) ou um ManagedBean ? Alguém teria um exemplo simples de um Servlet ( ou outra coisa qualquer) que recebesse a requisição e respondesse à página ?

Obrigado,

Márcio

4 Respostas

Alexandre_Vilas_Boas

Eu chamo uma jsp que devolve um xml, no caso abaixo, estou montando um combo onde eu filtro os itens

jsp:
<%@ page contentType="text/xml" %>
<%@ page import="br.com.dm.util.Ajax" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<c:set var="produtos" value="<%= Ajax.getComboProdutos(request.getParameter("stringPart"))%>" /&gt
<dados>
<c:forEach var="produto" items="${produtos}" varStatus="status">
  	<kitsId id="${produto.value}">
     	<idProduto>${produto.value}</idProduto>
     	<desc>${produto.label}</desc>
  	</kitsId>
</c:forEach>
</dados>
js:
function dadosComboProduto(stringPart){
	if(stringPart){
		var theUrl = "faturamentoXMLComboProdutos.jsp?stringPart="+stringPart;
		var data;
		var htmlText = "<select name='produto' class='textbox' onchange='alteraCampos(this.value, 2)'>"
	   	var id;
	   	var desc;
	   	xmlhttp.open("GET", theUrl, true);
	   	xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState==4) {
				data = xmlhttp.responseXML.getElementsByTagName("kitsId");
				for(i=0; i<data.length; i++){
					desc = data[i].getElementsByTagName("desc").item(0).firstChild.data;
					id = data[i].getElementsByTagName("idProduto").item(0).firstChild.data;
					htmlText = htmlText + "><option value=" + id + ">" + desc + "</option>";
				}
				htmlText = htmlText + "</select>"
				document.getElementById("selectProdutos").innerHTML=htmlText;
			}
		}
		xmlhttp.send(null);
	}
}
Y

No Ajax a URL independe da página a ser chamada. Pode ser uma servlet, um arquivo xml, um html, um php, asp, seja lá o que for. O Ajax, na prática, simula um requisição do browser àquela URL ao servidor. Então não importando a página que seja chamada, o retorno será, teoricamente, o mesmo tanto no Ajax quanto digitando a URL no campo de endereço.

Isso quer dizer que tu podes chamar tranqüilamente pelo Ajax uma servlet do tipo: www.site.com/Insert
quanto uma JSP: www.site.com/Insert.jsp
ou qualquer outro arquivo.

marcioa1

Alexandre,

Não entendi direito sua JSP. Ela monta um XML. Não precisa dar um comando do tipo, envia o arquivo XML de volta ?

Pode me dar um exemplo mais simples, do tipo recebe um número e retorna o dobro?

Obrigado,

Márcio

ASOBrasil

Segue exemplo básicão com Struts/AJAX. Espero que isso ajude!

Na sua Action

public ActionForward listaClientes(ActionMapping mapping, ActionForm form,
				HttpServletRequest request, HttpServletResponse response)
					throws ServicoIndisponivelException {
		
		try {
			meuDelegate delegate = new Delegate();
			List clientes = delegate.listaClientes();
			
			response.setContentType("text/xml; charset=UTf-8");
			response.setHeader("Cache-Control", "no-cache");
			
			if (clientes.isEmpty()) {
				response.sendError(HttpServletResponse.SC_NOT_FOUND);
				
			} else {
				XStream stream = new XStream();
				response.getWriter().write(stream.toXML(clientes));
			}
			
		} catch (IOException e) {
			//tratamento aqui
		}
		return mapping.findForward("success");
	}

No seu Javascript

//Faz uma chamada a action.
  	function retrieveURL() {
		
    	if (window.XMLHttpRequest) {
			
      		req = new XMLHttpRequest()
			req.onreadystatechange = listaClientes
			
      		try {
        		req.open("GET", "../../listaClientes.do", true)
			} catch (e) {
				alert(e)
			}
      		req.send(null)
			
		} else if (window.ActiveXObject) {
			
			req = new ActiveXObject("Microsoft.XMLHTTP")
			if (req) {
				req.onreadystatechange = listaClientes
				req.open("GET", "../../listaClientes.do", true)
				req.send()
			}
		}
	}


	//Carrega o combo (select) com os clientes.
	function listaClientes() {
		
		if (req.readyState == 4) {
			if (req.status == 200) {
				
				xml = req.responseXML
				
				//Pega a qtde de registos que foram serializados (utilizado XStream)
	        	registros = xml.getElementsByTagName("list")[0].childNodes.length
		        
		        for (i=0; i < registros; i++) {
		        	
		        	codigo = xml.getElementsByTagName("codigo")[i].firstChild.data
		        	nome = xml.getElementsByTagName("nome")[i].firstChild.data
		        	
		        	//Popula o combo (select)
		        	document.formulario.codigo.options[document.formulario.codigo.length] =
		        		new Option(nome, codigo)
				}
				
			} else {
				
				//Tratamento exemplo de erro, melhorar isso daqui!
				if (req.statusText == "Not Found") {
					alert("Não há clientes na base de dados!")
					
				} else {
					alert("Problema ao carregar clientes. ERRO: " + req.statusText)
				}
			}
		}
	}

ASOBrasil

Criado 2 de janeiro de 2007
Ultima resposta 4 de jan. de 2007
Respostas 4
Participantes 4