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?

Foi útil?

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.

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