日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

大数据WEB阶段 (十)Response、ServletConfig、ServletContext、资源跳转三种方式

發布時間:2024/4/30 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数据WEB阶段 (十)Response、ServletConfig、ServletContext、资源跳转三种方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Response、ServletConfig、ServletContext、資源跳轉三種方式


(一)Response

一、Response概述

  • 在doGet和doPost方法的參數中,HttpServletRequest代表的是http請求,而HttServletResponse代表的是http響應。想要獲取請求中的信息時使用HttpServletRequest對象,而有數據需要發送給客戶端時,就要用到HttpServletResponse對象了。
  • 二、Response繼承結構

  • 我們通常簡稱為response , 但實際上是servletResponse接口 , 其中定義了很多與響應相關的方法 , HttpServletResponse是ServletResponse的接口的子接口 , 在ServletResponse的基礎上增加了很多和 http協議相關的方法。
  • 三、Response常用方法

  • 設置狀態碼
  • setStatus(int sc)
  • setStatus(int sc , String sm)
  • 設置響應頭
  • setIntHeader(String name , int value)
  • setHeader(String name , String value)
  • setDateHeader(String name , long date)
  • addHeader(String name , int value)
  • addIntHeader(String name , String value)
  • 獲取輸出流
  • PrintWriter getWriter() 字符輸出流
  • ServletOutputStream getOutputStream() 字節輸出流
  • 四、Response輸出信息到客戶端

  • 向 客戶端輸出英文數據
  • 向客戶端輸出中文數據測試時出現了亂碼
  • 響應亂碼的處理

  • 亂碼結果分析
  • 亂碼的產生大多是由編碼和解碼時 使用的碼表 不一致造成的
  • 服務器端如果不指定 , 默認使用ISO-8859-1碼表進行編碼后發送數據
  • 客戶端如果不指定 , 默認使用客戶端所在的操作系統的平臺默認編碼(windows默認gbk , linux默認u8)
  • 亂碼結果的處理

  • 可以通過設置response.serCharacter(“utf-8”)來指定服務端發送數據時編碼使用gbk , 注意:這行代碼必須出現在任何輸出數據的代碼之前 , 否則不起作用 。
  • 重新測試后發現亂碼不在是“??”而是 變成了三個字符的 亂碼
  • 分析:
  • 服務器使用 utf-8編碼時兩個字符占用 6個字節 , 但是客戶端使用gbk解碼 , gbk中每個字符占2個字節 , 所以最后產生了一個三個字符的字符串
  • 處理

  • 我們需要指定客戶端使用與服務端 一致的 碼表進行解碼 ,才能保證數據正確

    response.setContentType("text/html;charset=utf-8"); 或 response.setHeader("Content-Type","text/html;charset=utf-8")
  • Response輸出數據時的細節
  • getWriter()與getoutputStream()這兩個方法互斥 , 調用了其中一個就不能在調用另一個 , 因為服務器需要明確數據發送前是否需要編碼(字符輸出流發送前需要編碼 , 而字節輸出流發送前不需要) 。
  • servlet程序向ServletOutputStream或PrintWriter對象中寫入數據的數據將被 Servlet引擎從response獲取 , servlet引擎將這些 數據當做響應消息的正文 , 然后再與響應狀態和 各種響應頭組合后發向客戶端
  • Servlet的service方法被調用結束后 , servlet引擎會檢查 PrintWriter和ServletOutputStream對象是否被關閉 , 如果沒有則servlet引擎將調用close方法關閉輸出流對象
  • 五、Response實現重定向

  • HTTP協議中提供了 302狀態碼和location響應頭 , 通知瀏覽器收到響應后立即自動訪問location中的制定地址 , 從而跳轉訪問 另一個地址

    response.setState(302); response.setHeader("Location",url);

  • 觀察地址欄發生了變化 , 所以實際上是進行了兩次請求 。
  • 六、Response實現定時刷新

  • 在HTTP協議中提供了refresh響應頭 , 可以命令瀏覽器的定時刷新 。

    response.setHeader("refresh","3");//瀏覽器端每隔3秒自動刷新一次 response.setHeader("refresh","3;url=xxx");//瀏覽器3秒后刷新跳轉到制定url
  • 案例: 注冊成功后提示:恭喜注冊才成功 , 3秒后跳轉到主頁
  • 七、Response禁止瀏覽器緩存

  • 各大瀏覽器為了減小服務器的壓力 , 會在第一次訪問到資源后對資源進行緩存 ,, 之后在訪問相同的地址時 , 就不會實際訪問服務器 , 而是讀取緩存 。
  • 這種緩存一定 程度上提高了瀏覽器的響應速度,減小了服務器壓力 , 在大多數情況下是好的 ,但是在某些場景下可能會有問題 。 如:驗證碼的顯示 、 股票走勢 、 火車票余量。。。
  • 禁止瀏覽器緩存資源

    response.setDateHeader("Expires",0); response.setHeader("cache-control","no-cache"); response.setHeader("Pragma","no-cacahe");

  • (二)ServletConfig

    一、概述

  • ServletConfig代表Servlet在web.xml中的配置信息
  • 二、獲取ServletConfig

  • 在servlet接口中init方法參數就是ServletConfig , 在Servlet創建出來時init方法被立即調用 , 由容器傳入ServletConfig對象 。
  • 在GenericServlet中 , 實現了這個方法 , 就愛那個ServletConfig設置成了類的成員變量 , 并提供了getServletConfig的方法 , 獲取該對象 。
  • 我們實現的servlet都直接或間接繼承了GenericServlet , 所以可以直接調用getServletConfig() 方法 。 獲取該對象 。
  • 三、ServletConfig獲取初始化參數

  • 配置初始化參數
  • 在web.xml文件中的servlet標簽中可以配置一個或多個init-param標簽 , 用來為當前 servlet配置一些自定義的參數 , 成為 servlet初始化參數
  • 通過servletConfig獲取初始化參數
  • 在servletconfig身上有一些方法可以獲取初始化參數
  • 示例:

  • (三)servletContext對象

    一、ServletContext概述

  • ServletContext對象代表當前web應用 , 當服務器啟東時 , 服務器會依次加載 web應用 , 每一個web應用加載完成之后都會創建一個ServletContext對象唯一代表該應用 , 這個對象一直存活 , 知道web應用被移除容器 , 獲取 服務器關閉時隨著應用被銷毀 。
  • 二、獲取ServletContext對象

  • ServletConfig對象身上提供了getServletContext()方法來獲取ServletContext對象
  • 而在GenericServlet中也提供了便捷的getServletContext()方法 , 我們創建的Servlet間接繼承至GenericServlet , 所以可以直接調用getServletContext() .
  • 三、ServletContext對象讀取web應用初始化參數

  • 我們可以在web.xml文件中利用context-param標簽為整個應用配置初始化信息

    <context-param><param-name>encode</param-name><param-value>utf-8</param-value> </context-param>
  • 可以利用ServletContext對象的如下方法獲取初始化信息:

    ServletContext.getInitParameter(); ServletContext.getInitParameterName()
  • ServletContext對象作為域對象使用
  • 作用范圍: 整個web應用
  • 生命周期:隨web應用的生而生 , 滅而滅 。
  • 操作域的方法:
  • setAttribute(String name , Object obj);//向域中設置數據
  • Object getAttribute(String name);//從域中獲取數據
  • removeAttribute(String name);//從域中移除數據
  • ServletContext對象讀取web資源

  • 路徑難題
  • 在web環境中讀取資源時 , 如果寫的是相對路徑 , 則在 tomcat/bin目錄下尋找資源 。 如果寫的是絕對路徑 , 則在tomcat所在的根目錄下尋找資源 。 如果寫的是從盤符開始的絕對路徑可以正確找到資源 , 但是項目一旦開發完成發布到服務器中絕對路徑會隨之改變 。
  • ServletContext讀取資源
  • ServletCotext.getRealPath(“xxx”); —這個方法會在傳入的路徑之前拼接當前 web應用的硬盤路徑(此時的xxxx代表的是目標資源在webRoot目錄中的相對路徑) , 從而得到動態的web資源絕對路徑。
  • 類加載器讀取資源

  • 在web開發時, 有時沒法拿到ServletContext對象, 此時 可以使用類加載器加載資源文件
  • 類加載器可以加載class文件 , 也可以 加載其他類型的資源文件
  • 在ClassLoader上提供了getResource(“相對于類加載目錄路徑”)可以加載 資源 , 但是要求這個路徑給一個相對于類加載器加載類的目錄的路徑(WEB-INF/classes)

    String path = 當前類名.class.getClassLoader().getResource("xxx").getPath();

  • (四)實現資源跳轉

    一、三種資源跳轉方式

  • Response請求重定向
  • Response定時刷新
  • Resquest請求轉發
  • 二、三種資源跳轉方式的比較

  • 不同特點
  • 轉法是服務 器內部資源的跳轉 , 重定向是通過302+Loaction實現瀏覽器跳轉訪問 。
  • 轉發是一次請求一次響應 , 重定向是兩次請求兩次響應 。
  • 轉發地址欄不發生變化 , 重定向地址欄 會發生變化
  • 轉發之后request不變 , 重定向會產生兩個不同的request
  • 應用場景
  • 如果希望資源跳轉的過程中使用request域傳輸數據 , 必須用轉發
  • 如果希望資源跳轉后地址欄發生改變 , 則必須用重定向或定時刷新
  • 如果希望在跳轉時展示一些數據 , 則 必須使用定時刷新
  • 在沒有任何要求的情況下三種方式 都可以使用 , 但是推薦 使用請求 轉發 , 可以減少服務器的訪問次數 , 從而 減小服務器 壓力
  • 總結

    以上是生活随笔為你收集整理的大数据WEB阶段 (十)Response、ServletConfig、ServletContext、资源跳转三种方式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。