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、资源跳转三种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。