[語法] HttpServletResponse物件為何有getWriter

作者: TKB5566 (我們的元首阿道夫希特勒)   2023-12-22 22:40:14
我從以前就一直覺得很奇怪,為何要對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。
希望這樣理解沒有錯誤,有錯的話麻煩鞭小力一點= =
作者: ssccg (23)   2023-12-22 22:52:00
你根本沒搞清楚http response是什麼吧,哪有什麼本身http訊息分成三個部分,status line、headers、bodystatus line在response就是版本、status codeheaders就是一堆header,基本上數量不會太多,內容也不長所以API設計成set String而body部分可以說沒有限制,甚至可能需要分段或壓縮這種不定長度的當然就要用IO Stream的方式開API否則要下載數百G的檔案可沒辦法讓你先讀成byte[] 再set至於不是setOutputStream而是getOutputStream,也是因為Stream的特性沒有一次就要寫入完成,當然Response物件內部要有自己控制的OutputStream,getOutputStream拿到的只是個接續寫入的wrapper,並不能把response內的OutputStream換掉至於setXXX那些沒這問題,依http response的順序,一定是先把status、headers寫入底層socket才開始寫body,開始寫bodysetXXX就通通無效了
作者: sw12 (專注.幽默)   2023-12-25 14:29:00
那你有直接set過嗎?直接試比較快吧....
作者: glo6e (ezdodance)   2023-12-25 22:51:00

Links booklink

Contact Us: admin [ a t ] ucptt.com