HF Servlets e JSP: Questão 1 - Cap 5

4 respostas
mjohnatha

Olá pessoal, gostaria que me tirassem uma dúvida.
A questão 1 do capítulo 5 do Head First Servlets e JSP diz o seguinte:

Usando um RequestDispatcher, o uso de qual dos métodos pode nos levar a uma IllegalStateException:

A - read
B - flush
C - write
D - getOutputStream
E - getResourceAsStream

Eu marquei a letra B; porém, de acordo com o livro, a letra C também está certa.
Imagino que seja porque não é permitido que se chame o write após a resposta ter sido enviada (pelo flush).
Alguém pode me confirmar isso?
Obrigado.

4 Respostas

visola

Desculpe mas não entendi direito a pergunta.
Você quer saber antes ou depois de usar um RequestDispatcher?
Ou depois de ter chamado quais métodos não pode mais usar um RequestDispatcher?

Geralmente, a exceção IllegalStateException é gerada quando a resposta já foi enviada para o cliente e você tenta fazer algo que irá alterá-la. No caso, tanto o flush quanto o write alterariam o resultado da resposta.

Não sei se ajudou muito maaaas…

mjohnatha

O que queria saber é o motivo pelo qual a opção C também está correta.
A situação que conseguir imaginar que o write causaria uma IllegalStateException seria quando ele fosse chamado após a resposta ser enviada, ou seja, após o flush.
Isso tá certo, ou é outro motivo que faz com que o write cause a exceção?

visola

Na verdade você pode chamar o write depois do flush, contanto que a resposta ainda não tenha sido finalizada.

Se você redirecionar o usuário para outra página por exemplo, através do sendRedirect, a resposta HTTP já está fechada e não faz sentido você escrever mais nada.

Mas em alguns casos específicos como em aplicações que usam Comet por exemplo, você vai intercalar várias chamadas de write e flush, porque o write escreve no buffer enquanto o flush envia os dados efetivamente para o browser.

Respondendo a sua pergunta, o write só vai jogar um IllegalStateException quando a conexão já estiver fechada (por timeout ou algum problema na rede por exemplo) ou quando não fizer sentido você continuar enviado dados para o cliente, como o que acontece após um sendRedirect ou sendError.

Mas como a pergunta é: “(…) em que caso PODE NOS LEVAR à …”, então a resposta deve incluir o write também já que após um RequestDispatcher ou antes de dar o forward, a conexão com o usuário pode já ter sido finalizada.

mjohnatha

É, acho que entendi.
Pois a questão pergunta em que casos essa exceção é lançada quando se usa um RequestDispatcher e, nesse caso, quando se usam os métodos forward ou include. Se o include não é cobrado no exame, a questão resume-se ao forward e, com o write não podendo ser escrito, por exemplo, após o flush, porém antes do forward, leva à IllegalStateException.

Obrigado.

Criado 17 de fevereiro de 2011
Ultima resposta 17 de fev. de 2011
Respostas 4
Participantes 2