HTTP協議的請求物件和響應物件
HTTP協議:
什麼是HTTP,Http是超文字傳輸協議,從瀏覽器到伺服器稱為請求,從伺服器回到瀏覽器稱之為響應
請求物件:(HttpServletRequest):
請求物件分為請求頭,請求行以及請求實體下面分別來講一下:
請求行包括:傳輸方式(get或post) 請求的地址(url) 協議的版本
請求頭中只有:只有鍵值對形式存在的引數
請求實體:post傳參方式,需要注意的是,當傳輸方式為get時,表單中的值是在地址的問號後面,
當傳輸方式為post時值是在請求實體中
HttpServletRequest的本質上就是HTTP協議的請求所封裝的
請求物件中的方法:
1》獲取請求行中的內容
Request.getMethod() 獲取請求方式
Request.getRequestURI() 獲取位址列中?之前埠之後
Request.getRequestURL() 獲取?之前所有,返回StringBuffer
Request.getScheme() 獲取協議
Request.getContextPath() 獲取根目錄
Request.getQueryString() 獲取?之後
2》獲取請求頭中的內容:
Request.getHeader(鍵) 鍵是不區分大小寫的
3》獲取網路資訊:
request.getRemoteAddr() 獲取客戶端ip地址
Request.getRemotePort() 獲取客戶端的埠
Request.getLocalAddr() 獲取伺服器IP地址
Request.getLocalPort() 獲取伺服器埠號
4》獲取表單引數:
首先獲取單鍵單值:
Request.getParameter(鍵) 返回String,需要注意的是如果沒有鍵返回的是null,
有鍵而沒有值返回空字串;
獲取同鍵不同值(主要針對複選框):
request.getParameterValues(鍵) 返回一個String[]
獲取所有鍵的集合:
Request.getParameterNames() 返回的是Enumeration,也就是一個容器
While(enum物件.hasMoreElements()){
enum物件.nextElement();
}
如何解決請求中的亂碼問題:
request.setCharacterEncoding(當前專案的編碼集)
注意:
本身對請求實體進行編碼,針對於post編碼。如果需要對get同時一起編碼,需要在配置埠號的地方新增useBodyEncodingForURI="true"。
響應物件:(HttpServletResponse)
響應行:包含協議版本,狀態碼,還有狀態描述
響應頭:也是鍵值對的形式存在的
響應實體:字串或者是流資訊
HttpServletResponse響應物件:
設定響應頭:
response.setHeader(鍵,值) 忽略大小寫
設定重新整理,refresh
可以單獨寫秒數,代表的是多少秒後重新整理本頁面
也可以寫秒數;url="地址" 代表的是多少秒後重新整理並跳轉到指定地址
設定響應的編碼集:
Response.setHeader("content-type","text/html;charset=伺服器編碼集")
需要注意的是需要把這句話放在其他程式碼之上
設定響應字型:
輸出字串:
Response.getWriter() 得到的是PrintWirter
輸出流資訊:
Response.getOutputStream(),返回的是ServletOutputStream,可以直接用OutputStream來接,剩下的就全是普通的流資訊了
需要注意的是當用到form表單時,form表單的action後面如果跟了自己新增的引數,如果請求方式是get,表單的引數會將action新增的引數全部覆蓋掉。
解決方式:
1)把get換成post。
2)使用get的話,可以用隱藏域。