1. 程式人生 > >HTTP協議的請求物件和響應物件

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的話,可以用隱藏域。