setContentLength está definido como alto
-
26-12-2019 - |
Pergunta
Quando o setContentLength
é usado para definir o comprimento da resposta com um tamanho maior que o tamanho real, por que o contêiner não calcula automaticamente o comprimento?
por exemplo,
String s = "hello";
byte[] b = s.getBytes();
response.setContentLength(100);
response.getOutputStream().write(b);
response.flush();
Quando eu acesso o servlet, leva cerca de meio minuto para carregar a página, isso é por causa do comprimento do cabeçalho do conteúdo..?
Qual é a necessidade de tal método?por que o contêiner não pode calcular o comprimento da resposta sozinho?
Solução
Se você deseja retornar conteúdos grandes, muitas vezes não é prático carregar a resposta completa e enviá-la de uma vez, mas sim carregá-la e enviá-la em pedaços.Como o comprimento é enviado como parte do início da resposta, não há como o contêiner alterá-lo posteriormente.
Neste caso você informa ao container que sua resposta tem 100 bytes, você envia os primeiros 5 bytes (o que aciona o cabeçalho "Content-Length:100" também serão enviados), então agora o destinatário esperará outros 95 bytes.
Agora, por outro lado, digamos que seu conteúdo tenha 10 GB, você não gostaria de carregar tudo isso primeiro na memória apenas para que o contêiner calculasse o tamanho.