Processamento de página completa e não “progressivamente” (usando struts 2 / telhas)

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

  •  22-07-2019
  •  | 
  •  

Pergunta

Existe uma maneira de obter struts 2 (usando telhas) para construir toda a página antes de enviá-lo para o navegador? Eu não quero a página para ser construído "progressivamente" no navegador uma parte de cada vez.

O principal problema que estou tentando resolver é que o Internet Explorer 7 pisca / pisca na página mesmo que apenas algumas das mudanças de conteúdo (firefox faz isso muito mais suave).

Assim que se eu tiver uma página com:

Cabeçalho

algum conteúdo

FOOTER

E a área "algum conteúdo" só muda entre cargas de página, a parte FOOTER ainda pisca o fundo branco antes de preenchê-lo com a cor do rodapé fundo. Eu pensei que talvez por ficar suportes para enviar a página completa que iria carregar rápido o suficiente para eliminar a "piscar". Agora o rodapé vem do servidor um pouco mais tarde do que as partes antes dele e assim ele pisca (no Internet Explorer, o Firefox exibe a página sem problemas).

Nota: este é um requisito importante para o site, e usando ajax para carregar o conteúdo de meia está fora (como são quadros ou outros "hacks"). O site é construído usando CSS e não um layout de tabela, talvez eu vou ter que usar um layout de tabela para fazê-lo funcionar ...

Sobre o uso de telhas parâmetro nivelado: Eu tentei isso e não funciona como eu preciso. Eu precisaria de um flush-parâmetro para toda a página. Eu tentei a directiva de página normal jsp "AutoFlush = false", mas não deu certo. I definir esta diretiva na minha página principal modelo (e não nos azulejos).

Aqui está um exemplo do modelo principal, que usa cabeçalho, corpo e rodapé modelos. Com a Thread.sleep () Eu adicionei o problema é fácil de detectar. O rodapé torna 2 segundos mais tarde do que o resto da página.

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

Atualização

Obrigado pelos comentários. O requisito é realmente quase razoável, pois isso não é uma página web normal, acho incorporado.

Mas, aparentemente, não há nenhuma maneira de configurar o IE para começar a renderizar após algum atraso (como o Firefox tem um atraso configurável de alguns 100ms)?

Eu tentei interceptar a TilesResult mas o método doExecute é executado antes de todo o conteúdo é aparentemente avaliada, de modo que o método já foi encerrado antes do jsp é avaliada (meu Thread.sleep () teste). Eu queria saber como eu poderia tornar a resposta inteira para uma string e, em seguida, saída que de uma só vez para o navegador.

Eu sei que este não é infalível e atrasos na rede etc podem fator nessa, mas se eu pudesse obter a resposta para a saída de uma só vez e talvez usar um layout baseado em tabelas (IE possivelmente torna a mesa somente após o fechamento de mesa ) isso poderia funcionar razoavelmente.

Ou tente obter este mudou para firefox ou talvez esquecer tudo sobre esta pequena falha ...

UPDATE 2

Isso começou a me incomodar então eu fiz alguma investigação. Se eu tivesse uma página jsp simples (sem telhas) as obras de tamponamento (com o atributo de buffer), de modo que se eu tivesse minha Thread.sleep () há toda a página processada após dois segundos, se o tamanho da página estava abaixo do tamanho do buffer. Mas se eu usasse as telhas na página (como no exemplo acima) eu não poderia começar a página para processar ao mesmo tempo (eu mesmo incluído na directiva página em todas as telhas-templates / "componentes" meus, não ajuda). Então telhas provavelmente libera a algum lugar resposta?

Além disso, as "telhas problemáticos" era o meu corpo-parte, que continha uma suportes: tag form. Eu substituí-lo com um formulário-tag normal e ele funcionou como eu queria ...

Atualização 3

Ok, ninguém parece saber o funcionamento interno de telhas ou suportes marcas ... Sem grande problema como este é um caso muito específico e exigência. Eu trabalhei em torno dele usando o Apache como um proxt na frente do aplicativo, e usar as opções de configuração de proxy do Apache para especificar um buffer grande. Vou marcar este como respondeu.

Foi útil?

Solução

Você pode usar o atributo "nivelada" dos componentes telhas?

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

Além disso, se o buffer de saída fica muito grande, ele irá liberar qualquer maneira. Tente aumentar o tamanho do buffer?

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

Outras dicas

Você pode enviar dados de páginas de uma só vez no final servidor se você gosta (e muitas estruturas de fazer isso de qualquer maneira por conveniência), mas a realidade do trabalho em rede é que ele não vai todos chegam ao mesmo tempo e o navegador irá torná-lo como os pacotes chegam. E isso é uma coisa boa para a capacidade de resposta, mesmo se você * esteticamente gostaria que a página para exibir todos de uma vez.

Você pode reduzir o atraso, tanto quanto possível, simplificando marcação e usando compressão deflate para manter o tamanho para baixo carga útil, e isso é uma coisa que vale a pena fazer em geral. Além disso, você pode ter certeza que você não está batendo um flash de sem estilo de conteúdo. Mas você não pode controlar quando os escolhe navegador para renderizar, curta de fazer tudo em JavaScript com todas as desvantagens que implica (e mesmo assim, o navegador pode redesenhar lentamente).

(* -. Ou seu cliente / patrão, se é isso que surgiu com esta "requisito importante" que o seu site de alguma forma trabalhar de forma diferente a cada outra página na web)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top