[語法] HttpServletResponse物件為何有getWriter

看板java作者 (= =)時間4月前 (2023/12/22 22:40), 4月前編輯推噓0(0017)
留言17則, 3人參與, 4月前最新討論串1/1
我從以前就一直覺得很奇怪,為何要對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

12/22 22:52, 4月前 , 1F
你根本沒搞清楚http response是什麼吧,哪有什麼本身
12/22 22:52, 1F

12/22 22:55, 4月前 , 2F
http訊息分成三個部分,status line、headers、body
12/22 22:55, 2F

12/22 22:56, 4月前 , 3F
status line在response就是版本、status code
12/22 22:56, 3F

12/22 22:57, 4月前 , 4F
headers就是一堆header,基本上數量不會太多,內容也不長
12/22 22:57, 4F

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

12/22 22:58, 4月前 , 6F
而body部分可以說沒有限制,甚至可能需要分段或壓縮
12/22 22:58, 6F

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

12/22 23:01, 4月前 , 8F
否則要下載數百G的檔案可沒辦法讓你先讀成byte[] 再set
12/22 23:01, 8F

12/22 23:02, 4月前 , 9F
至於不是setOutputStream而是getOutputStream,也是因為
12/22 23:02, 9F

12/22 23:02, 4月前 , 10F
Stream的特性沒有一次就要寫入完成,當然Response物件內部
12/22 23:02, 10F

12/22 23:03, 4月前 , 11F
要有自己控制的OutputStream,getOutputStream拿到的只是個
12/22 23:03, 11F

12/22 23:04, 4月前 , 12F
接續寫入的wrapper,並不能把response內的OutputStream換掉
12/22 23:04, 12F

12/22 23:05, 4月前 , 13F
至於setXXX那些沒這問題,依http response的順序,一定是先
12/22 23:05, 13F

12/22 23:07, 4月前 , 14F
把status、headers寫入底層socket才開始寫body,開始寫body
12/22 23:07, 14F

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

12/25 14:29, 4月前 , 16F
那你有直接set過嗎?直接試比較快吧....
12/25 14:29, 16F

12/25 22:51, 4月前 , 17F
12/25 22:51, 17F
文章代碼(AID): #1bXP_Gfm (java)
文章代碼(AID): #1bXP_Gfm (java)