作者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/cn.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