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 :

Renvoyer page HTML + structure JSON dans la même réponse HTTP


Sujet :

Servlets/JSP Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Renvoyer page HTML + structure JSON dans la même réponse HTTP
    Bonjour,

    Je travaille actuellement sur une application Web sous Tomcat qui doit effectuer un gros traitement côté serveur (plusieurs secondes) et renvoyer au client une liste de résultats (valeurs numériques au format JSON) et une page HTML de reporting.

    Je souhaiterai renvoyer dans la même réponse HTTP à la fois la page Web et la structure JSON de résultat. Mais comment faire sachant qu'on peut mettre qu'un seul content-type ('text/html' ou bien 'application/json' mais pas les 2 en même temps)?

    J'ai pensé à faire 2 requêtes successives (la 1ère pour récupérer le contenu JSON et la 2ème pour la page web) mais ce n'est pas acceptable en terme de perf car la génération de la page Web et la structure JSON sur le serveur sont complètement corrélées l'une à l'autre et je ne peux pas construire la page web sans construire la structure JSON ni inversement... Bref 2 requêtes = 2 x 10s!

    Je suis un peu dans une impasse. Quelqu'un aurait une idée?

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le plus basiquement, je mettrais ceci dans la réponse au milieu du html:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <script>
    var jsonResponse = ............
    </script>

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse.
    Le problème c'est que j'ai la contrainte d'utiliser 2 clients différents: un client web et un client Java Swing. Pour le client web ta solution marche bien mais pour le client Swing je vais devoir parser le HTML pour extraire la bonne balise <script> qui contient le JSON (sachant qu'il y a d'autres balises <script> dans la page HTML). Du coup c'est pas top...

    Il n'existe pas quelque chose de plus adapté?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Pourquoi ne pas utiliser une requête ajax sur onload de la page ?
    C'est la démarche standard pour ce genre de chose...
    La demande d'affichage de la page prend peu de temps, et à l'affichage elle lance l'appel à la génération des données qui peut prendre du temps.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    La demande d'affichage de la page prend peu de temps, et à l'affichage elle lance l'appel à la génération des données qui peut prendre du temps.
    Ba non, justement moi ma page HTML de reporting prend du temps, la génération sur le serveur met environ 10s.
    Je me suis peut être mal exprimé, voici un exemple très simpliste de ce que je cherche à récupérer:

    résultat JSON
    {
    "result step 1" : 10,
    "result step 2" : 20,
    "result step 3" : 30,
    "final result" : 40,
    }

    Page html de reporting:
    <html>
    <bobdy>
    <p>Le résultat intermédiaire 1 est 10</p>
    <p>Le résultat intermédiaire 2 est 20</p>
    <p>Le résultat intermédiaire 3 est 30</p>
    <p>Le résultat final est 40</p>
    </body>
    </html>

    Comme tu peux le voir, la réponse JSON et la page HTML de reporting ne peuvent pas être dissociées parce qu'elles sont générées en même temps.

    Concrètement, j'ai une page "home.html" qui contient un bouton "Launch Computation".
    • Lorsque je clique sur "Launch Computation", ma requête est envoyée au serveur qui doit me retourner le résultat du calcul au format JSON + un reporting HTML.

    • J'analyse la réponse HTTP pour lire le JSON et j'affiche en dessous du bouton un paragraphe "Final result is 40" et juste à côté un lien "View Report"

    • Lorsqu'on clique sur "View Report", je ne veux surtout pas refaire une requête serveur qui va prendre à nouveau 10s pour renvoyer le même résultat. Je veux juste afficher le contenu HTML que j'ai obtenu lors du 1er appel ("Launch Computation") dans une nouvelle page.



    Est-ce qu'il y a moyen de faire ça sachant que j'ai aussi un client en Swing qui a lui aussi un bouton "Launch Computation", qui se comporte comme ma page "home.html" et qui lance le browser par défaut lorsqu'on clique sur "View Report"?

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le contenu de ta page HTML pouvant être obtenu à partir du json, le mieux est de faire un HTML vide que tu remplis avec du ajax, comme suggéré.
    Edit: pas tout vu.

    Dans ce cas, pourquoi tu ne stocke simplement pas le résultat pour pouvoir le retourner plus tard, en le mettant dans un cache coté serveur?

  7. #7
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Salut,

    Sinon tu peux générer ton report HTML dans ton déploiement Tomcat et simplement partager le lien sur ton bouton "View report".

    De cette manière tu fais le calcul qu'une seule fois lors de ta première requête et en plus tu pourras toujours y accéder plus tard si l'envie t'en prends.

    Cdt.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Je ne vois pas trop le problème, ajax est bien fait pour ça...
    L'idée est une requête ajax qui renvoie un contenu json. Ce contenu, rien ne t'empêche de stocker le résultat de ton traitement lourd dans une variable de scope session ou application pour ne pas avoir à le refaire systématiquement. Derrière la requête ajax, tu as une servlet, elle peut switcher la génération et renvoyer le précédent calcul.
    Ensuite, au retour de ta requête ajax, tu construis les données à afficher dans la zone de ta page qui va bien et voilà...
    En gros, ta page ressemblerait à ceci
    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
     
    <html>
    <head>
    <script>
    function appelAjax(...)
    {
              $.ajax({
                url: WEB_ROOT + "/outputWithTitle?source=" + outputWithTitleSource + "&key=" + escape(outputWithTitleKey),
                async: true,
                cache: false,
                success:function(text) {
                    processAjaxResult(text);
                }
            });
    }
     
    function processAjaxResult(data)
    {
       // mise en forme de "data"
     
        $("#targetData1").html( "le contenu html à mettre" );
    }
    </script>
    </head>
     
    <body onload="appelAjax()">
    bla bla bla
     
    <div id="targetData1"></div>
    <div id="targetData2"></div>
    ...
    </body>
     
    </html>
    Ce n'est pas clair ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [HTML] un lien dans la même page
    Par hamta dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 17/07/2008, 08h20
  2. lien (page html) s'ouvrant dans la même fenêtre
    Par hicham_alaoui1 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/09/2007, 19h22
  3. [XSL~FO] 2 Pages de garde différents dans un même document
    Par Maximus32 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 02/03/2007, 10h07
  4. Détecter qu'une page HTML est ouverte dans une frame
    Par Pigoulou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/01/2006, 14h07
  5. Page html et applet dans un fichier jar
    Par joy5 dans le forum Applets
    Réponses: 18
    Dernier message: 05/10/2005, 13h59

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