Rendering della pagina completa e non & # 8220; progressivamente & # 8221; (usando puntoni 2 / tessere)

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

  •  22-07-2019
  •  | 
  •  

Domanda

C'è un modo per ottenere struts 2 (usando i riquadri) per costruire l'intera pagina prima di inviarla al browser? Non voglio che la pagina sia costruita "progressivamente" nel browser una parte alla volta.

Il problema principale che sto cercando di risolvere è che Internet Explorer 7 lampeggia / lampeggia la pagina anche se solo una parte del contenuto cambia (firefox lo fa in modo molto più fluido).

In modo che se ho una pagina con:

Intestazione

alcuni contenuti

Piè di pagina

E il " alcuni contenuti " l'area cambia solo tra i caricamenti di pagina, la parte FOOTER lampeggia ancora lo sfondo bianco prima di riempirlo con il colore di sfondo del piè di pagina. Ho pensato che forse ottenendo puntoni per inviare la pagina completa si sarebbe caricato abbastanza velocemente da eliminare il "lampeggiamento". Ora FOOTER proviene dal server un po 'più tardi rispetto alle parti precedenti e quindi lampeggia (in Internet Explorer, Firefox visualizza la pagina senza problemi).

NB: questo è un requisito importante per il sito e l'utilizzo di ajax per caricare il contenuto intermedio è fuori (come lo sono i frame o altri "hack"). Il sito è costruito usando CSS e non un layout di tabella, forse dovrò usare un layout di tabella per farlo funzionare ...

Informazioni sull'uso del parametro flush tiles: L'ho provato e non funziona come ho bisogno. Avrei bisogno di un parametro flush per l'intera pagina. Ho provato la normale direttiva jsp page " autoFlush = false " ma non ha funzionato. Ho impostato questa direttiva sulla mia pagina principale del modello (e non nei riquadri).

Ecco un esempio dal modello principale, che utilizza modelli di intestazione, corpo e piè di pagina. Con Thread.sleep () ho aggiunto che il problema è facile da individuare. Il piè di pagina viene visualizzato 2 secondi dopo il resto della pagina.

  <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>

UPDATE

Grazie per i commenti. Il requisito è in realtà quasi ragionevole in quanto questa non è una normale pagina Web, pensa incorporata.

Ma a quanto pare non c'è modo di configurare IE per iniziare il rendering dopo un certo ritardo (come Firefox ha un ritardo configurabile di circa 100 ms)?

Ho provato a intercettare TilesResult ma il metodo doExecute viene eseguito prima che l'intero contenuto sia apparentemente valutato, quindi il metodo è già uscito prima che jsp venga valutato (il mio test Thread.sleep ()). Mi chiedevo come avrei potuto eseguire il rendering dell'intera risposta a una stringa e quindi inviarla tutta in una volta al browser.

So che questo non è infallibile e ritardi di rete, ecc. possono influire su questo, ma se potessi ottenere la risposta all'output tutto in una volta e magari usare un layout basato su tabella (IE potrebbe renderizzare la tabella solo dopo la chiusura della tabella ) potrebbe funzionare ragionevolmente.

Oppure prova a passare a Firefox o forse dimentica tutto di questo piccolo problema tecnico ...

AGGIORNAMENTO 2

Questo ha iniziato a infastidirmi, quindi ho fatto alcune indagini. Se avessi una semplice pagina jsp (senza riquadri) il buffering funzionerà (con l'attributo buffer), quindi se avessi il mio Thread.sleep () lì l'intera pagina verrà visualizzata dopo due secondi se la dimensione della pagina fosse inferiore alla dimensione del buffer. Ma se avessi usato i riquadri nella pagina (come nell'esempio sopra) non avrei potuto ottenere il rendering della pagina allo stesso tempo (ho anche incluso la direttiva della pagina in tutti i miei modelli di piastrelle / "componenti", nessun aiuto) . Quindi le piastrelle probabilmente scaricano la risposta da qualche parte?

Inoltre, le "tessere problematiche" era la mia parte del corpo, che conteneva un puntone: etichetta del modulo. L'ho sostituito con un normale tag form e ha funzionato come volevo ...

AGGIORNAMENTO 3

Ok, nessuno sembra conoscere il funzionamento interno delle tessere o dei tag puntoni ... Nessun grosso problema in quanto si tratta di un caso e di un requisito molto specifici. Ho risolto il problema usando apache come proxy davanti all'applicazione e usando le opzioni di configurazione proxy di apache per specificare un buffer di grandi dimensioni. Lo segnerò come risposta.

È stato utile?

Soluzione

Puoi usare " flush " attributo sui componenti delle piastrelle?

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

Inoltre, se il buffer di output diventa troppo grande, si scaricherà comunque. Prova ad aumentare la dimensione del buffer?

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

Altri suggerimenti

Se lo desideri, puoi inviare tutti i dati di pagina contemporaneamente alla fine del server (e molti framework lo fanno comunque per comodità) ma la realtà della rete è che non arriveranno tutti in una volta e il browser li renderà come arrivano i pacchetti. E questa è una buona cosa per la reattività, anche se * esteticamente desideri che la pagina venga visualizzata tutta in una volta.

È possibile ridurre il ritardo il più possibile semplificando il markup e utilizzando la compressione deflazione per ridurre le dimensioni del carico utile, e in generale è una cosa utile. Inoltre puoi assicurarti di non colpire un Flash di contenuti non stilati. Ma non puoi controllare quando il browser sceglie di eseguire il rendering, a meno di fare tutto in JavaScript con tutti gli aspetti negativi che comporta (e anche in questo caso, il browser potrebbe ridisegnare lentamente).

(* - o il tuo cliente / capo, se è questo che ha elaborato questo "requisito importante" che il tuo sito funziona in qualche modo in modo diverso rispetto a qualsiasi altra pagina del web.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top