IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

récupérer une variable après appel asynchrone à une jsp


Sujet :

Servlets/JSP Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Points : 48
    Points
    48
    Par défaut récupérer une variable après appel asynchrone à une jsp
    bonjour,

    J'ai deux jsp. Une qui fais de l'affichage avec un tableau que nous appellerons tab.jsp. Cette première jsp appelle une seconde jsp (que nous appellerons traitement.jsp) qui ne fais pas d'affichage mais qui fais des test sur une base de données.

    Dans tab.jsp, j'ai un tableau rempli avec des données issues de la base de données.
    Dans cette jsp, j'ai un bouton qui ajoute une ligne au tableau, mais avant de faire l'ajout, je dois faire des test.
    Disons que le type de ligne soit le suivant:
    id | libellé | commentaire | date | statut
    (ici, on parle d'article dans des campagnes publicitaires, donc l'id est celui d'un article, le commentaire, ce lui qui concerne un article, ...)

    -je fais des test sur la validité des infos passées dans les champs de texte (est-ce une date conforme, statut est-il une lettre entre 'O','R','S' ou 'F', ...)
    -je dois vérifier que la ligne que j'insère ne contienne pas le même 'id' qu'une ligne déja dans le tableau de la jsp (tab.jsp)
    ça je le fais dans la jsp tab.jsp avec les composant javascript(tableau et champs texte).

    -je dois tester si l'id existe déjà dans la base de données dans une autre table car je ne peux insérer que des articles qui existent dans la base.
    Et ça, j'utilise pour l'instant une autre jsp (traitement.jsp).

    En gros, quand je clique sur le bouton qui ajoute les articles, je lance une méthode qui fais des traitements en javascript et ensuite, je lance une requête avec XMLHttpRequest vers la seconde jsp qui s'occupe des test sur la base. la seconde s'occupe également de l'ajout dans la base de données de l'article.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    59
    60
     
     function ajouterArticle() {
                variable = "2";
                if(codeCampagne != null) {
     
    	            var codeArticle = dijit.byId("codeArticle");
    	            var statut = dijit.byId("statutArticle");
    	            var comm = dijit.byId("commentaireArticle");
    	            var qte = dijit.byId("qteMinArticle");
     
    	            var tabA = grid.model.data;
     
    	            /*alert('codeArticle pour valeur : '+codeArticle.value);
    	            alert('statut pour valeur : '+statut.value);
    	            alert('comm pour valeur : '+comm.value);
    	            alert('qte pour valeur : '+qte.value);*/
     
    	            // test si le statut et la quantité sont valide
    				if( (statut.isValid() ==  true) && ( (qte.isInRange() == true) || (qte == "") ) ) {
     
    					// test si l'article tapé est déjà dans la campagne
    					// initialisation à false = n'est pas dans la campagne
    					var bool = false;
    					for(var i = 0; i < tabA.length; i++) {
    						if(codeArticle.value == (tabA[i][2]))
    							bool = true;
    					}
     
    					if(bool == false) {
     
    					 var xhr = getXhr()
    						// On défini ce qu'on va faire quand on aura la réponse
    						xhr.onreadystatechange = function(){
    							// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
    							if(xhr.readyState == 4 && xhr.status == 200){
    								// alert(xhr.responseText);
    								//document.getElementById("resultAjoutArticle").innerHTML = xhr.responseText;
    								variable = xhr.responseText;
    							}
    						}
     
    						var url = "addArticle.jsp?codeArticle=" + codeArticle.value + "&statut=" + statut.value + "&commentaire=" + comm.value + "&qte=" + qte.value + "&codeCampagne=" + codeCampagne+"&variable="+variable;
    						//var url = "AddArticle.do";
    						//alert("url = " + url);
    						xhr.open("GET", url, true);
    						xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    						xhr.send(null);
     
    // FIN DES TESTS DANS LA SECONDE JSP
    // COMMENT JE SAIS CE QU'IL S'EST PASSE
     
    					} else {
    						alert("Cet article existe déjà dans cette campagne.");
    					}
    				} else {
    					alert("Erreur dans les champs saisies.");
    				}
                } else
                    alert("Veuillez sélectionner une campagne.");
             }
    Mon problème est le suivant:
    Une fois que le traitement dans la seconde jsp est terminé, je reviens dans le code de la première. C'est à ce moment que je dois ajouter la ligne dans le tableau javascript. Comment je sais ce qu'il s'est passé, si les tests sont positifs ou négatifs dans traitement.jsp, pour savoir si j'ajoute ou non dans le tableau javascript?

    J'avais pensé à retourner un boolean par exemple (true si je peux ajouter et false sinon) mais je ne réussi pas à envoyer une variable ou des paramètres en retour (de traitement.jsp vers tab.jsp).

    Si ma méthode est toute naze, dite le moi, si il y a une autre solution plus 'propre' aussi.

    merci.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par troussepoil Voir le message
    ...
    Si ma méthode est toute naze, dite le moi, si il y a une autre solution plus 'propre' aussi.
    Toute naze, je ne voudrais pas être méchant, disons qu'elle n'est (à priori) pas très adaptée

    Pourquoi ne pas passer par une servlet ?
    La servlet s'occupera des tests et de la mise à jour et (re)chargera la page source (voir MVC)

    A moins que tu veuilles impérativement faire de l'AJAX...

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    Non, si ça peut me débloquer, je suis près à changer. en fait, je suis aprti sur cette piste parce que c'est le premier truc auquel j'ai pensé. Je débute et je sais pas trop comment faire.
    En fait j'utilise Struts. J'avais testé d'appeler une action directement en cliquant sur le bouton mais je ne vois pas comment faire mes test sur le tableau javascript et surtout comment ajouter la ligne dans le tableau javascript dans l'action. On peut passer un tableau javascript (instance) dans les paramètres?
    En gros comment je récupère les objets de la première jsp qui sont des objets javascript dans l'action (servlet)?

  4. #4
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    Ah oui aussi, l'ajax me permettrais de ne pas recharger la page complètement si j'ai bien compris, nan?

    si je fais avec les actions de Struts, la page se rechargera complètement?

    Disons qu'il y a beaucoup de chose sur cette page et que si je pouvais éviter le rechargement complet, ça serait pas mal.

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Oui, usuellement, avec Struts, la page se rechargera complètement.
    Ce n'est pas un problème lié à Struts d'ailleurs, c'est le fonctionnement normal avec une soumission de <form>

    Avec Ajax, on ne recharge que certaines parties de la page, mais c'est un peu plus compliqué...

    Maintenant, dans le principe, Struts sait très bien gérer cette problématique, je ne vois pas trop où est ton problème.
    Le javascript que tu utilises se base bien sur les champs du formulaire et rien n'interdit de modifier les valeurs de ces champs.
    Donc, quand le formulaire sera soumis, la requête http inclura les champs.

    Tu utilises quelle bibliothèque graphique et quel objet graphique pour le tableau ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    J'utilise:
    -dojo pour la librairie
    -> dojox.Grid pour le tableau

    J'ai deux tableau sur la page.
    celui des campagnes et celui des articles.
    Quand je clique sur une ligne du tableau des campagnes, je met à jour le second tableau avec de l'ajax (ça, ça marche).

    quand j'ajoute un article dans le tableau des articles, si je recharge la page, mon tableau des articles va disparaitre, revenir comme quand je charge la page la toute première fois et là y'a pas encore de tableau des articles(puisqu'on attend un clique sur une campagne).

    Sinon, j'ai pas de 'form'
    J'appelle la seconde jsp avec un GET. Est-ce que je peux passer un tableau javascript dans les paramètre de l'url? Parce qu'il faut bien que j'ai l'objet dans la seconde jsp (ou l'action struts selon le choix).

    J'ai fais un petit test:
    j'envoi une variable 'var' dans la requête

    var url = "addArticle.jsp?codeArticle=" ... "&variable="+var;
    xhr.open("GET", url, true);


    Je la modifie dans la seconde jsp(addArticle.jsp) et quand je retourne dans la première jsp (celle qui appelle addArticle.jsp) elle n'a pas gardée la nouvelle valeur.

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    C'est dommage, en utilisant struts, tu aurais pu utiliser struts-layout qui fourni un composant pour ce genre de tableau (<layout:datagrid>)

    Pour l'ajax, tu appelles un contrôleur qui renvoie un objet (xml ou texte) qu'il faut évidemment traiter.
    Tu l'obtiens par httpXmlRequest.responseText (pour du texte) ou httpXmlRequest.responseXML (pour du xml)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    Je dois pas comprendre grand chose car je ne vois pas en quoi ça m'aide de savoir ça...
    L'objet (xml ou texte) qu'il faudrait que je traite, retourne quoi?
    ça renvoit le code HTML de la page?
    ça renvoit des variables, des objets exploitables dans la jsp appelante?
    Comment ça s'utilise?

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par troussepoil Voir le message
    L'objet (xml ou texte) qu'il faudrait que je traite, retourne quoi?
    un objet xml ou du texte...
    Citation Envoyé par troussepoil Voir le message
    ça renvoit le code HTML de la page?
    non
    Citation Envoyé par troussepoil Voir le message
    ça renvoit des variables, des objets exploitables dans la jsp appelante?
    oui
    Citation Envoyé par troussepoil Voir le message
    Comment ça s'utilise?
    http://developer.mozilla.org/fr/AJAX/Premiers_pas

    Je te laisse découvrir
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre du Club
    Inscrit en
    Juin 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    ok, je te remercie pour ton aide, je vais étudier ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VBA, perte de valeur d'une variable aprés avoir activé une autre feuille
    Par mikeactuaire dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/07/2011, 07h13
  2. Réponses: 2
    Dernier message: 04/04/2011, 09h27
  3. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  4. Mise à jour d'une variable après choix dans une combobox
    Par ~Brouette~ dans le forum Langage
    Réponses: 1
    Dernier message: 21/12/2007, 11h09
  5. Réponses: 6
    Dernier message: 18/04/2007, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo