You are on page 1of 14

solicitao

e resposta

Espere um momento ... Eu pensei que no amos enviar HTML de um servlet, porque horrvel format10 para o stream de sada ...

Usando a resposta para o I/O


Tudo bem, deveramos estar usando JSPs em vez de enviar HTML de volta no stream de sada a partir de um servlet. Formatar um HTML para enfi-Io no mtodo prntlnO do stream de sada penoso. Mas isso no significa que voc nunca ter que trabalhar com um stream de sada do seu servlet Por que? 1) Seu provedor de hospedagem pode no suportar JSPs. Existem vrios servidores e containers mais antigos por a que suportam servlets, mas no JSPs, ento, voc fica "preso". Voc no tem a opo de usar JSPs por algum outro motivo, como um gerente chato que no permite usar JSPs porque em 1998 seu cunhado lhe dissera que os JSPs eram ruins. Quem disse que HTML era a nica coisa que voc poderia enviar de volta em uma resposta? Voc pode devolver outras coisas em vez de HTML ao cliente. Algo para o qual um stream de sada faa sentido.

2)

3)

voc est aqui"

127

enviando bytes na resposta

ItMagit1eque voc queira mviar UtMJAR para o cliet1te...


Digamos que voc tenha criado uma pgina para downloads onde o cliente pode baixar cdigos a partir de arquivos JAR. Em vez de enviar de volta uma pgina HTML, a resposta contm os bytes representando o JAR. Voc l os bytes dos arquivos JAR e os escreve no stream de sada dos dados da resposta.

Diane est desesperada para fazer o download do J AR com um cdigo do livro que ela est usando para aprender servlets e JSPs. Ela acessa o site do livro e c1ica no link "cdigo jar", que se refere a um servlet chamado "Code.do".

envia uma solicitao HTTP para o servidor com o nome do servlet requisitado ("Code.do").

o browser

o Container envia a solicitao para o servlet CodeReturn (mapeado para o nome "Code.do" no DD) para processamento.

o J AR inicia

o download na mquina do cliente. Diane est satisfeita.

o servlet os bytes resposta os bytes


A resposta HTTP contm agora oS bytes que representam o J AR.

CodeReturn recebe para o J AR, recebe da um stream de sada e copia representando o J AR

resposta

128 captulo 4

solicitao

e resposta

o cdigo servlet
Ii
um monte public class

que faz o dowt1load do JAR


aqui

de imports

CodeReturn

extends

HttpServlet

public

void

doGet(HttpServletRequest

request, throws

HttpServletResponse IOException,

response)

ServletException

~
response. setContentType ("application/jarU)
;

IJ:S 3Vfl'fll>\aS ~ve a/l'tJwsel' I'fccl'Jt.e5Q 3Vf is+o e ClII>\

IA;e'" ClII>\Ji..-r;!ilAJ 1'J-ra<1l; Vf"(, J I114Q rr 1Vl.l-; '" JN


Ct:Jl'Jft'iClNI.JMSti +ib{J Je C<1lI'J#tJJe. pP.N. ~F QppltcU.-hl1{jal'

ServletContext InputStream is

ctx = getServletContext();

r, n

ctx.getResourceAsStream("/bookCode.jarU);

It. ~
int read = O; byte[] bytes = new byte[1024];

.s..S+e. .lI'; apfl'JlJ.S FI Je-lI>\e VII>\

-r'

s+reall>\ Je el'J+l'aJIJ. pQrlJ.

(J

I'f!CClI'S ct.all>\aJa bQ/<:CI,lJe,jO:I'


OutputStream os = response.getoutputstream();)

os.write(bytes, = while read os. flush(); os. close ();

is. read read); != 0, (bytes


a PfAl'#
S4~el1#

-1)

,J >
bj#s

1.s+a

fVI1Jfi.lI>\e~aIJ

1I>\4S apel1t1.s ClII>\

xl

tJ S{"II>IpI<!s!

I
tJ

lJaJa espectal)

l tiS

J JI}Je

e 4S escreve

PfU'Q

s+l'efi.J'l, de sa;Ju. ~(le l1:s Cl'Jse.5V{"'II1tlS tJtje.+tl resps+a. de

No ex'lst~m

f:

YerguntLls Idl9tlS

Onde estava localizado o arquivo JAR "bookCode.jar"? Em outras palavras, onde o mtodo getResourceAsStreamO PROCURA para localizar o arquivo? Como voc lida com o caminho?

I\:

O getResourceAsStreamO requer que voc inicie com uma barra ("t'), que representa a raiz da sua aplicao. J que a aplicao foi chamada de JarDownload, ento a estrutura de diretrios semelhante figura. O diretrio JarDownload est dentro de webapps (o diretrio-pai para todos os outros diretrios da aplicao), e dentro do JarDownload ns colocamos o WEB-INF e o cdigo JAR em si. Assim, o arquivo "bookCode.jar" est situado no nvel raiz da aplicao JarDownload. (No se preocupe, ns entraremos em maiores detalhes sobre a estrutura de diretrios de distribuio quando chegarmos no captulo que trata da distribuio.)

web.xml

voc est

129

tipo de contedo

Opa. Qual

problettta COttto tipo do cot1tedo?


;

Voc deve estar surpreso com esta linha:


response.setContentType(~application/jar")

Ou pelo menos deveria. Voc tem que dizer ao browser o que voc est devolvendo, para que ele possajazer a coisa certa: abrir uma aplicao "assistente", como um leitor PDF ou um player de vdeo, criar um HTML, salvar os bytes da resposta como um arquivo de download, etc. E j que voc est a se perguntando, sim, quando ns dizemos tipo do contedo, queremos dizer a mesma coisa que tipo MIME. O tipo do contedo um header HTTP que deve ser includo na resposta HTTP.

Caramba, obrigado Servidor. gentil de sua parte me informar que tipo voc est enviando de volta. Voudeixar o Quicktime player pronto para o vdeo...

D o

Tipos MIME comuns:


text/html application/pdj video/quicktime application/java image/jpeg application/jar appl ication/octet-stream application/x-zip

Servidor/ Container

Voc no precisa memorizar um monte de tipos do contedo. o Voc deve saber o que o setContentTypeO jaz e como us-lo, mas voc no precisa saber nem mesmo os mais comuns tipos de contedo, exceto o text/html. O que voc precisa saber sobre o setContentTypeO geralmente de senso comum ... por exemplo, no ser bom para voc mudar o tipo de contedo DEPOIS de ter escrito o que vai para o stream de sada da resposta. bvio. Isso quer dizer que voc no pode configurar um tipo de contedo, escrever algo e, em seguida, mudar o tipo de contedo e escrever outra coisa. Pense um pouco: como o browser lida com isso? Ele s pode tratar um tipo de COISA da resposta de cada vez.
o

.laxe

Para ter certeza de que tudo junciona bem, o que voc deveria jazer (e em alguns casos um requisito) sempre chamar o setContentTypeO primeiro, ANTES de chamar o mtodo que gera o stream de sada (getWriterO ou getOutputStreamO). Isto garantir que voc no ter conflitos entre o tipo de contedo e o stream de sada de dados.

130

solicitao

e res:po,sta

N.9 eXIstem

ferh'untlS idl9tlS

r:

Por que voc tem que definir o tipo de contedo? Os servidores no podem descobrir do arquivo?

r:

isso a partir da extenso

Espere um segundo ... por que voc precisaria usar um servlet para enviar de volta aquele arquivo JAR, quando voc pode ter o servidor enviando-o como um recurso? Em outras palavras, por que no fazer com que o usurio clique em um link que v para o JAR em vez do servlet? O servidor no pode ser configurado para enviar o JAR diretamente sem sequer PASSAR pelo servlet?

1\:A maioria dos servidores pode, para contedo


esttico. No Apache, por exemplo, voc pode configurar os tipos MIME mapeando a extenso do arquivo (.txt, .jar, etc.) para um tipo de contedo especifico, e ele usar isso para configurar o tipo de contedo no header HTIP. Mas estamos falando sobre o que acontece dentro de um servlet quando NO H nenhum arquivo! voc quem est enviando de volta a resposta; o Container no tem idia do que voc est enviando.

1\: Sim. Boa pergunta.

r:

E com respeito ao ltimo exemplo onde voc l um arquivo JAR? O Container no pode ver que voc est lendo um JAR?

Voc PODERIA configurar o servidor de forma que o usurio dique em um Iink HTML que o leve, digamos, ao arquivo JAR localizado no servidor (assim como qualquer outro recurso esttico, como JPEGs e arquivos de texto), e o servidor simplesmente o enviaria na resposta. Mas ... estamos considerando que voc tenha outras coisas que queira fazer no servlet ANTES de enviar de volta o stream. Voc pode, por exemplo, precisar que a lgica no servlet que defina qual arquivo JAR a enviar. Ou voc pode estar devolvendo bytes que voc esteja criando ali mesmo, na hora. Imagine um sistema em que voc recebe parmetros do input do usurio e os usa para gerar dinamicamente um som que voc devolve. Um som que no existia antes. Ou seja, um arquivo de som que no se encontra em lugar algum no servidor. Voc acaba de cri-Io e agora est enviando-o na resposta. Ento voc est certo, talvez o nosso exemplo de enviar apenas um JAR localizado no servidor seja meio manjado, mas por favor ... use sua imaginao e enfeite-o com tudo aquilo que voc puder adicionar para torn-Io um servlet de verdade. Talvez seja algo to simples como inserir um cdigo no seu servlet que - junto com a devoluo do JAR - escreva alguma informao no banco de dados sobre este usurio em particular. Ou talvez voc tenha que checar para ver se ele est liberado para fazer o download deste JAR, baseado em alguma coisa que voc tenha detectado no banco de dados.

1\: No. Tudo o que fizemos

do servlet foi ler os bytes de um arquivo (por acaso era um arquivo JAR), e escrever de volta esses dados para um stream de sada. O Container no faz idia do que fazamos quando lamos aqueles bytes. Pelo o que ele saiba, ns estvamos lendo a partir de um tipo de informao e escrevendo algo completamente diferente na resposta.

r:

Como eu posso descobrir tipos comuns de contedo?

quais so os

Faa uma busca no Google. Srio. Novos tipos MIME esto sendo adicionados todo o tempo, mas voc pode encontrar facilmente listas na Web. Voc tambm pode dar uma olhada nas suas preferncias do browser por uma lista daqueles que foram configurados para seu browser, e tambm pode checar seus arquivos de configurao. Novamente, voc no precisa se preocupar com isto para o exame e provavelmente no lhe causar muito estresse no mundo real tambm.

1\:

voc est

131

printWriter

e OutputStream

Voc tetM duas opes para sada: caracteres ou bytes


Isto apenas um simples java.io, exceto pela llterface ServletResponse que oferece apenas duas opes de streams para escolher: ServletOutputStream para bytes ou PrintWriter para dados em caracteres.

~ Printwriter
Exemplo:
PrintWri ter wri ter = response

.AnUtmm

writer.'.ff''''p(''sorne
Usado para:

text

and HTML");

Voc DEVE memorizar estes mtodos


Voc tem que saber isso para o exame. E uma armadilha. Repare que para escrever para um ServletOutputStream voc writeO,porm, para escrever para um PrintWriter voc ... printlnO! comum considerar que voc escreve para um escritor, mas no. Se voc j usa o java.io, j passou por isso. Se no, lembre-se: printlnO para um PrintWriter writeO para um ServletOutputStream E no se esquea de que os nomes dos mtodos para obter o stream ou o escritor perdem a primeira palavra, conforme segue:
ServletOutputStream response.getOutputStream()
Pr:intWriter

Exibir dados de texto para um stream de caracteres. Embora voc ainda possa exibir dados em caractere usando o OutputStream, ele que voc utilizar para tratar seus dados em caractere.

~ OutputStream
Exemplo:
ServletOutputStream getOutputStream() outCiiIII(aByteArray) out response.

Usado para: Escrever qualquer


outra coisa!

response.getWriter()

Voc precisa reconhecer nomes FALSOS, como:


er() "\

ream ()

er ()

s.f.es AJj,O exts.f.elPof

Para 5va Ii1{tif'lrla{it:;; 5ef'lI!e+ov.fpv.f.5.frealrl. pua


til

f) fi,i'IWf'i+ef'

PIaverdade e~ac{j.fa

{j

Ov s!i"J t:;f1.1),Wrl.f.et'

+elrl vlrla t'e{et'~ IrlQS(j

Set'lIle+ov.fpv.f.5.ft'ealrl

e de1eja t:;s ct.alYladaspat'a ele.

trpei1tJ.s vJl1. s.frefJ.1Pl e sfJ.fdade "adas v"l.f.a para a c1te~J d

PrI),-ANt't.f.et' (J elYlbe1ejatkdlct<;I1QJ1da lYI.f.ad()sde 4/.f.<;J1:vel Ctlf4j'!S de .f.t'l'J..f.fJ.t' Cl'J.f'ac+eres, as

132

soliCitao

e res.:posta

Voc pode configurar headers de resposta, voc pode adicionar headers de resposta
E voc pode querer saber qual a diferena. Mas pense nisso por um segundo e faa o exerCcio. Correlacione a chamada ao mtodo com o seu comportamento
response. setHeader (ftfoo", ftbar");

Trace uma linha do mtodo HttpResponse para o seu comportamento. Ns fizemos o mais bvio para voc.

Adiciona um novo header e um novo valor na resposta, ou acrescenta um outro valor para um header existente. Um mtodo de convenincia que substitui o valor de um header existente por seu valor integral, ou acrescenta um novo header e um novo valor na resposta. Se um header com este nome j existir na resposta, o valor alterado por este. Ou ento, acrescenta um novo header e um novo valor na resposta.

response.addHeader(ftfoo",

ftbar");

response. setlntHeader

(ftfoo", 42);

Bem fcil quando voc os v todos juntos. Mas para a prova, voc deve memoriz-Ios, pois se na prxima tera-feira o cara no final do corredor perguntar: "Qual o mtodo de resposta que me permite acrescentar um valor para um header existente?", voc possa dizer, sem pestanejar: " o addHeader, e ele possui duas Strings, para nome e valor." Assim mesmo. O setHeaderO e o addHeaderO acrescentaro um header e um valor na resposta, se o header (o primeiro argumento para o mtodo) ainda no estiver l. A diferena entre configurar e adicionar aparece quand o header est l. Nesse caso: setHeaderO sobrescreve o valor existente addHeaderO adiciona um novo valor Quando voc chama o setContentType ("text/html"), voc est configurando um header como se dissesse: setHeader("content-type", "text/html"); Ento, qual a diferena? Nenhuma ... considerando que voc digite corretamente o header "content-type". O mtodo setHeaderO no vai reclamar se voc escrever errado o nome dos headers - ele simplesmente acha que voc est adicionando um outro tipo de header. Porm, algo dar errado l na frente, j que agora voc no configurou corretamente o tipo de contedo da resposta! voc est 133

redrecionando

Mas

algutMas vezes voc tMestMO no quer

lidar COtMa resposta ... Voc pode decidir que algo diferente trate a resposta para a sua solicitao. Voc pode ou redirecionar a solicitao para uma URL completamente diferente, ou despach-Ia para algum outro componente da sua aplicao (geralmente um JSP).

Redirecionando

O browser ... no cliente digita uma URL

A solicitao vai servidor/Container para o

O servlet decide que a solicitao deve ir para uma URL completamente diferente.

e e
O browser recebe a resposta, v o cdigo de status "301" e procura por um header "Location"

/
na

O servlet chama o sendRedirect(aString) resposta e pronto

i i I! :,{y. ..... I ..

A resposta HTTP possui um cdigo de status "301" e um header "Location" contendo uma URL como valor

li

134

solicitao

e resposta

oo

browser faz uma nova solicitao usando a URL que representava o valor do header "Location" na resposta anterior. O usurio pode notar que a URL na barra de endereos do seu browser mudou...

No h nada de exclusivo na solicitao, ainda que ela tenha sido ativada por um redirecionamento

o
O servidor recebe o que consta na URL solicitada. Nada de e?pecial
aqUi

o
Cl

A resposta HTIP igual a qualquer outra resposta ... exceto pelo fato de que ela no vem do local que o cliente ~ digi!ou O browser exibe a nov pgina. O usurio fica maravilhado

Ifr
voc est

135

redirecionamento

do serviet

o redireciotlatltettto
o redirecionamento
if

do Servlet faz o browser trabalhar

deixa o servlet completamente aliviado. Aps perceber que ele no poder desempenhar o trabalho, o servlet simplesmente chama o mtodo sendRedirectQ:
(worksForMe) { trata a solicitao else { response.sendRedirect{ ttp://www.oreilly.com h

Ii

);

I Ir f//t.L
3l1e' vc alieI' 3l1e' ~ ;;1'i)wst:1' lIse piAl'a a slir+#.fia.

., clte"h v

lssa

Usatldo URLs relativas tiOsetldRedirectO


Voc pode usar uma URL relativa como um argumento para o sendRedirectO, em vez de especificar o endereo completo ''http://www ...''. As URLs relativas vm em dois sabores: com ou sem a barra ("/") inicial. Imagine que o cliente digitou primeiramente:
http://www.wickedlysrnart.com/rnyApp/cool/bar.do

f) C"+fJ,IPf!1' sde
chama o sendRedirectO com a URL relati a que NtO inicia com a barra: I Quando sendRedlrect{"foo ao servlet Cha'tadO "b~.dO", ele a solicitao chega stuff.htrnl'); 'I I I
le s.:;llCl+fJ.jilJi
ItJ Ct:iJJ'l/Pt...:;

lJil'lj'Pt:!

~fJrpplca6/~
se ve..c "ie.. lIStAl' tA

ptll'+rt,,,+tI;
" J

blJ,l'l'IJ" f!S+fJ.PIJ,I'+t tia

o header "Location" que ele coloca na res10sta H TP), O Container constri a URL inicial: relativa URL da solicitao completa

IU::I'f!sce,,+aJa

Je

(elIreCisr'dela p
INICIAR

para

http://www.wickedlysrnart.com/rnyApp/cool/foo/ stuff.htrnl

Mas se o argumento com a barra:


sendRedirect

para o sendRedirectO

("/foo/stuff .htrnl");~

fJr

1141'1'1II;" CIl'lf!j
1'11I;1'5

O Container constri a URL completa relativa ao container web em si, em vez de relativa URL original da solicitao. Assim, a nova URL ser:
http://www.wickedlysrnart.com/foo/stuff.htrnl

l'eItJ.+ivlJ. ~

I
JIJ ti.fllca-hV6

"fila" e illI'I Ilpllct!l.-hVf)

WebJ sep4N.J

web "~fJrpp".

136

C81PtlJlo4

solicitao

e resposta

Voc no pode fazer um sendRedirectO depois de escrever a resposta!


Isto provavelmente bvio, mas a LEI e ns estamos apenas ratificando. Se voc procurar o sendRedirectO na APL voc ver que ele envia uma IllegalStateException se voc tentar cham-Io depois "da resposta j ter sido criada". Eles querem dizer com "criada" que a resposta foi enviada. Isso significa que os dados foram enviados para o stream. Na prtica, significa que voc no pode escrever na resposta e depois chamar o sendRedirectO! Mas um professor exigente diria que, tecnicamente, voc pode escrever no fluxo de dados sem que haja oflush, e o sendRedirectO no geraria uma exceo. Mas isto seria algo completamente estpido e, por isso, no vamos tocar no assunto. (Se bem que ... acabamos defalar. ..) No seu servlet, decida, pelo amor de Deus! Ou trate a solicitao, ou faa um sendRedirectO para que OUTRA entidade a trate. (Alis, este papo de "uma vez enviada, j era" tambm se aplica configurao de headers, cookies, cdigos de status, o tipo de contedo e assim por diante ...)

'RL oa uma Str' . . A questo . o zng que E uma rrega um objet' se,!dRedirectO NA-O ssap ara ele um ttO tzpo U'RL Vr o C' a Dtrzng . oce completa ou l' que e uma re -, P Utter trans+orm atzva . S.e o Container '.Jl ar uma U'RL nUma URL I.Z complet. a, e l e manda relativa legalStat E l e Xceptzon O uma embrar que ISTO" que confunde send'Red'zrect/T T'RL errado' . e ! v, nova("htt 'P.//www.oreilly. IL Com '')11 :/
A

o sendRedirecto Carrega um o . String e N bJeto URL' O uma em l , e e carreo:

137

requesf dispatch

o request

dispateh aeottteee no lado do servidor

E esta a grande diferena entre um redirecionamento e um request dispatch - o redirecionamento faz o cliente executar o trabalho, enquanto que o request dispatch faz com que outro componente no servidor execute o trabalho. Ento, lembre-se: redirecionamento = cliente, request dispatch = servidor. Ns falaremos mais sobre o request dispatch mais adiante, porm, estas duas pginas devero dar a voc uma noo dos pontos mais importantes.

o Request

Dispatch

O usurio digita a URL do servlet no seu browser ..

A solicitao vai para o servidor/Container

O servlet decide que a solicitao deve ir para outra parte da aplicao . (neste caso, um JSP)

O browser recebe a resposta normalmente e a entrega ao usurio. . J que a barra de endereos do browser no mudou, o usurio no sabe que foi o JSP que gerou a resposta.

RequestDispatcher view ~ request.getRequestDispatcher(~result.jspn); view.forward(request,response);

O servlet chama

e o JSP cuida da resposta

f
f

r .
I

,t.~,
i

138

solicitao

e res:J)osta

RedirecionatMet1to

X Request Uispateh

Redirecionamento

Oi Kari, aqui o Dan... Eu quero a sua ajuda com um cliente. Vou encaminhar para voc os detalhes de como retornar para ele, mas eu preciso que voc cuide disso agora. Sim. eu SEI que voc tambm tem suas necessidades ... sim, eu SEI como a View importante para o MVC ... no, eu no creio que consiga outro JSP como aquele ... o qu? No entendi? A ligao est ruim . desculpe ... eu no consigo ouvir nada . perdendo pacotes ...

Quando um servlet faz o request dispatch, como se pedssemos que um colega de trabalho cuidasse de um cliente. O colega de trabalho acaba respondendo ao cliente, mas o cliente no se importa, desde que algum o responda. O usurio nunca sabe que outra pessoa assumiu o controle, pois a URL no browser no muda.

Request Dispatch

Quando um servlet faz um redirecionamento, como se pedssemos que o cliente ligasse para outra pessoa. Neste caso, o cliente o browser, e no o usurio. O browser faz a nova chamada em benefcio do usurio, depois do servlet que foi originalmente requisitado dizer: "Desculpe, chame este cara aqui. ../1 O usurio v a nova URL no browser.

voc est

139

reviso do HttpServietResponse

Reviso: HttpServletRespo"se

Voc usa a Resposta para enviar dados de volta para o cliente. Os mtodos mais comuns que voc chamar no objeto response (HttpServletResponse) so o setContentTypeO e O getWriterQ. Tome cuidado - muitos desenvolvedores acreditam que o mtodo seja getPrintWriterO, mas getWriterO. O mtodo getWriterO permite fazer I/O por caractere para criar o HTML (ou algo mais) para o stream. Voc tambm pode usar a resposta para configurar headers, enviar erros e adicionar cookies. No mundo real, voc provavelmente usar um lSP para enviar a maioria das respostas HTML, mas voc ainda poder usar um stream de resposta para enviar dados binrios (como um arquivo lAR, talvez) ao cliente. O mtodo que voc chama na sua resposta para receber um stream binrio getOutputStreamO. O mtodo setContentTypeO diz ao browser como tratar os dados vindos na resposta. Os tipos de contedos mais comuns so "text!html", "application/pdf' e "image/jpeg". Voc no precisa memorizar os tipos de contedos (tambm conhecidos como tipos MIME). Voc pode configurar headers de resposta usando o addHeaderO ou o setHeaderO. A diferena depende de o headerj fazer palie da resposta. Se j fizer, o setHeaderO ir substituir o valor, mas o addHeader acrescentar um valor adicional resposta existente. Se o header ainda no fizer parte da resposta, ento o setHeaderO e o addHeaderO comportam-se exatamente do mesmo modo. Se voc no quiser responder a uma solicitao, voc pode redirecionar a solicitao para outra URL. O browser encarregar" se- de enviar a nova solicitao para a URL que voc fornecer. Para redirecionar uma solicitao, utilize o sendRedirect( aStringURL ) na resposta. Voc no pode chamar o sendRedirectO aps a resposta ter sido gerada! Ou seja, se voc j escreveu alguma coisa para o stream, muito tarde para fazer um redirecionamento. Um redirecionamento de uma solicitao diferente de um dispatch. O request dispatch (mais detalhado em outro captulo) acontece no servidor, enquanto que um redirecionamento ocorre no cliente. No caso do dispatch, a solicitao entregue para outro componente no servidor, geralmente na mesma aplicao. Um redirecionamento simplesmente informa ao browser para ir para uma URL diferente.

interface ServletResponse (javax.servlet.ServletResponse) <<interface> > ServletReslJonse getBujJerSizeO getOutputStreamO setcon.tentTypeo getWriterO setContentLengthO II MUITOS outros mtodos,,,

I"faee ll,,!rvle'RcsPonsc
Oavax.servlet.http. HttpServletResponse)
~~. < < interjace > > ~ .~

addCookieO addHeaderO encodeURLO sendErrorO setStatusO sendR.edirectO l/MUITOS outros mtodos ...

140 captulo 4