Day35 Response
1.1.1 ServletContext概念
u 項目的管理者(上下文對象),服務器啟動時,會為每一個項目創建一個對應的ServletContext對象.
1.1.2 ServletContext獲取
u 方式1. getServletConfig().getServletContext()
u 方式2: request.getServletContext()
u 方式3: getServletContext()
1.1.3 ServletContext作用 整個web應用有效
u 獲取全局的初始化參數
u 數據共享(servlet通信)
u 獲取資源文件
u 其他操作…
數據共享,用這個對象存取的數據可以在整個WEB應用中獲得。可以使用如下方法存取數據
方法名 |
描述 |
setAttribute(String name,Object object) |
向ServletContext中存數據 |
getAttribute(String name) |
從ServletContext中取數據 |
removeAttribute(name) |
從ServletContext中移除數據 |
常見響應頭:
location 執行響應信息的路徑,需要與狀態碼302配合使用,完成跳轉. (重定向)
特點: 多次請求對應多次響應
應用場景: 用戶登錄成功以后, 重定向到首頁
content-Type 響應正文的類型(MIME類型)
應用場景: 處理響應中文亂碼
Refresh定時刷新,格式:秒數;url=路徑。url可省略,默認值為當前頁。
content-Disposition 通知瀏覽器以下載的方式解析正文.取值:attachment;filename=xxx.zip
應用場景: 文件下載
n void setHeader(String name, String value)
u 用給定名稱和值設置響應頭。如果已經設置了頭,則新值將重寫以前的值。containsHeader 方法可用於測試在設置其值之前頭是否存在
n public void setContentType(String type)
u 設置將發送到客戶端的響應的內容類型,如果該響應尚未提交。給定內容類型可能包含字符編碼規范,例如 text/html;charset=UTF-8。如果在調用 getWriter 之前調用此方法,則只根據給定內容類型設置響應的字符編碼
u 作用:處理中文亂碼
l 方式1:設置頭信息 response.setHeader("content-Type","text/html;charset=UTF-8");
l 方式2:response.setContentType("text/html;charset=UTF-8") (常用方法)
l 響應體
n getOutPutStream();字節流。可以發送任意數據,但發送字符繁瑣,一般不使用發送字符(漢字)。
u 應用場景:發送字節(圖片、視頻、音頻等)
n 字符流【最常用】。一般常用與響應數據。
u 應用場景:文本
注意事項:同時獲得兩個流對象時會報錯.
它可以直接輸出字節數組中的二進制數據。因此,要想輸出二進制格式的響應正文,就需要使用getOutputStream()方法。
要想輸出內容全為字符文本的網頁文檔,需要使用getWriter()方法。
l 文件下載原理
n 設置響應頭
u response.setHeader(“content-Disposition”,”attachment;filename=xxx.zip”);
u response.setConetentType(“MIME類型”); -- 老版本瀏覽器需要添加
1.1.1 response解決中文輸出亂碼問題
l 第一種方式:
// 設置HttpServletResponse使用utf-8編碼,此數據提供給tomcat使用。
response.setCharacterEncoding("utf-8");
// 通知瀏覽器查看編碼為utf-8
response.setHeader("Content-Type","text/html;charset=utf-8");
l 第二種方式:
// 使用通用方法,setContentType底層自動調用了setCharacterEncoding
response.setContentType("text/html;charset=utf-8");
Response.getoutpustream’ ’ 和response.getwtriter
Day36 Request
1.設置編碼方式
在HttpServletRequest接口中,提供了一個setCharacterEncoding()方法,該方法用於設置request對象的解碼方式,接下來,對文件4-14進行修改,修改后的代碼如文件4-15所示。該方法用於返回請求消息的實體部分的字符集編碼
從圖4-22可以看出,控制台輸出的參數信息沒有出現亂碼。需要注意的是,這種解決亂碼的方式只對POST方式有效,而對GET方式無效。為了驗證GET方式的演示效果,接下來,將form.html文件中method屬性的值改為“GET”。重新訪問form.html頁面並填寫中文信息,控制台的打印結果如圖4-23所示。
從圖4-23中可以看出,使用GET方式提交表單,用戶名出現了亂碼,這就驗證了setCharacterEncoding()方法只對POST提交方式有效的結論。為了解決GET方式提交表單時出現的中文亂碼問題,接下來,對文件4-15進行修改,在第10行和第11行代碼之間增加一行代碼,如下所示:
name=new String(name.getBytes("iso8859-1"),"utf-8");
1.1.1 獲得請求行信息(了解)
方法聲明 |
功能描述 |
String getMethod() |
該方法用於獲取HTTP請求消息中的請求方式(如GET、POST等) |
String getRequestURI() |
該方法用於獲取請求行中資源名稱部分,即位於URL的主機和端口之后、參數部分之前的部分 |
String getQueryString() |
該方法用於獲取請求行中的參數部分,也就是資源路徑后面問號(?)以后的所有內容 |
String getProtocol() |
該方法用於獲取請求行中的協議名和版本,例如,HTTP/1.0或HTTP/1.1 |
String getContextPath() |
該方法用於獲取請求URL中屬於WEB應用程序的路徑,這個路徑以“/”開頭,表示相對於整個WEB站點的根目錄,路徑結尾不含“/”。如果請求URL屬於WEB站點的根目錄,那么返回結果為空字符串("") |
String getServletPath() |
該方法用於獲取Servlet的名稱或Servlet所映射的路徑 |
String getRemoteAddr() |
該方法用於獲取請求客戶端的IP地址,其格式類似於“192.168.0.3” |
1.1.2 獲得請求體信息(重點)
在實際開發中,經常需要獲取用戶提交的表單數據,例如,用戶名、密碼、電子郵件等,為了方便獲取表單中的請求參數,在HttpServletRequest接口中,定義了一系列獲取請求參數的方法,如表4-4所示。
表1-1 獲取請求參數的方法
方法聲明 |
功能描述 |
String getParameter(String name) |
該方法用於獲取某個指定名稱的參數值,如果請求消息中沒有包含指定名稱的參數,getParameter()方法返回null;如果指定名稱的參數存在但沒有設置值,則返回一個空串;如果請求消息中包含有多個該指定名稱的參數,getParameter()方法返回第一個出現的參數值 |
String[] getParameterValues(String name) |
HTTP請求消息中可以有多個相同名稱的參數(通常由一個包含有多個同名的字段元素的FORM表單生成),如果要獲得HTTP請求消息中的同一個參數名所對應的所有參數值,那么就應該使用getParameterValues()方法,該方法用於返回一個String類型的數組 |
Enumeration getParameterNames() |
getParameterNames()方法用於返回一個包含請求消息中所有參數名的Enumeration對象,在此基礎上,可以對請求消息中的所有參數進行遍歷處理 |
Map getParameterMap() |
getParameterMap()方法用於將請求消息中的所有參數名和值裝入進一個Map對象中返回 |
1.1.3 通過Request對象傳遞數據
Request對象不僅可以獲取一系列數據,還可以通過屬性傳遞數據。在ServletRequest接口中,定義了一系列操作屬性的方法,具體如下:
l setAttribute()方法 -- 添加共享數據
該方法用於將一個對象與一個名稱關聯后存儲進ServletRequest對象中,其完整語法定義如下:
public void setAttribute(java.lang.String name,java.lang.Object o);
需要注意的是,如果ServletRequest對象中已經存在指定名稱的屬性,setAttribute()方法將會先刪除原來的屬性,然后再添加新的屬性。如果傳遞給setAttribute()方法的屬性值對象為null,則刪除指定名稱的屬性,這時的效果等同於removeAttribute()方法。
l getAttribute()方法 – 獲得共享數據
該方法用於從ServletRequest對象中返回指定名稱的屬性對象,其完整的語法定義如下:
public java.lang.String getAttribute (java.lang.String name);
l removeAttribute()方法 – 移除共享數據
該方法用於從ServletRequest對象中刪除指定名稱的屬性,其完整的語法定義如下:
public void removeAttribute(java.lang.String name);
l getAttributeNames()方法 – 獲得所有屬性名
該方法用於返回一個包含ServletRequest對象中的所有屬性名的Enumeration對象,在此基礎上,可以對ServletRequest對象中的所有屬性進行遍歷處理。getAttributeNames()方法的完整語法定義如下:
public java.util.Enumeration getAttributeNames();
需要注意的是,只有屬於同一個請求中的數據才可以通過ServletRequest對象傳遞數據。關於ServletRequest對象操作屬性的具體用法,將在后面的小節進行詳細講解。在此,大家只需了解即可。
l 獲取RequestDispatcher對象的方法
方法聲明 |
功能描述 |
getRequestDispatcher(String path) |
返回封裝了某個路徑所指定資源的RequestDispatcher對象。其中,參數path必須以 “/”開頭,用於表示當前Web應用的根目錄。需要注意的是,WEB-INF目錄中的內容對RequestDispatcher對象也是可見的,因此,傳遞給getRequestDispatcher(String path)方法的資源可以是WEB-INF目錄中的文件 |
獲取到RequestDispatcher對象后,最重要的工作就是通知其它Web資源處理當前的Servlet請求,為此,在RequestDispatcher接口中,定義了兩個相關方法,如表4-6所示。
l RequestDispatcher接口的方法
方法聲明 |
功能描述 |
forward(ServletRequest request, ServletResponse response) |
該方法用於將請求從一個Servlet傳遞給另外的一個Web資源。在Servlet中,可以對請求做一個初步處理,然后通過調用這個方法,將請求傳遞給其它資源進行響應。需要注意的是,該方法必須在響應提交給客戶端之前被調用,否則將拋出IllegalStateException異常 |
include(ServletRequest request, ServletResponse response) |
該方法用於將其它的資源作為當前響應內容包含進來 |
表4-6列舉的兩個方法中,forward()方法可以實現請求轉發,include()方法可以實現請求包含,關於請求轉發相關知識,將在下面的小節中進行詳細講解。
請求包含:就是將當前頁面和被包含頁面的輸出結果,合並一起響應給瀏覽器。
l 請求轉發和重定向的區別
n 重定向的地址欄會發生變化,轉發的地址欄不變
n 重定向多次請求多次響應,轉發一次請求一次響應.
n 重定向路徑需要加上工程名(項目名),轉發不需要
n 重定向可以跳轉到任意網站, 請求轉發只能訪問當前項目內資源
應用場景:
需要request傳遞數據 例如:查詢 使用轉發
登錄成功的跳轉建議使用重定向,路徑發生變化
需要使用其他網站的時候必須使用重定向
常見GET請求:地址欄直接訪問、<a href=””>、<img src=””> 等