Rendu de la page complète et non pas "progressivement" (utilisation de struts 2 / tiles)

StackOverflow https://stackoverflow.com/questions/438954

  •  22-07-2019
  •  | 
  •  

Question

Existe-t-il un moyen d'utiliser struts 2 (en utilisant des tuiles) pour créer la page entière avant de l'envoyer au navigateur? Je ne souhaite pas que la page soit générée " progressivement " dans le navigateur, une partie à la fois.

Le principal problème que j'essaie de résoudre est qu'Internet Explorer 7 clignote / clignote la page même si seulement une partie du contenu est modifiée (Firefox le fait beaucoup plus facilement).

Donc, si j'ai une page avec:

HEADER

du contenu

Pied de page

Et le "contenu" " zone change uniquement entre les chargements de page, la partie FOOTER continue à faire clignoter l’arrière-plan blanc avant de la remplir avec la couleur d’arrière-plan du pied de page. J'ai pensé que peut-être qu'en faisant en sorte que struts envoie la page complète, le chargement serait assez rapide pour éliminer le "clignotement". Maintenant, le pied vient du serveur un peu plus tard que les parties précédentes et il clignote (dans Internet Explorer, Firefox affiche la page en douceur).

NB: il s’agit d’une exigence importante pour le site. Il est inutile d’utiliser ajax pour charger le contenu intermédiaire (tout comme les cadres ou d’autres "hacks"). Le site est construit en CSS et non pas en tableau. Peut-être que je devrai utiliser un tableau pour que cela fonctionne ...

À propos de l’utilisation du paramètre de vidage des tuiles J'ai essayé ça et ça ne marche pas comme j'ai besoin. J'aurais besoin d'un paramètre flush pour toute la page. J'ai essayé la directive de page jsp normale " autoFlush = false " mais ça n'a pas marché. Je place cette directive sur ma page de modèle principale (et non dans les carreaux).

Voici un exemple tiré du modèle principal, qui utilise des modèles d'en-tête, de corps et de pied de page. Avec le Thread.sleep (), j'ai ajouté que le problème est facile à détecter. Le pied de page s'affiche 2 secondes plus tard que le reste de la page.

  <body>
  <div id="container">
  <t:insertAttribute name="header" flush="false" />

  <div id="content"><t:insertAttribute name="body" flush="false"/></div>

  <div class="clear"></div>
  <% Thread.sleep(2000); %>
  <t:insertAttribute name="footer" flush="false" />
  </div>
  </body>

MISE À JOUR

Merci pour les commentaires. L’exigence est en fait presque raisonnable car il ne s’agit pas d’une page Web normale, pensez intégrée.

Mais apparemment, il n’ya aucun moyen de configurer IE pour commencer le rendu après un certain délai (comme Firefox a un délai configurable d’environ 100 ms)?

J'ai essayé d'intercepter TilesResult mais la méthode doExecute est exécutée avant que le contenu entier ne soit apparemment évalué. Elle est donc déjà terminée avant que le fichier jsp ne soit évalué (mon test Thread.sleep ()). Je me demandais comment je pouvais restituer toute la réponse en chaîne, puis la transmettre en une seule fois au navigateur.

Je sais que ce n'est pas infaillible et que les retards de réseau, etc. peuvent en tenir compte, mais si je pouvais obtenir la réponse en sortie en une seule fois et éventuellement utiliser une présentation basée sur un tableau (IE ne rend éventuellement le tableau qu'après sa fermeture) ) cela pourrait fonctionner raisonnablement.

Ou alors essayez de passer à Firefox ou d’oublier ce petit problème ...

MISE À JOUR 2

Cela a commencé à me déranger alors j'ai fait une enquête. Si j'avais une page simple jsp (pas de mosaïque), la mise en mémoire tampon fonctionne (avec l'attribut buffer), de sorte que si j'avais Thread.sleep (), la page entière serait rendue après deux secondes si la taille de la page était inférieure à la taille de la mémoire tampon. Mais si j'utilisais des tuiles dans la page (comme dans l'exemple ci-dessus), je ne pourrais pas obtenir le rendu de la page en même temps (j'ai même inclus la directive de page dans tous mes carrelages-modèles / "composants", aucune aide). . Donc, les tuiles jettent probablement la réponse quelque part?

En outre, les "tuiles problématiques" était ma partie du corps, qui contenait une balise struts: form. Je l'ai remplacé par un formulaire-tag normal et cela a fonctionné comme je le voulais ...

MISE À JOUR 3

D'accord, personne ne semble connaître le fonctionnement interne des balises de tuiles ou d'entretoises ... Pas de gros problème car il s'agit d'un cas et d'une exigence très spécifiques. J'ai résolu le problème en utilisant apache comme proxt devant l'application et en utilisant les options de configuration du proxy d'apache pour spécifier un tampon de grande taille. Je marquerai ceci comme une réponse.

Était-ce utile?

La solution

Pouvez-vous utiliser le "flush"? attribuer sur les composants de tuiles?

<tiles:insertAttribute name="body" flush="false"/>

En outre, si le tampon de sortie devient trop volumineux, il se videra malgré tout. Essayez d’augmenter la taille de la mémoire tampon?

<%@ page language="java" buffer="500kb" autoFlush="false" %>

Autres conseils

Vous pouvez envoyer des données de page en une seule fois côté serveur si vous le souhaitez (et de nombreux frameworks le font quand même pour des raisons de commodité), mais la réalité de la mise en réseau est que cela n'arrivera pas en même temps et le navigateur le rendra comme les paquets arrivent. Et c’est une bonne chose pour la réactivité, même si * vous voudriez esthétiquement que la page s’affiche en une fois.

Vous pouvez réduire autant que possible le décalage en simplifiant le balisage et en utilisant la compression deflate pour réduire la taille de la charge utile. C’est une bonne chose à faire en général. De plus, vous pouvez vous assurer que vous ne frappez pas un contenu flash sans style. Mais vous ne pouvez pas contrôler quand le navigateur choisit de générer le rendu, à moins de tout faire en JavaScript avec tous les inconvénients que cela comporte (et même dans ce cas, le navigateur pourrait se redessiner lentement).

(* - ou votre client / responsable, si c'est bien celui qui a créé cette "exigence importante" que votre site fonctionne différemment de toutes les autres pages du Web.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top