Response ServletContext 中文亂碼 Request 編碼 請求行 共享數據 轉發重定向


Day35  Response

1.1.1 ServletContext概念

項目的管理者(上下文對象),服務器啟動時,會為每一個項目創建一個對應的ServletContext對象.

 

 

1.1.2 ServletContext獲取

方式1. getServletConfig().getServletContext()

方式2: request.getServletContext()

方式3: getServletContext()

1.1.3 ServletContext作用  整個web應用有效

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)

用給定名稱和值設置響應頭。如果已經設置了頭,則新值將重寫以前的值。containsHeader 方法可用於測試在設置其值之前頭是否存在

n public void setContentType(String type)

設置將發送到客戶端的響應的內容類型,如果該響應尚未提交。給定內容類型可能包含字符編碼規范,例如 text/html;charset=UTF-8。如果在調用 getWriter 之前調用此方法,則只根據給定內容類型設置響應的字符編碼

作用:處理中文亂碼

方式1:設置頭信息 response.setHeader("content-Type","text/html;charset=UTF-8");

方式2:response.setContentType("text/html;charset=UTF-8")  (常用方法)

響應體

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接口中,定義了一系列操作屬性的方法,具體如下:

setAttribute()方法 -- 添加共享數據

該方法用於將一個對象與一個名稱關聯后存儲進ServletRequest對象中,其完整語法定義如下:

public void setAttribute(java.lang.String name,java.lang.Object o);

需要注意的是,如果ServletRequest對象中已經存在指定名稱的屬性,setAttribute()方法將會先刪除原來的屬性,然后再添加新的屬性。如果傳遞給setAttribute()方法的屬性值對象為null,則刪除指定名稱的屬性,這時的效果等同於removeAttribute()方法。

getAttribute()方法 獲得共享數據

該方法用於從ServletRequest對象中返回指定名稱的屬性對象,其完整的語法定義如下:

public java.lang.String getAttribute (java.lang.String name);

removeAttribute()方法 移除共享數據

該方法用於從ServletRequest對象中刪除指定名稱的屬性,其完整的語法定義如下:

public void removeAttribute(java.lang.String name);

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()方法可以實現請求包含,關於請求轉發相關知識,將在下面的小節中進行詳細講解。

請求包含:就是將當前頁面和被包含頁面的輸出結果,合並一起響應給瀏覽器。

 

請求轉發和重定向的區別

 

 

重定向的地址欄會發生變化,轉發的地址欄不變

重定向多次請求多次響應,轉發一次請求一次響應.

重定向路徑需要加上工程名(項目名),轉發不需要

重定向可以跳轉到任意網站, 請求轉發只能訪問當前項目內資源

 

 

應用場景:

需要request傳遞數據 例如:查詢 使用轉發

登錄成功的跳轉建議使用重定向,路徑發生變化

需要使用其他網站的時候必須使用重定向

 

常見GET請求:地址欄直接訪問、<a href=””><img src=””>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM