request與response

1. request和response概述

    Web服務器收到客戶端的http請求,會針對每一次請求,分別創建一個用於代表請求的request對象、和代表響應的response對象。request和response對象代表請求和響應,若要獲取客戶機提交過來的數據,只需要找request對象就行了。若要向客戶機輸出數據,只需要找response對象就行了。


2. response

         response是用來向客戶端完成響應,類型爲HttpServletResponse,它是Servlet的service()方法的參數。當客戶端發出請求時,tomcat會創建request和rsponse來調用Servlet的service()方法,每次請求都會創建新的request和response。

    2.1 response操作響應行

         在http響應行中,包括協議,版本號,以及響應狀態碼,響應行中主要就是操作這些狀態碼。

        常用方法:

            void setStatus(int sc,String sm) 設置狀態代碼

            void sendError(int sc) throws IOException 設置錯誤狀態碼

            void sendError(int sc,String msg) throwsIOException 設置錯誤狀態碼及信息

    2.2 response操作響應頭

         http響應頭的格式是  name:value的格式,如果有多個value值,以”,”分開,

        例如:

            Content-Encoding:gzip

            Content-Length: 123

            Content-Language: zh-cn

        Response設置響應頭:

            一個key對應一個value

        

            一個key對應多個value

        

    

    2.3 response操作響應體

        http響應正文是我們最終在瀏覽器上看到的結果。對於HttpServletResponse如果想要操作響應正文,需要通過response對象獲取到輸出流,將信息寫回到瀏覽器端。

    Response設置響應體:

    

    注意

        getOutputStream和getWriter方法分別用於得到輸出二進制數據、輸出文本數據的ServletOuputStream、Printwriter對象。

        getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法後,就不能再調用另一方法。 

        Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數據將被Servlet引擎從response裏面獲取,Servlet引擎將這些數據當作響應消息的正文,然後再與響應狀態行和各響應頭組合後輸出到客戶端。

        Serlvet的service方法結束後,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close方法,如果沒有,Servlet引擎tomcat將調用close方法關閉該輸出流對象。調用close的時候,會調用flushBuffer方法.

    2.4 設置輸出數據編碼

        默認情況下,瀏覽器編碼格式是ISO-8859-1

        publicvoid setCharacterEncoding(String charset)

        設置發送到客戶端的響應的字符編碼

        publicvoid setContentType(String type)

     設置將發送到客戶端的響應的內容類型,如果該響應尚未提交。給定內容類型可能包含字符編碼規範,例如text/html;charset=UTF-8

    示例:

        字節流:

        設置瀏覽器默認打開編碼

        response.setHeader("Content-Type","text/html;charset=UTF-8");

        中文轉成字節數組編碼

        response.getOutputStream().write("薛之謙".getBytes("UTF-8"));

    字符流:

        設置response的緩衝區的編碼

        response.setCharacterEncoding("UTF-8");

        設置瀏覽器默認打開的編碼.

        response.setHeader("Content-Type","text/html;charset=UTF-8");

        response.setContentType("text/html;charset=UTF-8");相當於上面兩句

    2.5自動刷新

       有一個響應頭:Refresh,它的作用是在指定的時間後,自動重定向到指定路徑。

       例如:response.setHeader(“Refresh”, “5;URL=http://www.baidu.com”);,表示在5秒後自動跳轉到百度。

    2.6文件下載

       一種:超鏈接方式.(不推薦)

          <a href=”aa.zip”>下載</a>

          <a href=”1.jpg”>下載</a>

       二種:手動編碼方式完成文件下載.

          設置兩個頭和一個流:

          Content-Type:文件MIME的類型.

          Content-Disposition:

          文件的輸入流:

    2.7重定向

        重定向:兩個請求。

        第一個請求,服務器響應碼:302。第一個請求的響應頭有一個Location頭,它說明了要重定向的URL;

        第二個請求,瀏覽器重新向Location頭指定的URL發出。

        重定向:可以重定向到本項目之外的頁面。例如可以重定向到百度!

        重定向:可以重定向到本項目內的其他資源,可以使用相對路徑,以“/項目名”開頭

        重定向:會使瀏覽器的地址欄發生變化!

        實現:    //1.設置狀態碼

                      response.setStatus(302);

                    //2.設置相應頭--跳轉目錄

                      response.setHeader(“location”,”http://localhost/test/ss”);

                      response.setHeader(“location”,”test/ss”);

                    開發中也可以使用:response.sendRedirect(String path);

servlet:


登錄頁面:


用戶名與密碼錯誤,登陸失敗,重定向到登陸頁面



用戶名與密碼正確,登陸成功:



3. request

         HttpServletRequest對象用於封裝http請求,對於http請求它有三部分組成,http請求行,http請求行及請求正文。

    3.1 request操作請求行

         public String getMethod()

        返回用於發出此請求的 HTTP 方法的名稱,例如 GET、POST

         public String getRequestURI()

        返回此請求的 URL 的一部分,從協議名稱一直到 HTTP 請求的第一行中的查詢字符串。

         public String getProtocol()

        以protocol/majorVersion.minorVersion 的形式(例如 HTTP/1.1)返回請求使用的協議的名稱和版本。

         public String getQueryString()

        返回包含在請求 URL 中路徑後面的查詢字符串。如果 URL 沒有查詢字符串,則此方法返回 null。

    3.2 request獲取客戶信息

         public String getContextPath()

        返回請求 URI 指示請求上下文的那一部分。

         public StringBuffergetRequestURL()

        重新構造客戶端用於發出請求的 URL。返回的 URL 包含一個協議、服務器名稱、端口號、服務器路徑,但是不包含查詢字符串參數。

         public String getRemoteAddr()

        返回發送請求的客戶端或最後一個代理的 InternetProtocol (IP) 地址

    3.3 request操作請求頭
    

        public String getHeader(String name)

        以 String 的形式返回指定請求頭的值。

         publicjava.util.Enumeration<E> getHeaders(String name)

        以 String 對象的 Enumeration 的形式返回指定請求頭的所有值。

         publicjava.util.Enumeration<E> getHeaderNames()

        返回此請求包含的所有頭名稱的枚舉。如果該請求沒有頭,則此方法返回一個空枚舉。

         public int getIntHeader(Stringname)

        以 int 的形式返回指定請求頭的值。如果該請求沒有指定名稱的頭,則此方法返回 -1。如果無法將頭轉換爲整數,則此方法拋出NumberFormatException。

         public longgetDateHeader(String name)

        以表示 Date 對象的 long 值的形式返回指定請求頭的值

    3.4 request獲取請求參數
      

        請求參數是瀏覽器發送請求時攜帶的信息。對於請求方式GET與POST,請求參數存在位置不同。

         GET:請求參數存在於請求的資源路徑中。

         POST:請求參數存在於正文中

         public StringgetParameter(String name)

        以 String 形式返回請求參數的值,如果該參數不存在,則返回 null

         public String[]getParameterValues(String name)

        返回包含給定請求參數擁有的所有值的 String 對象數組,如果該參數不存在,則返回 null。

         public java.util.Map<K,V> getParameterMap()

        返回此請求的參數的 java.util.Map。請求參數是與請求一起發送的額外信息。對於 HTTPservlet,參數包含在查詢字符串或發送的表單數據中。

         publicjava.util.Enumeration<E> getParameterNames()

        返回包含此請求中所包含參數的名稱的 String 對象的 Enumeration。如果該請求沒有參數,則此方法返回一個空的Enumeration。

    3.5 request域對象

            request對象同時也是一個域對象,開發人員通過request對象在實現轉發時,把數據通過request對象帶給其它web資源處理。

        setAttribute方法

        getAttribute方法 

        removeAttribute方法

        getAttributeNames方法

        request對象提供了一個getRequestDispatcher方法,該方法返回一個RequestDispatcher對象,調用這個對象的forward方法可以實現請求轉發,從而共享請求中的數據

    3.6 請求轉發

         請求轉發可以實現路徑的跳轉操作.

         ReqeustDispatcherdispatcher=request.getRequestDispatcher("路徑")

         dispatcher.forward(request,response)

        請求轉發和重定向的區別:

        (1)請求轉發是服務器內部跳轉,地址欄不會發生改變

                重定向地址欄會發生改變。

 

        (2)請求轉發,只有一次請求,一次響應.

                重定向,有兩次請求,兩次響應。

 

        (3)請求轉發存在request域,可以共享數據.

                重定向不存在request域。

 

        (4)請求轉發只能在服務器的內部跳轉,簡單說,只能訪問本站內資源。

                重定向可以訪問站外資源,也可以訪問站內資源.

 

        (5)請求轉發是由request 發起的 .request.getRequestDispatcher().forward()

                重定向是由response 發起的  response.sendRedirect();

 

        (6)請求轉發與重定向時路徑寫法不一樣.

                 請求轉發是服務器內部跳轉,這時它與瀏覽器無關 寫法:/資源

                重定向要跳轉的路徑是從瀏覽器在次發起的,是瀏覽器端路徑,寫法: /工程名/資源

 

    3.7 請求包含

        RequestDispatcher.include()方法用於將RequestDispatcher對象封裝的資源內容作爲當前響應內容的一部分包含進來,從而實現可編程的服務器端包含功能,被包含的Servlet程序不能改變響應消息的狀態碼和響應頭,如果它裏面存在這樣的語句,這些語句的執行結果將被忽略。include在程序執行上效果類似forward,但是使用forward只有一個程序可以生成響應,include可以由多個程序一同生成響應 ----- 常用來頁面佈局。

        RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);

        rd.include(request,response);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章