[语法] 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