Servlet-request對象

HttpServletRequest和HttpServletResponse

Web服務器收到一個http請求,會針對每個請求創建一個HttpServletRequest和HttpServletResponse對象,向客戶端發送數據找HttpServletResponse,從客戶端取數據找HttpServletRequest.

HTTP 協議是基於請求-響應的協議,客戶端請求一個文件,服務器對該請求進行響應。HTTP 使用 TCP 協議,默認使用 80 端口。最初的
HTTP 協議版本是 HTTP/0.9,後被 HTTP/1.0 替代。目前使用的版本是 HTTP/1.1,在 HTTP
協議中,總是由主動建立連接、發送 HTTP
請求的客戶端來初始化一個事務。服務器不負責連接客戶端,或創建一個到客戶端的回調連接(callback connection)。

HttpServletRequest

公共接口類HttpServletRequest繼承自ServletRequest.客戶端瀏覽器發出的請求被封裝成爲一個HttpServletRequest對象。所有的信息包括請求的地址,請求的參數,提交的數據,上傳的文件客戶端的ip甚至客戶端操作系統都包含在其內。

常用方法

1.獲得客戶機信息

getRequestURL方法返回客戶端發出請求時的完整URL。

getRequestURI方法返回請求行中的資源名部分。

getQueryString 方法返回請求行中的參數部分。

getRemoteAddr方法返回發出請求的客戶機的IP地址

getRemoteHost方法返回發出請求的客戶機的完整主機名

getRemotePort方法返回客戶機所使用的網絡端口號

getLocalAddr方法返回WEB服務器的IP地址。

getLocalName方法返回WEB服務器的主機名

getMethod得到客戶機請求方式

getServerPath()獲取請求的文件的路徑

2.獲得客戶機請求頭

getHeader(string name)方法
getHeaders(String name)方法
getHeaderNames方法

3.獲得客戶機請求參數(客戶端提交的數據)

getParameter(name)方法 獲取請求中的參數,該參數是由name指定的 getParameterValues(String
name)方法 獲取指定名稱參數的所有值數組。它適用於一個參數名對應多個值的情況。如頁面表單中的複選框,多選列表提交的值。

getParameterNames方法
返回一個包含請求消息中的所有參數名的Enumeration對象。通過遍歷這個Enumeration對象,就可以獲取請求消息中所有的參數名。

getCharacterEncoding() 返回請求的字符編碼方式

getAttributeNames()返回當前請求的所有屬性的名字集合賦值:setAttribute()

getAttribute(String name) 返回name指定的屬性值

getsession()返回和客戶端相關的session,如果沒有給客戶端分配session,則返回null

getParameterMap():返回一個保存了請求消息中的所有參數名和值的Map對象。Map對象的key是字符串類型的參數名,value是這個參數所對應的Object類型的值數組

RequestDispatcher.forward
方法的請求轉發過程結束後,瀏覽器地址欄保持初始的URL地址不變。方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行爲。

request.setCharacterEncoding(“utf-8”);

getReader() 獲取請求體的數據流

getInputStream() 獲取請求的輸入流中的數據

通過輸入輸出流獲取 :getInputStream() 和 getReader()

在讀取的時候通過流對象.read()方法讀取

出現亂碼的原因和解決

1.Java程序中默認的是中文字符----unicode

2.系統會把在java程序中的unicode字符按照某種字符集編碼的方式轉換成字節數組,再通過瀏覽器輸出,瀏覽器在輸出的時候要進行解碼,只有在這兩種方式一樣的情況下,纔不會出現亂碼。

注:

(1)某種字符編碼是用reponse對象去設置的,而且必須是在out.println之前使用,要不會出現錯誤,會拋找不到
設置的字符編碼而出錯。

設置編碼的兩種方式:

response.setContentType(“text/html;charset=utf-8”);
request.setCharacterEncoding(“utf-8”);

(2)瀏覽器會把字節數組轉換成字符

系統默認的編碼方式爲ISO8859-1,如果沒有指定字符編碼,則輸出的都是亂碼,而且ISO8859-1不支持中文,所以不管瀏覽器在解碼的時候用的是什麼字符集編碼,在瀏覽器上的都是亂碼。

Post方式提交出現亂碼

請求中之所以會產生亂碼,就是因爲服務器和客戶端溝通的編碼不一致造成的,因此解決的辦法是:在客戶端和服務器之間設置一個統一的編碼,之後就按照此編碼進行數據的傳輸和接收。

解決辦法:由於客戶端是以UTF-8字符編碼將表單數據傳輸到服務器端的,因此服務器也需要設置以UTF-8字符編碼進行接收,要想完成此操作,服務器可以直接使用從ServletRequest接口繼承而來的"setCharacterEncoding(charset)"方法進行統一的編碼設置。使用request.setCharacterEncoding(“UTF-8”);設置服務器以UTF-8的編碼接收數據後,此時就不會產生中文亂碼問題了

request.setCharacterEncoding("UTF-8");

Get方式提交出現亂碼

對於以get方式傳輸的數據,request即使設置了以指定的編碼接收數據也是無效的,默認的還是使用ISO8859-1這個字符編碼來接收數據,客戶端以UTF-8的編碼傳輸數據到服務器端,而服務器端的request對象使用的是ISO8859-1這個字符編碼來接收數據,服務器和客戶端溝通的編碼不一致因此纔會產生中文亂碼的。

解決辦法:在接收到數據後,先獲取request對象以ISO8859-1字符編碼接收到的原始數據的字節數組,然後通過字節數組以指定的編碼構建字符串,解決亂碼問題。

//接收數據 
String name = request.getParameter("name");
//獲取request對象以ISO8859-1字符編碼接收到的原始數據的字節數組,然後通過字節數組以指定的編碼構建字符串,解決亂碼問題 
name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章