免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
JavaWeb之Request對象和Response對象詳解


一:概述

Web服務器收到客戶端的http請求,會針對每一次請求,分別創(chuàng)建一個用于代表請求的request對象、和代表響應的response對象

一、Response對象
    
1.Resonse的繼承結構:
            ServletResponse--HttpServletResponse
    2.Response代表響應,于是響應消息中的 狀態(tài)碼、響應頭、實體內容都可以由它進行操作,由此引伸出如下實驗:
    3.利用Response輸出數(shù)據(jù)到客戶端
        response.getOutputStream().write('中文'.getBytes())輸出數(shù)據(jù),這是一個字節(jié)流,寫入內存使用什么編碼,輸出就使用什么編碼,而瀏覽器默認用平臺字節(jié)碼打開服務器發(fā)送的數(shù)據(jù),如果服務器端使用了非平臺碼去輸出字符的字節(jié)數(shù)據(jù)就需要明確的指定瀏覽器編碼時所用的碼表,以防止亂碼問題。

       response.addHeader('Content-type','text/html;charset=gb2312')
       response.getWriter().write(“中文”);輸出數(shù)據(jù),這是一個字符流,response會將此字符進行轉碼操作后輸出到瀏覽器,這個過程默認使用ISO8859-1碼表,而ISO8859-1中沒有中文,于是轉碼過程中用?代替了中文,導致亂碼問題。可以指定response在轉碼過程中使用的目標碼表,防止亂碼。response.setCharacterEncoding('gb2312');
        其實response還提供了setContentType('text/html;charset=gb2312')方法,此方法會設置content-type響應頭,通知瀏覽器打開的碼表,同時設置response的轉碼時使的用碼表,從而一行代碼解決亂碼。
    4.利用Response 設置 content-disposition頭實現(xiàn)文件下載
            設置響應頭content-disposition為“attachment;filename=xxx.xxx”
            利用流將文件讀取進來,再利用Response獲取響應流輸出
            如果文件名為中,一定要進行URL編碼,編碼所用的碼表一定要是UTF-8
    5.refresh頭控制定時刷新
        設置響應頭Refresh為一個數(shù)值,指定多少秒后刷新當前頁面
        設置響應頭Refresh為 3;url=/Day05/index.jsp,指定多少秒后刷新到哪個頁面
        可以用來實現(xiàn)注冊后“注冊成功,3秒后跳轉到主頁”的功能
        在HTML可以利用標簽模擬響應頭的功能。

      eg:
    6.利用response設置expires、Cache-Control、Pragma實現(xiàn)瀏覽器是否緩存資源,這三個頭都可以實現(xiàn),但是由于歷史原因,不同瀏覽器實現(xiàn)不同,所以一般配合這三個頭使用
        6.1控制瀏覽器不要緩存(驗證碼圖片不緩存)設置expires為0或-1設置Cache-Control為no-cache、Pragma為no-cache
        6.2控制瀏覽器緩存資源。即使不明確指定瀏覽器也會緩存資源,這種緩存沒有截至日期。當在地址欄重新輸入地址時會用緩存,但是當刷新或重新開瀏覽器訪問時會重新獲得資源。
            如果明確指定緩存時間,瀏覽器緩存是,會有一個截至日期,在截至日期到期之前,當在地址欄重新輸入地址或重新開瀏覽器訪問時都會用緩存,而當刷新時會重新獲得資源。
    7.Response實現(xiàn)請求重定向
        7.1古老方法:response.setStatus(302);response.addHeader('Location','URL');
        7.2快捷方式:response.sendRedirect('URL');
  
    8.Response注意的內容:
        8.1對于一次請求,Response的getOutputStream方法和getWriter方法是互斥,只能調用其一,特別注意forward后也不要違反這一規(guī)則。
        8.2利用Response輸出數(shù)據(jù)的時候,并不是直接將數(shù)據(jù)寫給瀏覽器,而是寫到了Response的緩沖區(qū)中,等到整個service方法返回后,由服務器拿出response中的信息組成響應消息返回給瀏覽器。
        8.3service方法返回后,服務器會自己檢查Response獲取的OutputStream或者Writer是否關閉,如果沒有關閉,服務器自動幫你關閉,一般情況下不要自己關閉這兩個流。
        

二、Request:Request代表請求對象,其中封裝了對請求中具有請求行、請求頭、實體內容的操作的方法
    1.獲取客戶機信息
        getRequestURL方法返回客戶端發(fā)出請求完整URL    eg:返回: ' http://localhost:8080/Day05/index.jsp'
        getRequestURI方法返回請求行中的資源名部分,在權限控制中常用 eg:返回  '/Day05/index.jsp'
        getQueryString 方法返回請求行中的參數(shù)部分
        getRemoteAddr方法返回發(fā)出請求的客戶機的IP地址
        getMethod得到客戶機請求方式
        getContextPath 獲得當前web應用虛擬目錄名稱,特別重要?。。?,工程中所有的路徑請不要硬編碼(不要寫死),其中的web應用名要以此方法去獲得。

    2.獲取請求頭信息
        getHeader(name)方法 --- String ,獲取指定名稱的請求頭的值
        getHeaders(String name)方法 --- Enumeration ,獲取指定名稱的請求頭的值的集合,因為可能出現(xiàn)多個重名的請求頭
        getHeaderNames方法 --- Enumeration ,獲取所有請求頭名稱組成的集合
        getIntHeader(name)方法  --- int ,獲取int類型的請求頭的值
        getDateHeader(name)方法 --- long(日期對應毫秒) ,獲取一個日期型的請求頭的值,返回的是一個long值,從1970年1月1日0時開始的毫秒值
        
        *實驗:通過referer信息防盜鏈(防盜鏈:非正常訪問,簡單的是,就是不是從規(guī)定的站點發(fā)送HTTP請求,而是從其他站點發(fā)送的HTTP請求)
            String ref = request.getHeader('Referer');
            if (ref == null || ref == '' || !ref.startsWith('http://localhost')) {
                response.sendRedirect(request.getContextPath() + '/homePage.html');
            } else {
                //為了不讓其他資源可見,fengjie.html應該存放在WEB-INF目錄下
                this.getServletContext().getRequestDispatcher('/WEB-INF/fengjie.html').forward(request, response);
            }
    3.獲取請求參數(shù)
        getParameter(name) --- String 通過name獲得值
        getParameterValues(name)  --- String[ ] 通過name獲得多值 checkbox
        getParameterNames  --- Enumeration 獲得所有請求參數(shù)名稱組成的枚舉
        getParameterMap  --- Map 獲取所有請求參數(shù)的組成的Map集合,注意,其中的鍵為String,值為String[]
        
        獲取請求參數(shù)時亂碼問題:
            瀏覽器發(fā)送的請求參數(shù)使用什么編碼呢?當初瀏覽器打開網(wǎng)頁時使用什么編碼,發(fā)送就用什么編碼。
            服務器端獲取到發(fā)過來的請求參數(shù)默認使用ISO8859-1進行解碼操作,中文一定有亂碼問題
            對于Post方式提交的數(shù)據(jù),可以設置request.setCharacterEncoding('gb2312');來明確指定獲取請求參數(shù)時使用編碼。但是此種方式只對Post方式提交有效。
            對于Get方式提交的數(shù)據(jù),就只能手動解決亂碼:String newName = new String(name.getBytes('ISO8859-1'),'gb2312');此種方法對Post方式同樣有效。
            request.setCharacterEncoding('gb2312');對GET方式提交無效的原因是:該代碼只設置請求實體的編碼,而GET提交的數(shù)據(jù)是存放在請求行中的[資源名?param1='張三'¶m2=123],所以對GET請求的方式無效。
            在tomcat的server.xml中可以配置http連接器的URIEncoding可以指定服務器在獲取請求參數(shù)時默認使用的編碼,從而一勞永逸的決絕獲取請求參數(shù)時的亂碼問題。也可以指定useBodyEncodingForURI參數(shù),令request.setCharacterEncoding也對GET方式的請求起作用,但是這倆屬性都不推薦使用,因為發(fā)布環(huán)境往往不允許修改此屬性。
            
            
    4.利用請求域傳遞對象
        生命周期:在service方法調用之前由服務器創(chuàng)建,傳入service方法。整個請求結束,request生命結束。
        作用范圍:整個請求鏈。
        作用:在整個請求鏈中共享數(shù)據(jù),最常用的:在Servlet中處理好的數(shù)據(jù)要交給Jsp顯示,此時參數(shù)就可以放置在Request域中帶過去。
        
    5.request實現(xiàn)請求轉發(fā)
        ServletContext可以實現(xiàn)請求轉發(fā),request也可以。
        在forward之前輸入到response緩沖區(qū)中的數(shù)據(jù),如果已經(jīng)被發(fā)送到了客戶端,forward將失敗,拋出異常
        在forward之前輸入到response緩沖區(qū)中的數(shù)據(jù),但是還沒有發(fā)送到客戶端,forward可以執(zhí)行,但是緩沖區(qū)將被清空,之前的數(shù)據(jù)丟失。注意丟失的只是請求體中的內容,頭內容仍然有效。
        在一個Servlet中進行多次forward也是不行的,因為第一次forward結束,response已經(jīng)被提交了,沒有機會再forward了
        總之,一條原則,一次請求只能有一次響應,響應提交走后,就再沒有機會輸出數(shù)據(jù)給瀏覽器了。
        
    6.RequestDispatcher進行include操作
        forward沒有辦法將多個servlet的輸出組成一個輸出,因此RequestDispatcher提供了include方法,可以將多個Servlet的輸出組成一個輸出返回個瀏覽器
            request.getRequestDispatcher('/servlet/Demo17Servlet').include(request, response);
            response.getWriter().write('from Demo16');
            request.getRequestDispatcher('/servlet/Demo18Servlet').include(request, response);
        常用在頁面的固定部分單獨寫入一個文件,在多個頁面中include進來簡化代碼量。
        
        

三、地址的寫法:

絕對路徑(以斜線開頭的路徑,代表相對與當前web應用):
    如果地址是給服務器用的,web應用的名稱可以省略。如果地址是給客戶端用的,必須寫上web應用名
    request.getRequestDispatcher('/index.jsp').include(request, response);
    response.setHeader('Location','/Day05/index.jsp');
    response.sendRedirect('/Day05/index.jsp');
    this.getServletContext().getRealPath('/index.jsp');
    this.getServletContext().getResourceAsStream('/index.jsp');
    
    
    
    類加載器加載資源的時候,相對于WEB-INF下的classes目錄
    this.getClass().getClassLoader().getResource('');
    this.getClass().getClassLoader().getResourceAsStream('');
相對路徑(不以斜杠開頭的路徑,要參考當前所在的路徑去拼新的路徑)---除了在必須使用的情況外,都不要使用相對路徑:
    如果直接寫相對路徑或寫./相對路徑的話,相對路徑替換當前路徑最后一級
    如果寫../相對路徑,則替換當前路徑的最后一級路徑的上一級路徑。
    如果想替換更高層,則寫多個../
    
四、URL編碼
    1.由于HTTP協(xié)議規(guī)定URL路徑中只能存在ASCII碼中的字符,所以如果URL中存在中文或特殊字符需要進行URL編碼。
    2.編碼原理:
        將空格轉換為加號(+)
        對0-9,a-z,A-Z之間的字符保持不變
        對于所有其他的字符,用這個字符的當前字符集編碼在內存中的十六進制格式表示,并在每個字節(jié)前加上一個百分號(%)。如字符“+”用%2B表示,字符“=”用%3D表示,字符“&”用%26表示,每個中文字符在內存中占兩個字節(jié),字符“中”用%D6%D0表示,字符“國”用%B9%FA表示,對于空格也可以直接使用其十六進制編碼方式,即用%20表示,而不是將它轉換成加號(+)
        說明:
        如果確信URL串的特殊字符沒有引起使用上的岐義或沖突你也可以對這些字符不進行編碼,而是直接傳遞給服務器。例如,http://www.it315.org/dealregister.html?name=中國&password=123
        如果URL串中的特殊字符可能會產生岐義或沖突,則必須對這些特殊字符進行URL編碼。例如,服務器會將不編碼的“中+國”當作“中國”處理。還例如,當name參數(shù)值為“中&國”時,如果不對其中的“&”編碼,URL字符串將有如下形式:http://www.it315.org/dealregister.html?name=中&國&password=123,應編碼為:http://www.it315.org/dealregister.html?name=中%26國&password=123
        http://www.it315.org/example/index.html#section2可改寫成http://www.it315.org/example%2Findex.html%23section2
    3.在java中進行URL編碼和解碼
        URLEncoder.encode('xxxx','utf-8');
        URLDecoder.decode(str,'utf-8');


五、請求重定向和請求轉發(fā)的區(qū)別
    1.區(qū)別
            RequestDispatcher.forward方法只能將請求轉發(fā)給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。
            如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對于服務器的根目錄;如果創(chuàng)建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對于當前WEB應用程序的根目錄。
            調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的URL會發(fā)生改變,由初始的URL地址變成重定向的目標URL;調用RequestDispatcher.forward 方法的請求轉發(fā)過程結束后,瀏覽器地址欄保持初始的URL地址不變。
            HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發(fā)出對另外一個URL的訪問請求;RequestDispatcher.forward方法在服務器端內部將請求轉發(fā)給另外一個資源,瀏覽器只知道發(fā)出了請求并得到了響應結果,并不知道在服務器程序內部發(fā)生了轉發(fā)行為。
            RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬于兩個獨立的訪問請求和響應過程。
    2.應用場景(參照圖想)
        通常情況下都用請求轉發(fā),減少服務器壓力
        當需要更新地址欄時用請求重定向,如注冊成功后跳轉到主頁。
        當需要刷新更新操作時用請求重定向,如購物車付款的操作。



本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
jsp中forword和sendRedirect的區(qū)別
Servlet響應之頁面形式
JSP中Servlet的Request與Response的用法與區(qū)別
Servlet 中文亂碼問題及解決方案剖析
Servlet簡介與Servlet和HttpServlet運行的流程
幾種servlet頁面跳轉方式。_iechenyb
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服