作者TKB5566 (= =)
看板java
標題[語法] HttpServletResponse物件為何有getWriter
時間Fri Dec 22 22:40:14 2023
我從以前就一直覺得很奇怪,為何要對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://webptt.com/m.aspx?n=bbs/java/M.1703256016.A.A70.html
1F:→ ssccg: 你根本沒搞清楚http response是什麼吧,哪有什麼本身 12/22 22:52
2F:→ ssccg: http訊息分成三個部分,status line、headers、body 12/22 22:55
3F:→ ssccg: status line在response就是版本、status code 12/22 22:56
4F:→ ssccg: headers就是一堆header,基本上數量不會太多,內容也不長 12/22 22:57
5F:→ ssccg: 所以API設計成set String 12/22 22:57
HTTP訊息分成三部分這我知道,我之所以會強調本身,只是想將
Java的HttpServletResponse物件,跟http協定的回應,兩者分開而已。
6F:→ ssccg: 而body部分可以說沒有限制,甚至可能需要分段或壓縮 12/22 22:58
7F:→ ssccg: 這種不定長度的當然就要用IO Stream的方式開API 12/22 22:59
喔喔,這樣說明又更能補充我上面的說法了,感謝大大。
8F:→ ssccg: 否則要下載數百G的檔案可沒辦法讓你先讀成byte[] 再set 12/22 23:01
9F:→ ssccg: 至於不是setOutputStream而是getOutputStream,也是因為 12/22 23:02
10F:→ ssccg: Stream的特性沒有一次就要寫入完成,當然Response物件內部 12/22 23:02
11F:→ ssccg: 要有自己控制的OutputStream,getOutputStream拿到的只是個 12/22 23:03
12F:→ ssccg: 接續寫入的wrapper,並不能把response內的OutputStream換掉 12/22 23:04
13F:→ ssccg: 至於setXXX那些沒這問題,依http response的順序,一定是先 12/22 23:05
14F:→ ssccg: 把status、headers寫入底層socket才開始寫body,開始寫body 12/22 23:07
15F:→ ssccg: setXXX就通通無效了 12/22 23:07
哇~~~講的真詳細,真的很謝謝大大撥冗指導。
※ 編輯: TKB5566 (36.229.144.168 臺灣), 12/22/2023 23:08:43
16F:→ sw12: 那你有直接set過嗎?直接試比較快吧.... 12/25 14:29
17F:→ glo6e: 推 12/25 22:51
18F:推 ywk: 推 07/13 06:08
19F:→ y3k: 有些是getWriter(),有些是getOutputStream;這些東西其實 09/16 10:02
20F:→ y3k: 都不是給你用的XD 09/16 10:02