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