[AJAX] : pb en communication Synchrone sous Firefox !
Bonjour,
je veux afficher les cordonnées du régisseur lors je sélectionne une régie dans une liste déroulante.
Nous utilisons le serveur Tomcat 5.5 et les technologies suivantes : Struts / Spring / Hibernate 3.0 et Oracle...
Dans ma page JSP, j'ai le code javascript suivant : «
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| // 1. Propriétés de la classe
ajaxObject = null;
ajaxAsynchrone = false;
ajaxMethode = "GET";
// Création de l'objet XMLHTTpRequest
if (window.ActiveXObject) {
//Pour Internet Explorer
ajaxObject = new ActiveXObject("Microsoft.XMLHTTP") ;
} else if (window.XMLHttpRequest) {
//Pour FireFox
ajaxObject = new XMLHttpRequest();
} else {
// Object XMLHttpRequest non supporté pour ce navigateur
ajaxObject = null;
}
// 2. Méthodes de la classe
function setAjaxAsynchrone() {
ajaxAsynchrone = true;
}
function setAjaxSynchrone()
{
ajaxAsynchrone = false;
}
function setAjaxMethode(m) {
if (m=="GET" || m=="POST" || m=="HEAD")
{
ajaxMethode = m;
}
} |
».
Ensuite, j'ai la méthode findDebiteurByAjax(page, parametre) qui est appelé lors de la sélection d'une régie dans ma liste déroulante : «
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| setAjaxAsynchrone();
setAjaxMethode('POST'); // on passe les informations par la méthode POST
// Les deux paramètres sont :
// * page : nom de la page appelée
// * parametre : paramètre à envoyer à l'action Struts !
function findDebiteurByAjax(page, parametre) {
if (ajaxObject != null) {
var url = page;
// Si la méthode est get et que paramètre contient des données, on ajoute ? l'url
if (ajaxMethode == "GET" && parametre != null) {
if (parametre != "") {
url = url + "?" + parametre;
parametre = null;
}
}
// Ouverture de la page dans le mode demandé
ajaxObject.open(ajaxMethode, url, ajaxAsynchrone);
//Alimente le content une fois la page compl?tement recu
ajaxObject.onreadystatechange = function() {
// Les données sont complètement accessibles ==> 4 (complet)
// Le code HTTP retourné par la requête est Ok ==> 200
if (ajaxObject.readyState == 4) {
if (ajaxObject.status == 200) {
var res = ajaxObject.responseText;
alert(res);
}
// Force l'arret de tous les scripts javascript
// window.event.cancelBubble = true;
}
}
// Si envoi par POST, ...
if (ajaxMethode == "POST") {
ajaxObject.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
}
// Envoi de l'objet au serveur
ajaxObject.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
ajaxObject.send(parametre);
}
} |
»
Je peux maintenant vous présenter mon action Struts : «
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| public ActionForward coordDebiteurAssocieToRegie(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
VueCreanceFB fb = (VueCreanceFB)form;
VueCreanceGC gc = fb.getVueCreanceGC();
String codeRegie = request.getParameter("codeRegie");
StringBuffer monXML = new StringBuffer();
if ((gc != null) && (codeRegie != null) && (!codeRegie.equals(""))) {
//TODO : Lorsque l'on saura récupérer le débiteur/régisseur associée à une régie
// on pourra ici compléter l'objet
// A voir avec Florence ou Olivier.
CreanceAssembler ass = (CreanceAssembler)gc.getAssembler();
IServiceRegie serviceRegie = (IServiceRegie)ass.getServiceRegie();
AdresseRegisseur adrRegisseur = serviceRegie.getAdresseRegisseur(codeRegie);
monXML.append("<?xml version=\"1.0\" ?>");
monXML.append("<root>");
if (adrRegisseur == null) {
monXML.append("<nomRegisseur></nomRegisseur>");
monXML.append("<adresseRegisseur1></adresseRegisseur1>"); monXML.append("<adresseRegisseur2></adresseRegisseur2>");
monXML.append("<adresseRegisseur3></adresseRegisseur3>");
monXML.append("<adresseRegisseur4></adresseRegisseur4>");
monXML.append("<CPRegisseur></CPRegisseur>");
monXML.append("<VilleRegisseur></VilleRegisseur>");
monXML.append("<identifiantPays>100</identifiantPays>");
} else {
monXML.append("<nomRegisseur>" + ((adrRegisseur.getNomOuRaisonSociale() == null)?"":adrRegisseur.getNomOuRaisonSociale()) + "</nomRegisseur>");
monXML.append("<adresseRegisseur1>" + ((adrRegisseur.getAdresseRegisseur1() == null)?"":adrRegisseur.getAdresseRegisseur1()) + "</adresseRegisseur1>");
monXML.append("<adresseRegisseur2>" + ((adrRegisseur.getAdresseRegisseur2() == null)?"":adrRegisseur.getAdresseRegisseur2())+ "</adresseRegisseur2>");
monXML.append("<adresseRegisseur3>" + ((adrRegisseur.getAdresseRegisseur3() == null)?"":adrRegisseur.getAdresseRegisseur3()) + "</adresseRegisseur3>");
monXML.append("<adresseRegisseur4>" + ((adrRegisseur.getAdresseRegisseur4() == null)?"":adrRegisseur.getAdresseRegisseur4())+ "</adresseRegisseur4>");
monXML.append("<CPRegisseur>" + ((adrRegisseur.getCodePostalRegisseur() == null)?"":adrRegisseur.getCodePostalRegisseur()) + "</CPRegisseur>");
monXML.append("<VilleRegisseur>" + ((adrRegisseur.getVilleRegisseur()==null)?"":adrRegisseur.getVilleRegisseur()) + "</VilleRegisseur>");
monXML.append("<identifiantPays>" + (((String)adrRegisseur.getPaysRegisseur()==null)?"":(String)adrRegisseur.getPaysRegisseur()) + "</identifiantPays>");
}
// on termine le document XML
monXML.append("</root>");
}
System.out.println("=============");
System.out.println(monXML.toString());
System.out.println("=============");
//response.setContentType("application/xml");
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
out.println(monXML.toString());
out.flush();
return null;
} |
».
Pour le moment, j'essaye de récupérer les informations sous forme de texte en JavaScript. Sous IE, tout fonctionne parfaitement alors que sous Firefox 1.5.0.5, cela marche bien en mode Asynchrone et il ne se passe rien en mode Synchrone.
J'ai beau mettre des alerts dans la déclaration de la fonction associée à la propriété onreadystatechange, il ne se passe rien !!!
Au niveau de la console JavaScript, aucune erreur n'est relevée !
Avez-vous une idée,
Merci d'avance.
Fabien.