※ 本文轉寄自 ptt.cc, 文章原始頁面
看板java
標題

[語法] HttpServletResponse物件為何有getWriter

最新2023-12-25 22:51:00
留言17則留言,3人參與討論
推噓0 ( 0017 )
我從以前就一直覺得很奇怪,為何要對HttpServletResponse物件, 寫入給http response本身的訊息時,要從HttpServletResponse物件調用getWriter方法 然後透過PrintWriter物件寫入回傳訊息。 而非直接寫入HttpServletResponse物件?例如HttpServletResponse物件提供了 一些setXXX方法,例如setContentType、setHeader、setCacheControl...... 來直接寫入訊息到HttpServletResponse物件。既然可以有這些setXXX方法 那麼為何要將主要回傳訊息寫入HttpServletResponse物件,要用的是getWriter方法? 我目前的理解是: 因為HttpServletResponse物件跟http response本身,兩者是關聯的, 既然兩者有關連,那麼若是HttpServletResponse物件提供某些類別/介面, 由於 介面與HttpServletResponse物件、HttpServletResponse物件跟http response的關聯所以,外部的訊息就可藉由使用這些類別/介面,將外部訊息寫入http response本身。 因此,只要HttpServletResponse物件提供某些類別/介面, 即可讓外部程式將訊息寫入http response本身。 所以,HttpServletResponse物件具備了某些類別/介面,可透過getXXX方法將其取出, 這個getXXX方法,就是getWriter方法、getOutputStream方法。 透過getWriter方法取出的介面,經過實例化後成為PrintWriter物件, 這時若要將外部訊息寫入http response本身,就只要將該訊息寫入PrintWriter物件。 即可透過上面所述的關聯性,將該訊息寫入http response本身。 而透過此法將外部訊息寫入http response本身,原理和一開始所以提到的那些 setXXX方法不同,而是先要取得介面才行,難怪明明是要寫入(set)訊息,卻是要先 getWriter、getOutputStream。 希望這樣理解沒有錯誤,有錯的話麻煩鞭小力一點= = -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.229.144.168 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/java/M.1703256016.A.A70.html

17 則留言

ssccg, 1F
你根本沒搞清楚http response是什麼吧,哪有什麼本身

ssccg, 2F
http訊息分成三個部分,status line、headers、body

ssccg, 3F
status line在response就是版本、status code

ssccg, 4F
headers就是一堆header,基本上數量不會太多,內容也不長

ssccg, 5F
所以API設計成set String
HTTP訊息分成三部分這我知道,我之所以會強調本身,只是想將 Java的HttpServletResponse物件,跟http協定的回應,兩者分開而已。

ssccg, 6F
而body部分可以說沒有限制,甚至可能需要分段或壓縮

ssccg, 7F
這種不定長度的當然就要用IO Stream的方式開API
喔喔,這樣說明又更能補充我上面的說法了,感謝大大。

ssccg, 8F
否則要下載數百G的檔案可沒辦法讓你先讀成byte[] 再set

ssccg, 9F
至於不是setOutputStream而是getOutputStream,也是因為

ssccg, 10F
Stream的特性沒有一次就要寫入完成,當然Response物件內部

ssccg, 11F
要有自己控制的OutputStream,getOutputStream拿到的只是個

ssccg, 12F
接續寫入的wrapper,並不能把response內的OutputStream換掉

ssccg, 13F
至於setXXX那些沒這問題,依http response的順序,一定是先

ssccg, 14F
把status、headers寫入底層socket才開始寫body,開始寫body

ssccg, 15F
setXXX就通通無效了
哇~~~講的真詳細,真的很謝謝大大撥冗指導。
※ 編輯: TKB5566 (36.229.144.168 臺灣), 12/22/2023 23:08:43

sw12, 16F
那你有直接set過嗎?直接試比較快吧....

glo6e, 17F

TKB5566 作者的近期文章

Re: [疑問] 諮商師的話
我原本已經有一段時間因為經濟拮据,沒去接受諮商了,但是這陣子感覺到 那些諮商師對我講的話,實在是太困擾我了,我想我還是得去好好跟諮商師搞清楚 是怎麼一回事。 所以以下會列出諮商師對我講過的,我認為應該要重新檢視的話: 1 我表達我認為當前的
[Live] SAI
今天真的帥慘 法拉拉真正的一號車手 法拉拉連挑選車手都能本能寺 科科
[Live] 老漢
現在完全是消化試合垃圾時間= = 時間怎不快點快轉到2025= =
[疑問] 諮商師的話
針對先前的諮商,我發覺我忘記講一件事情。就是之前諮商的時候, 諮商師對我說,我是因為都沒有對父母清楚溝通清楚表達自己的需求。 所以我跟父母之間才會變成這樣。 聽到這段話,當下我沒有直接回應,大概是因為我當下還沒想到要怎麼回應, 到了諮商結束
[疑問] 剛剛的發文
剛剛的發文也太負面了,我想我還是想一些有建設性的東西。 我看這個樣子,目前也只能設法讓我跟諮商師之間,想法保持一致。 既然我的重點是解決與家人之間的問題,那麼就要讓諮商師也能把重點放在 這上面。而非將重點放在我個人成長的問題。 我希望可以更
[疑問] 諮商前的準備
今天早上,我看到我媽在廚房走動,腳連續碰到地上的雜物好幾次, 所以我就跟我媽說地上有東西,走路可以注意一下嗎。 然而我媽卻大怒,她認為這又沒有怎樣、她也沒有看到地上有東西,我是在叫什麼。 我回我媽我只是提醒你走路的時候注意一下,剛剛沒有看到
[Live] DEV
剛剛車手排名 DEV國旗怎是愛沙尼亞的= =
[Live] SAI
是不是忘記還要一停?
更多 TKB5566 作者的文章...